Jquery-анимация с вложенным циклом эффектов

У меня есть вложенная функция для отображения / скрытия абзацев в стиле тикера.

Проблема в том, что когда цикл начинается заново (строка 4), эффекты непрозрачности перестают работать правильно, поэтому абзацы появляются внезапно.

Любые мастера jquery знают об этом? Я слишком усложняю?

$('#special-ticker p').hide();
var a=0;
function outer() {
    function inner() {
        if (a===$('#special-ticker p').length) { a = 0; }
        $('#special-ticker p').
        eq(a).
        fadeIn(800, function(){
            $(this).animate({opacity:100},10000,null,function(){
                $(this).hide(800,function(){
                    a++;
                    outer();
                });
            });
        });
    }
    return inner();
}
$(function(){ 
    outer(); 
});

Почему за fadeIn следует .animate ({opacity: 100})? они достигают почти такого же эффекта

Eran Galperin 15.11.2008 04:49

Он используется для задержки следующего действия на 10 секунд вместо использования setTimeout или setInterval.

Kevin Gorski 15.11.2008 21:39
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
4
2
7 509
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

проблема в строке 9:

$(this).animate({opacity:100},10000,null,function(){
//...

непрозрачность должна быть «1» (непрозрачность - значение от 0 до 1)

$(this).animate({ opacity : 1 }, 10000, null, function() {

Метод animate не имеет ничего общего с непрозрачностью. Он используется только как задержка для управления продолжительностью отображения текста перед скрытием.

Jason Moore 16.11.2008 20:21

проблема не в анимации, он устанавливает непрозрачность на 100, что не является допустимым результатом, непрозрачность - это значение от 0 до 1. скопируйте и протестируйте его код как есть, затем измените непрозрачность на 1, как в моем примере, вы ' Вы увидите, что упомянутая им резкая остановка анимации исчезнет.

Owen 17.11.2008 02:28

Попробуй это:


            newsticker = function (selector) {
                $(selector).hide();
                var i = $(selector).length - 1;
                var toggle = function() {
                    $(selector).eq(i).fadeOut("slow", function() {
                        i = ++i % $(selector).length;
                        $(selector).eq(i).fadeIn("slow", function() {
                            setTimeout(toggle, 1000)
                        });

                    });
                };          
                toggle();
            };

и инициализируйте его следующим образом:


            new newsticker("#special-ticker p");

хорошее решение. К OP: если вы действительно хотите сохранить эффект вытеснения, просто измените первый «fadeOut» на «hide».

Jason Moore 16.11.2008 03:30

Решение опубликовано, но есть один комментарий:

Если группа элементов будет немедленно скрыта, быстрее создать «скрытый» класс CSS, а затем назначить его этим элементам. Сохраняет немного кода javascript, но также гарантирует, что скрытые элементы не будут на короткое время мигать на экране.

<style type = "text/css" media = "screen">
.hidden { display: none; }
</style>

<p>Show me</p>
<p class = "big hidden">Use javascript to show me later.</p>

Хорошая точка зрения. Если вы используете эту технику, вам следует подумать об использовании javascript для создания CSS (для постепенной деградации).

willoller 21.11.2008 23:23

Небольшая переработка кода для сохранения многократного создания экземпляров jQuery с одними и теми же селекторами. Я тоже думаю, что это немного легче читать.

var jS = $('#special-ticker p');
// jS.hide(); // not needed if css hides elements initially
var i = 0;

function do_ticker() {
  jS.eq(i).fadeIn(800, function() {
    var me = $(this);     
    setTimeout(function() { me.hide(800, 
      function() { 
        i = ++i % jS.length;
        do_ticker();
      });
    },1000); // setTimeout
  });
};
do_ticker();

Другие вопросы по теме