Мое приложение плохо работает с jQuery slideDown и slideUp. Я хочу использовать эквивалент CSS3 в браузерах, которые его поддерживают.
Возможно ли, используя переходы CSS3, изменить элемент с display: none;
на display: block;
при перемещении элемента вниз или вверх?
Ответы:
Вы можете сделать что-то вроде этого:
#youritem .fade.in { animation-name: fadeIn; } #youritem .fade.out { animation-name: fadeOut; } @keyframes fadeIn { 0% { opacity: 0; transform: translateY(startYposition); } 100% { opacity: 1; transform: translateY(endYposition); } } @keyframes fadeOut { 0% { opacity: 1; transform: translateY(startYposition); } 100% { opacity: 0; transform: translateY(endYposition); } }
Пример - скольжение и затухание:
Это сдвигает и анимирует непрозрачность - не в зависимости от высоты контейнера, а по верхней / координате. Посмотреть пример
Пример - автоматическая высота / без Javascript: вот живой образец, не требующий высоты - имеет дело с автоматической высотой и без javascript.
Посмотреть пример
источник
Я изменил ваше решение, чтобы оно работало во всех современных браузерах:
css фрагмент:
-webkit-transition: height 1s ease-in-out; -moz-transition: height 1s ease-in-out; -ms-transition: height 1s ease-in-out; -o-transition: height 1s ease-in-out; transition: height 1s ease-in-out;
js фрагмент:
var clone = $('#this').clone() .css({'position':'absolute','visibility':'hidden','height':'auto'}) .addClass('slideClone') .appendTo('body'); var newHeight = $(".slideClone").height(); $(".slideClone").remove(); $('#this').css('height',newHeight + 'px');
вот полный пример http://jsfiddle.net/RHPQd/
источник
Итак, я пошел дальше и ответил на свой вопрос :)
Ответ @ True касался преобразования элемента на определенную высоту. Проблема в том, что я не знаю высоты элемента (она может колебаться).
Я нашел другие решения, в которых в качестве перехода использовалась максимальная высота, но это произвело для меня очень резкую анимацию.
Мое решение ниже работает только в браузерах WebKit.
Хотя это не чисто CSS, он включает в себя изменение высоты, которое определяется некоторым JS.
$('#click-me').click(function() { var height = $("#this").height(); if (height > 0) { $('#this').css('height', '0'); } else { $("#this").css({ 'position': 'absolute', 'visibility': 'hidden', 'height': 'auto' }); var newHeight = $("#this").height(); $("#this").css({ 'position': 'static', 'visibility': 'visible', 'height': '0' }); $('#this').css('height', newHeight + 'px'); } });
#this { width: 500px; height: 0; max-height: 9999px; overflow: hidden; background: #BBBBBB; -webkit-transition: height 1s ease-in-out; } #click-me { cursor: pointer; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> <p id="click-me">click me</p> <div id="this">here<br />is<br />a<br />bunch<br />of<br />content<br />sdf</div> <div>always shows</div>
Посмотреть на JSFiddle
источник
почему бы не воспользоваться преимуществами перехода css в современных браузерах и упростить и ускорить работу, используя больше css и меньше jquery
Вот код для скольжения вверх и вниз
Вот код для скольжения слева направо
Точно так же мы можем изменить скольжение сверху вниз или справа налево, изменив transform-origin и transform: scaleX (0) или transform: scaleY (0) соответственно.
источник
Заставить переходы высоты работать может быть немного сложно, в основном потому, что вам нужно знать высоту для анимации. Это дополнительно усложняется заполнением элемента, который нужно анимировать.
Вот что я придумал:
используйте такой стиль:
.slideup, .slidedown { max-height: 0; overflow-y: hidden; -webkit-transition: max-height 0.8s ease-in-out; -moz-transition: max-height 0.8s ease-in-out; -o-transition: max-height 0.8s ease-in-out; transition: max-height 0.8s ease-in-out; } .slidedown { max-height: 60px ; // fixed width }
Оберните ваш контент в другой контейнер, чтобы у контейнера, который вы перемещаете, не было отступов / полей / границ:
<div id="Slider" class="slideup"> <!-- content has to be wrapped so that the padding and margins don't effect the transition's height --> <div id="Actual"> Hello World Text </div> </div>
Затем используйте какой-нибудь сценарий (или декларативную разметку в каркасах привязки) для запуска классов CSS.
$("#Trigger").click(function () { $("#Slider").toggleClass("slidedown slideup"); });
Пример здесь: http://plnkr.co/edit/uhChl94nLhrWCYVhRBUF?p=preview
Это отлично работает для содержимого фиксированного размера. Для более общего решения вы можете использовать код для определения размера элемента при активации перехода. Ниже приводится подключаемый модуль jQuery, который делает именно это:
$.fn.slideUpTransition = function() { return this.each(function() { var $el = $(this); $el.css("max-height", "0"); $el.addClass("height-transition-hidden"); }); }; $.fn.slideDownTransition = function() { return this.each(function() { var $el = $(this); $el.removeClass("height-transition-hidden"); // temporarily make visible to get the size $el.css("max-height", "none"); var height = $el.outerHeight(); // reset to 0 then animate with small delay $el.css("max-height", "0"); setTimeout(function() { $el.css({ "max-height": height }); }, 1); }); };
который может быть запущен следующим образом:
$ ("# Триггер"). Click (function () {
if ($("#SlideWrapper").hasClass("height-transition-hidden")) $("#SlideWrapper").slideDownTransition(); else $("#SlideWrapper").slideUpTransition(); });
против такой разметки:
<style> #Actual { background: silver; color: White; padding: 20px; } .height-transition { -webkit-transition: max-height 0.5s ease-in-out; -moz-transition: max-height 0.5s ease-in-out; -o-transition: max-height 0.5s ease-in-out; transition: max-height 0.5s ease-in-out; overflow-y: hidden; } .height-transition-hidden { max-height: 0; } </style> <div id="SlideWrapper" class="height-transition height-transition-hidden"> <!-- content has to be wrapped so that the padding and margins don't effect the transition's height --> <div id="Actual"> Your actual content to slide down goes here. </div> </div>
Пример: http://plnkr.co/edit/Wpcgjs3FS4ryrhQUAOcU?p=preview
Я недавно написал об этом в блоге, если вас интересуют более подробные сведения:
http://weblog.west-wind.com/posts/2014/Feb/22/Using-CSS-Transitions-to-SlideUp-and-SlideDown
источник
document.getElementById("Slider").classList.toggle("slidedown");
Я бы порекомендовал использовать плагин jQuery Transit, который использует свойство преобразования CSS3, которое отлично работает на мобильных устройствах, поскольку большинство из них поддерживает аппаратное ускорение, чтобы придать такой естественный вид.
Пример скрипта JS
HTML:
<div class="moveMe"> <button class="moveUp">Move Me Up</button> <button class="moveDown">Move Me Down</button> <button class="setUp">Set Me Up</button> <button class="setDown">Set Me Down</button> </div>
Javascript:
$(".moveUp").on("click", function() { $(".moveMe").transition({ y: '-=5' }); }); $(".moveDown").on("click", function() { $(".moveMe").transition({ y: '+=5' }); }); $(".setUp").on("click", function() { $(".moveMe").transition({ y: '0px' }); }); $(".setDown").on("click", function() { $(".moveMe").transition({ y: '200px' }); });
источник
slideUp()
иslideDown()
методы с помощью этого плагина. Было бы здоровоИтак, после некоторых исследований и экспериментов я думаю, что лучший подход - это иметь высоту предмета на уровне
0px
и позволить ей переходить на точную высоту. Вы получите точную высоту с помощью JavaScript. JavaScript не выполняет анимацию, он просто меняет значение высоты. Проверь это:function setInfoHeight() { $(window).on('load resize', function() { $('.info').each(function () { var current = $(this); var closed = $(this).height() == 0; current.show().height('auto').attr('h', current.height() ); current.height(closed ? '0' : current.height()); }); });
Каждый раз, когда страница загружается или изменяется размер, элемент с классом обновляет
info
свойh
атрибут. Затем у вас может быть кнопка, запускающая,style="height: __"
чтобы установить это ранее установленноеh
значение.function moreInformation() { $('.icon-container').click(function() { var info = $(this).closest('.dish-header').next('.info'); // Just the one info var icon = $(this).children('.info-btn'); // Select the logo // Stop any ongoing animation loops. Without this, you could click button 10 // times real fast, and watch an animation of the info showing and closing // for a few seconds after icon.stop(); info.stop(); // Flip icon and hide/show info icon.toggleClass('flip'); // Metnod 1, animation handled by JS // info.slideToggle('slow'); // Method 2, animation handled by CSS, use with setInfoheight function info.toggleClass('active').height(icon.is('.flip') ? info.attr('h') : '0'); }); };
Вот стиль
info
класса..info { display: inline-block; height: 0px; line-height: 1.5em; overflow: hidden; padding: 0 1em; transition: height 0.6s, padding 0.6s; &.active { border-bottom: $thin-line; padding: 1em; } }
Я использовал это в одном из своих проектов, поэтому имена классов специфичны. Вы можете изменить их как хотите.
Стиль может не поддерживаться кросс-браузером. Прекрасно работает в хроме.
Ниже приведен живой пример этого кода. Просто нажмите на
?
значок, чтобы запустить анимациюCodePen
источник
Вариант без JavaScript. Только CSS.
CSS:
.toggle_block { border: 1px solid #ccc; text-align: left; background: #fff; overflow: hidden; } .toggle_block .toggle_flag { display: block; width: 1px; height: 1px; position: absolute; z-index: 0; left: -1000px; } .toggle_block .toggle_key { font-size: 16px; padding: 10px; cursor: pointer; -webkit-transition: all 300ms ease; -moz-transition: all 300ms ease; -ms-transition: all 300ms ease; -o-transition: all 300ms ease; transition: all 300ms ease; } .toggle_block .content { padding: 0 10px; overflow: hidden; max-height: 0; -webkit-transition: all 300ms ease; -moz-transition: all 300ms ease; -ms-transition: all 300ms ease; -o-transition: all 300ms ease; transition: all 300ms ease; } .toggle_block .content .toggle_close { cursor: pointer; font-size: 12px; } .toggle_block .toggle_flag:checked ~ .toggle_key { background: #dfd; } .toggle_block .toggle_flag:checked ~ .content { max-height: 1000px; padding: 10px 10px; }
HTML:
<div class="toggle_block"> <input type="checkbox" id="toggle_1" class="toggle_flag"> <label for="toggle_1" class="toggle_key">clicker</label> <div class="content"> Text 1<br> Text 2<br> <label for="toggle_1" class="toggle_close">close</label> </div> </div>
Для следующего блока измените только атрибуты ID и FOR в html.
источник
вы не можете легко сделать слайд-вверх с помощью css3, поэтому я превратил JensT-скрипт в плагин с резервным и обратным вызовом javascript.
таким образом, если у вас есть современный brwowser, вы можете использовать css3 csstransition. если ваш браузер не поддерживает его, изящно используйте старомодный slideUp slideDown.
/* css */ .csstransitions .mosneslide { -webkit-transition: height .4s ease-in-out; -moz-transition: height .4s ease-in-out; -ms-transition: height .4s ease-in-out; -o-transition: height .4s ease-in-out; transition: height .4s ease-in-out; max-height: 9999px; overflow: hidden; height: 0; }
плагин
(function ($) { $.fn.mosne_slide = function ( options) { // set default option values defaults = { delay: 750, before: function () {}, // before callback after: function () {} // after callback; } // Extend default settings var settings = $.extend({}, defaults, options); return this.each(function () { var $this = $(this); //on after settings.before.apply( $this); var height = $this.height(); var width = $this.width(); if (Modernizr.csstransitions) { // modern browsers if (height > 0) { $this.css( 'height', '0') .addClass( "mosne_hidden" ); } else { var clone = $this.clone() .css({ 'position': 'absolute', 'visibility': 'hidden', 'height': 'auto', 'width': width }) .addClass( 'mosne_slideClone' ) .appendTo( 'body' ); var newHeight = $( ".mosne_slideClone" ) .height(); $( ".mosne_slideClone" ) .remove(); $this.css( 'height', newHeight + 'px') .removeClass( "mosne_hidden" ); } } else { //fallback if ($this.is( ":visible" )) { $this.slideUp() .addClass( "mosne_hidden" ); } else { $this.hide() .slideDown() .removeClass( "mosne_hidden" ); } } //on after setTimeout(function () { settings.after .apply( $this ); }, settings.delay); }); } })(jQuery);;
как это использовать
/* jQuery */ $(".mosneslide").mosne_slide({ delay:400, before:function(){console.log("start");}, after:function(){console.log("done");} });
вы можете найти демонстрационную страницу здесь http://www.mosne.it/playground/mosne_slide_up_down/
источник
try this for slide up slide down with animation give your **height @keyframes slide_up{ from{ min-height: 0; height: 0px; opacity: 0; } to{ height: 560px; opacity: 1; } } @keyframes slide_down{ from{ height: 560px; opacity: 1; } to{ min-height: 0; height: 0px; opacity: 0; } }
источник