jQuery зацикливание .fadeIn и .fadeOut из тегов p внутри div по одному - PullRequest
3 голосов
/ 23 декабря 2011

Приведенный ниже код успешно исчезает в одном отзыве в течение 6 секунд, ждет 3 секунды, а затем исчезает и переходит к следующему. Как только он достигает третьего отзыва, он возвращается к первому. Это именно то, что я хочу, но на моем реальном сайте у меня есть более трех отзывов, и в будущем, возможно, добавлю еще. Я не хочу возвращаться и добавлять новую функцию каждый раз, когда добавляю новый отзыв. Я пытался какое-то время заставить это работать, используя «this» и .next (), но не получилось. Я надеюсь, что кто-то мог бы сделать это намного более эффективным, зациклив его и заставив его перейти к следующему тегу p внутри контейнера, не вызывая новую функцию каждый раз. Спасибо за любую помощь, спасибо.

Примечание: я знаю, что есть похожие вопросы, но ни один из них не был совершенно одинаковым, и ответы были подпунктом.

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<style>
#tml-container p { display: none; }
</style>
</head>
<body>

<div id="tml-container">
    <p id="one">Testimonial 1</p>
    <p id="two">Testimonial 2</p>
    <p id="three">Testimonial 3</p>
</div>

<script>
$(document).ready(function() {
    function doFade() {
        $("#one").fadeIn(6000,function() {
            $("#one").fadeOut(6000).delay(3000);
            setTimeout(fadeTwo,6000);
        });
    }

    function fadeTwo() {
        $("#two").fadeIn(6000,function() {
            $("#two").fadeOut(6000).delay(3000);
            setTimeout(fadeThree,6000);
        });
    }

    function fadeThree() {
        $("#three").fadeIn(4000,function() {
            $("#three").fadeOut(6000).delay(3000);
            setTimeout(doFade,6000);
        });
    }
    doFade();
});
</script>

</body>
</html>

Ответы [ 2 ]

15 голосов
/ 23 декабря 2011

Это очень простое решение:

function fade($ele) {
    $ele.fadeIn(6000).delay(3000).fadeOut(6000, function() {
        var $next = $(this).next('p');
        // if there is a following `p` element, it is faded in
        // otherwise start from the beginning by taking
        // the parent's first child
        fade($next.length > 0 ? $next : $(this).parent().children().first());
   });
};  

fade($('#tml-container > p').first());

DEMO


Версия многоразового плагина:

Вместо перебора дочерних элементов определенного элемента он перебирает выбранные элементы.

(function($) {
    var default_config = {
        fadeIn: 3000,
        stay: 3000,
        fadeOut: 3000
    };

    function fade(index, $elements, config) {
        $elements.eq(index)
          .fadeIn(config.fadeIn)
          .delay(config.stay)
          .fadeOut(config.fadeOut, function() {
              fade((index + 1) % $elements.length, $elements, config);
          });
    }

    $.fn.fadeLoop = function(config) {     
        fade(0, this, $.extend({}, default_config, config));
        return this;
    };

}(jQuery));

Используется как:

$('#tml-container > p').fadeLoop({fadeIn: 6000, stay: 3000, fadeOut: 6000});

DEMO

0 голосов
/ 23 декабря 2011

Изменил саморазвитый плагин в соответствии с вашими требованиями, но не полностью его протестировал.

Должен хотя бы показать вам, как правильно настроить что-то подобное.

Надеюсь, это поможет:)

(function($){
    $(function(){
        $('#tml-container').testimonialFader();
    });

    $.fn.testimonialFader = function(){
        return this.each(function(){
            var $par = $(this),
            $testimonials = $par.children('p'),
            $current = $testimonials.first();

            $testimonials.not(':first').hide();

            $testimonials.on('testimonialReady.testimonialFader', wait);
            $testimonials.on('waitComplete.testimonialFader', showNext);

            $current.trigger('testimonialReady.testimonialFader');

            function wait(e){
                $current.trigger('waitStart.testimonialFader');
                setTimeout(
                    function(){
                            $current.trigger('waitComplete.testimonialFader');
                        },
                        6000
                );
            }
            function showNext(){
                $current.trigger('testimonialChange.testimonialFader');
                if($testimonials.length > 1){
                    var $next = $current.next();
                    if($next.length == 0){
                        $next = $testimonials.first();
                    }
                    $current.fadeOut(800);
                    $next.fadeIn(800, 
                        function(){
                            $next.trigger('testimonialReady.testimonialFader');
                        }
                    );
                    $current = $next;
                }
            }

        });
    };
}(jQuery));
...