Как скользить и исчезать div с помощью jQuery?

Я просмотрел это и это, но это не помогло.
У меня есть лента новостей. список с фиксированной высотой имеет элементы, которые идут вверх и добавляются в конец списка.

ИЗМЕНЕНО: ЗА РАЗ ПОКАЗЫВАЕТСЯ ТОЛЬКО ОДИН ПУНКТ, и когда первый элемент скользит вверх и исчезает, следующий скользит вверх и исчезает

<ul id="ticker">
    <li>
        Sample note 1
    </li>
    <li>
        Sample note 2
    </li>
    <li>
        Sample note 3
    </li>
</ul>  

Это код javascript:

function tick(){
    $('#ticker li:first').slideUP( function () { $(this).appendTo($('#ticker')).slideDown(); });
}
setInterval(function(){ tick () }, 2000);  

Я хочу настроить его так, чтобы он не только скользил вверх, но также исчезал, а внизу плавно исчезал с эффектом скольжения.
Я знаю, что должен использовать эффект анимации. Я пробовал это так много раз, но ни один из них не работал. пожалуйста, помогите мне в этом.
спасибо!


person Pedar Jepeto    schedule 01.01.2013    source источник
comment
Спасибо. Я сделаю все возможное, хотя я новичок   -  person Pedar Jepeto    schedule 01.01.2013
comment
Проверьте этот вопрос для получения более подробной информации о вашей проблеме: stackoverflow.com/questions/5524612/   -  person Ravi Y    schedule 01.01.2013
comment
возможный дубликат jQuery: FadeOut, затем SlideUp   -  person Frank van Puffelen    schedule 01.01.2013


Ответы (3)


Попробуйте мое решение на странице http://jsfiddle.net/zLe2B/19/.

HTML:

<ul id="ticker">
    <li>
        <span>Sample note 1</span>
    </li>
    <li>
        <span>Sample note 2</span>
    </li>
    <li>
        <span>Sample note 3</span>
    </li>
</ul> 

JavaScript:

    $(document).ready(function(){
    function tick(timeout){
        var first = $('#ticker li:first');
        var next = first.next();

        first.children('span').fadeOut(timeout);
        first.slideUp(timeout, function () {      
             first.appendTo($('#ticker'));                
        });

        next.slideDown(timeout);
        next.children('span').hide().fadeIn(timeout);
    }
    setInterval(function(){tick(1000)}, 2000);
});​

CSS:

ul, li, span {
    display: block
}

#ticker li {
    height: 20px;
}

#ticker {
    height: 20px;
    overflow: hidden;
}
person phnkha    schedule 01.01.2013
comment
Спасибо. но это не совсем то что нужно. должен быть показан только один элемент, и первый элемент должен исчезать с помощью слайда, а следующий элемент должен исчезать с помощью слайда. - person Pedar Jepeto; 01.01.2013
comment
Спасибо. это так близко к тому, что я хотел, и решил долгий путь моей проблемы. - person Pedar Jepeto; 01.01.2013

Простой подход:

function ticker(el, duration) {
    if (!el) {
        return false;
    }
    else {
        el = typeof el === 'object' ? el : $(el);
        duration = duration || 500;
        $(el).find('li').first().slideUp(duration, function() {
            $(this)
                .insertAfter($(this).nextAll('li').last())
                .fadeIn(duration, function(){
                    ticker(el, duration);
                });
        });
    }
}

Вы можете вызвать это с помощью объекта jQuery:

ticker($('#ticker'));​​​​​

демонстрация JS Fiddle.

Или используя простой узел DOM с указанной продолжительностью (в миллисекундах):

ticker(document.getElementById('ticker'), 300);​​​​​​​​​

демонстрация JS Fiddle.

В ответ на комментарий, оставленный ОП (в комментариях ниже):

Это решение скользит вверх по первому элементу и исчезает в последнем. но я хочу, чтобы исчезло + слайд как для первого, так и для следующего элемента. список оформлен таким образом, что за раз отображается только один элемент.

Я предлагаю это, используя animate() для анимации высоты/непрозрачности элементов списка:

function ticker(el, duration) {
    if (!el) {
        return false;
    }
    else {
        el = typeof el === 'object' ? el : $(el);
        duration = duration || 500;
        var first = el.find('li').first(),
            last = first.nextAll().last(),
            h = last.height();
        first.animate({
            height: 0,
            opacity: 0
        }, duration, function() {
            $(this).insertAfter(last).animate({
                height: h,
                opacity: 1
            }, duration, function() {
                ticker(el, duration);
            });
        });
    }
}

демонстрация JS Fiddle.

Отредактировано после пояснений ОП на следующее:

function ticker(el, duration) {
    if (!el) {
        return false;
    }
    else {
        el = typeof el === 'object' ? el : $(el);
        duration = duration || 500;
        var lis = el.find('li').css('display', 'none');

        lis.first().fadeIn(duration, function(){
            $(this).slideUp(duration, function(){
                $(this).insertAfter(lis.last());
                ticker(el, duration);
            });
        });
    }
}

демонстрация JS Fiddle.

Использованная литература:

person David says reinstate Monica    schedule 01.01.2013
comment
это умное решение +1 - person defau1t; 01.01.2013
comment
кажется, что первый элемент не исчезает, он просто скользит вверх - person phnkha; 01.01.2013
comment
Большое спасибо, но у него нет эффекта затухания с помощью слайда для первого элемента списка. он просто имеет только слайд-ап - person Pedar Jepeto; 01.01.2013
comment
Это решение скользит вверх по первому элементу и исчезает в последнем. но я хочу, чтобы исчезло + слайд как для первого, так и для следующего элемента. список оформлен таким образом, что за раз отображается только один элемент. - person Pedar Jepeto; 01.01.2013
comment
@ namkha87 спасибо, но я не совсем это имел в виду. пожалуйста, прочитайте мой комментарий к вашему решению - person Pedar Jepeto; 01.01.2013
comment
@Pedar: вы хотите, чтобы каждый раз отображался один элемент? Который затем исчезает, а следующий элемент исчезает? (Я немного медлительный, этим утром...) - person David says reinstate Monica; 01.01.2013
comment
да. это тикер, который показывает только один элемент (один заголовок новости) за раз. первый элемент должен подняться и исчезнуть, а следующий элемент должен появиться с эффектом постепенного появления. - person Pedar Jepeto; 01.01.2013

Я рекомендую это решение:

html:

<div class="ticker-1">
<div class="ticker-inner-1">
<p class="ticker-text-1 active"><b>Newsletter:</b> 1/4</p>
<p class="ticker-text-1"><b>Newsletter:</b> 2/4</p>
<p class="ticker-text-1"><b>Newsletter:</b> 3/4</p>
<p class="ticker-text-1"><b>Newsletter:</b> 4/5</p>
</div>
</div>

<div class="ticker-2">
<div class="ticker-inner-2">
<p class="ticker-text-2">"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
<p class="ticker-text-2">Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="ticker-text-2">Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
<p class="ticker-text-2">Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>

javascript:

$(document).ready(function(){
$.newsLetter = function(){
    $('.ticker-inner-1 p').hide();
    $('.ticker-inner-2 p').hide();
    $('.ticker-inner-1 p:first-child').show();
    $('.ticker-inner-2 p:first-child').show();
    var tickerOne = $('.ticker-1'),
        tickerTwo = $('.ticker-2'),
        innerOne  = tickerOne.find('.ticker-inner-1'),
        innerTwo  = tickerTwo.find('.ticker-inner-2'),
        heightOne = tickerOne.height(),
        heightTwo = tickerTwo.height(),
        speedAll  = 6000;
    setInterval(function(){
        innerOne.animate({'top' : '-='+heightOne}, speedAll, function(){
            $(this).find('p').first().appendTo(innerOne).hide();
            $(this).find('p').first().show();
            innerOne.css('top', 0);
        });
        innerTwo.animate({'top' : '-='+heightTwo}, speedAll, function(){
            $(this).find('p').first().appendTo(innerTwo).hide();
            $(this).find('p').first().fadeIn("slow").show();
            innerTwo.css('top', 0);
        });
    },
        speedAll
    );
}
});

CSS:

div.ticker-1 {
    width: 100%;
}

p.ticker-text-1 {
    font-family: 'Arial';
    font-size: 13px;
    line-height: 2;
    text-align: left;
}

div.ticker-2 {
    width: 100%;
    padding: 10px 0 10px 0;
    border-bottom: 1px dashed #bfbdbe;
    border-top: 1px dashed #bfbdbe;
}

p.ticker-text-2 {
    font-family: 'Arial';
    font-size: 13px;
    line-height: 2;
    text-align: justify;
}
person messin    schedule 15.07.2020