Meu aplicativo está funcionando mal com slideDown e slideUp do jQuery. Estou tentando usar um equivalente CSS3 em navegadores que o suportam.
É possível, usando transições CSS3, alterar um elemento de display: none;
para display: block;
enquanto desliza o item para baixo ou para cima?
Respostas:
Você poderia fazer algo assim:
#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); } }
Exemplo - Slide e Fade:
Isso desliza e anima a opacidade - não com base na altura do contêiner, mas na parte superior / coordenada. Veja o exemplo
Exemplo - Auto-height / No Javascript: Aqui está uma amostra ao vivo, sem necessidade de altura - lidando com altura automática e sem javascript.
Veja o exemplo
fonte
Mudei sua solução para que funcione em todos os navegadores modernos:
snippet 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;
snippet 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');
aqui está o exemplo completo http://jsfiddle.net/RHPQd/
fonte
Então fui em frente e respondi minha própria pergunta :)
A resposta de @ True dizia respeito à transformação de um elemento em uma altura específica. O problema com isso é que não sei a altura do elemento (pode flutuar).
Eu encontrei outras soluções em torno das quais usava a altura máxima como transição, mas isso produziu uma animação muito irregular para mim.
Minha solução abaixo funciona apenas em navegadores WebKit.
Embora não seja puramente CSS, envolve a transição da altura, que é determinada por alguns 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>
Ver no JSFiddle
fonte
por que não tirar proveito da transição css dos navegadores modernos e tornar as coisas mais simples e rápidas usando mais css e menos jquery
Aqui está o código para deslizar para cima e para baixo
Aqui está o código para deslizar da esquerda para a direita
Da mesma forma, podemos alterar o deslizamento de cima para baixo ou da direita para a esquerda alterando a origem da transformação e transform: scaleX (0) ou transform: scaleY (0) de forma adequada.
fonte
Fazer as transições de altura funcionarem pode ser um pouco complicado, principalmente porque você precisa saber a altura para a qual animar. Isso é ainda mais complicado pelo preenchimento do elemento a ser animado.
Aqui está o que eu descobri:
use um estilo como este:
.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 }
Envolva seu conteúdo em outro contêiner para que o contêiner que você está deslizando não tenha preenchimento / margens / bordas:
<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>
Em seguida, use algum script (ou marcação declarativa em estruturas de ligação) para acionar as classes CSS.
$("#Trigger").click(function () { $("#Slider").toggleClass("slidedown slideup"); });
Exemplo aqui: http://plnkr.co/edit/uhChl94nLhrWCYVhRBUF?p=preview
Isso funciona bem para conteúdo de tamanho fixo. Para uma solução mais genérica, você pode usar o código para descobrir o tamanho do elemento quando a transição é ativada. O seguinte é um plug-in jQuery que faz exatamente isso:
$.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); }); };
que pode ser acionado assim:
$ ("# Trigger"). Click (function () {
if ($("#SlideWrapper").hasClass("height-transition-hidden")) $("#SlideWrapper").slideDownTransition(); else $("#SlideWrapper").slideUpTransition(); });
contra marcação como esta:
<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>
Exemplo: http://plnkr.co/edit/Wpcgjs3FS4ryrhQUAOcU?p=preview
Escrevi isso recentemente em um post de blog se você estiver interessado em mais detalhes:
http://weblog.west-wind.com/posts/2014/Feb/22/Using-CSS-Transitions-to-SlideUp-and-SlideDown
fonte
document.getElementById("Slider").classList.toggle("slidedown");
Eu recomendaria usar o plugin jQuery Transit que usa a propriedade transform CSS3, que funciona muito bem em dispositivos móveis devido ao fato de que a maioria suporta aceleração de hardware para dar aquela aparência nativa.
Exemplo JS Fiddle
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' }); });
fonte
slideUp()
eslideDown()
com este plugin. Isso seria muito bomAight fam, depois de algumas pesquisas e experimentos, acho que a melhor abordagem é colocar a coisa na altura
0px
e deixá-la mudar para uma altura exata. Você obtém a altura exata com JavaScript. O JavaScript não está fazendo a animação, está apenas alterando o valor da altura. Verifique-o: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()); }); });
Sempre que a página for carregada ou redimensionada, o elemento com classe
info
terá seuh
atributo atualizado. Em seguida, você pode fazer com que um botão acione ostyle="height: __"
para defini-lo com oh
valor definido anteriormente .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'); }); };
Aqui está o estilo da
info
classe..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; } }
Usei isso em um dos meus projetos, então os nomes das classes são específicos. Você pode alterá-los como quiser.
O estilo pode não ser compatível com navegadores diferentes. Funciona bem em cromo.
Abaixo está o exemplo ao vivo para este código. Basta clicar no
?
ícone para iniciar a animaçãoCodePen
fonte
Variante sem JavaScript. Apenas 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>
Para o próximo bloco, apenas altere os atributos ID e FOR em html.
fonte
você não pode fazer um slideup deslizar facilmente com css3 é por isso que transformei o script JensT em um plug-in com javascript fallback e callback.
desta forma, se você tiver um navegador moderno, poderá usar a csstransition css3. se o seu navegador não o suportar, use o antiquado 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; }
o plugin
(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);;
como usá-lo
/* jQuery */ $(".mosneslide").mosne_slide({ delay:400, before:function(){console.log("start");}, after:function(){console.log("done");} });
você pode encontrar uma página de demonstração aqui http://www.mosne.it/playground/mosne_slide_up_down/
fonte
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; } }
fonte