Как скользить вниз по div, а затем .fadeIn() по содержимому и наоборот?

Цель

Когда пользователь нажимает кнопку, рассматриваемый div будет:

  1. скользить вниз
  2. останавливаться
  3. растворяться в содержании

Когда пользователь снова нажмет кнопку, div:

  1. исчезать
  2. останавливаться
  3. скользить вверх

Текущая позиция

Вот пример, когда fadeIn и fadeOut происходят в нужное время, но нет эффекта слайда до и после постепенного появления и исчезновения соответственно.
http://jsfiddle.net/tkRGU/1/

Также есть этот вариант, который имеет функцию slideToggle, но не имеет fadeIn и fadeOut, происходящих после и перед слайдом соответственно.
http://jsfiddle.net/MY8DD/7/


person Classer    schedule 08.02.2011    source источник
comment
если пользователи не видят div, когда он скользит вниз, зачем ему вообще скользить вниз? Почему бы просто не затухать и исчезать? Сдвигает ли он другое содержимое страницы вверх/вниз?   -  person jacobangel    schedule 08.02.2011
comment
jacobangel правильно, он перемещает другое содержимое страницы вверх и вниз   -  person Classer    schedule 08.02.2011


Ответы (5)


Это будет работать:

HTML:

<a href="#" onclick="toggleSlider();">toggle</a>
<div id="panelThatSlides" style="display:none;background:#eee;padding:10px;">
    <div id="contentThatFades" style="opacity:0;filter:alpha(opacity=0);">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ut tortor  erat, et consectetur nisl. Nunc non placerat odio. Cras feugiat  pulvinar diam sed sollicitudin. Quisque ut elit lacus, et gravida nunc.  Maecenas ac enim ligula. Aenean felis nunc, vulputate pellentesque  vehicula nec, tristique a tortor. Curabitur et semper dui. Sed id nisl  turpis. Sed vel nunc et nisi laoreet feugiat. Sed lobortis enim sed arcu  tempor vehicula. Vivamus dui ligula, ultricies id egestas ut, rhoncus  et est. Pellentesque dignissim diam vel nibh tempus condimentum. Etiam  sodales fermentum pharetra. Etiam faucibus tempus malesuada. Mauris  nulla lectus, laoreet sit amet cursus vel, ultricies at enim. Sed  facilisis rutrum eros, nec malesuada eros iaculis ac.
        <br /><br />
        In consectetur faucibus fermentum. Pellentesque habitant morbi tristique  senectus et netus et malesuada fames ac turpis egestas. Cras nunc  magna, vestibulum eget pulvinar hendrerit, tincidunt id arcu. Nullam  dolor ligula, suscipit placerat condimentum ac, feugiat ut mauris.  Suspendisse semper dolor condimentum dui ornare rhoncus. In bibendum  massa vel erat tristique congue. Donec vel mi quam, ac iaculis odio.  Nulla interdum orci quis ligula aliquam viverra. Nam eget egestas  mauris. Sed in massa quis erat venenatis aliquam.
    </div>
</div>

JavaScript:

function toggleSlider() {
    if ($("#panelThatSlides").is(":visible")) {
        $("#contentThatFades").animate(
            {
                opacity: "0"
            },
            600,
            function(){
                $("#panelThatSlides").slideUp();
            }
        );
    }
    else {
        $("#panelThatSlides").slideDown(600, function(){
            $("#contentThatFades").animate(
                {
                    opacity: "1"
                },
                600
            );
        });
    }   
}

Рабочий пример на JS Fiddle.

Для IE просто убедитесь, что за содержимым для ясного типа есть фоновый цвет.

person Solid Source    schedule 09.02.2011
comment
Я попробовал этот скрипт с триггерами onmouseover и onmouseout, но он не работает должным образом. Иногда div появляется и исчезает сразу после срабатывания onmouseover. Затем переключение начинает давать сбой, div исчезает при срабатывании onmouseout и т. д. Могу ли я получить ваши предложения? - person Sencer H.; 19.08.2013

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

Если вы знаете высоту элемента перед его запуском, то вы можете установить все довольно легко. Вот очень грубый пример: http://jsfiddle.net/tArQu/

person jacobangel    schedule 08.02.2011
comment
jacobangel, извините, я должен был быть более ясным в своей цели. Я обновил свой вопрос, чтобы дать более четкое объяснение моей цели, но вкратце: при нажатии кнопки сначала происходит слайд, после завершения слайда происходит остановка, затем происходит исчезновение контента. - person Classer; 09.02.2011
comment
Вы знаете высоту ящика? Если вы это сделаете, просто оберните содержимое другим div. Сначала разверните div, а затем добавьте обернутое содержимое. Если вы не знаете, лучшее, что вы можете сделать, это догадаться следующим образом: jsfiddle.net/MY8DD/35 - person jacobangel; 09.02.2011

$("#button").toggle(function(){
    $("#content").slideDown().fadeIn();
    }, function(){
    $("#content").slideUp().fadeOut();
    return false;
});    

Это то, что вам нужно?

person benhowdle89    schedule 08.02.2011
comment
Разве дополнительное затухание/затухание ничего не даст, поскольку слайды вниз/вверх уже показывают/скрывают содержимое? - person jacobangel; 08.02.2011
comment
jacobangel прав, это не работает. это эквивалентно использованию .slideToggle(). .fadeIn() и .fadeOut() ничего не делают :( - person Classer; 08.02.2011

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

Видимость CSS «скрытая» позволяет содержимому занимать то место в документе, которое оно обычно занимает, но быть скрытым от просмотра; Отображение CSS «нет» не просто скрывает элемент, но и удаляет его из потока документов. Скрыв элемент с помощью видимости, мы можем сдвинуть его вниз до полной высоты, в то время как содержимое элемента останется невидимым.

Точно так же исчезновение содержимого при использовании функции jQuery fadeIn предполагает, что элемент изначально скрыт с отображением «none», поэтому это не будет работать, если мы используем видимость. Вместо этого мы делаем элемент изначально полностью прозрачным (непрозрачность 0,0); как только скользящая анимация завершена, мы устанавливаем видимость на «видимую», а затем анимируем непрозрачность от полностью прозрачной до полностью непрозрачной (от 0,0 до 1,0).

Предполагая, что элемент изначально скрыт (отображение CSS "none" или функция скрытия jQuery):

$(element).css("visibility", "hidden").slideDown("slow", function() {
    $(this).css("opacity", 0.0).css("visibility", "visible").animate({
        "opacity": 1.0
    }, "slow");
});

N.B.: Будьте особенно осторожны при вводе слов «visibility» и «visible», так как в них легко ошибиться, что является источником множества неприятных ошибок.

Вам НЕ ОБЯЗАТЕЛЬНО использовать видимость, так как вы можете добиться того же, сделав контент изначально прозрачным, но используя его, вы сделаете более явным то, что происходит. То есть это тоже работает:

$(element).css("opacity", 0.0).slideDown("slow", function() {
    $(this).animate({
        "opacity": 1.0
    }, "slow");
});
person Ben    schedule 05.06.2012

Попробуйте: http://jsfiddle.net/solidsource/67XZX/

person Solid Source    schedule 08.02.2011
comment
эй, это выглядит довольно хорошо, но как еще я могу вызвать эту функцию, кроме использования тега ‹a›? Я думаю о чем-то больше похожем на $('button').click(function(slideToggler)) но я уверен, что ошибся. - person Classer; 08.02.2011
comment
на самом деле это не работает, он просто сдвигает 20 пикселей отступа, фактический контент просто внезапно появляется - person Classer; 08.02.2011