Eu tenho um elemento DOM com alguns / todos os seguintes efeitos aplicados:
#elem {
-webkit-transition: height 0.4s ease;
-moz-transition: height 0.4s ease;
-o-transition: height 0.4s ease;
transition: height 0.4s ease;
}
Estou escrevendo um plugin jQuery que está redimensionando esse elemento. Preciso desativar esses efeitos temporariamente para poder redimensioná-lo sem problemas.
Qual é a maneira mais elegante de desativar temporariamente esses efeitos (e depois reativá-los), dado que eles podem ser aplicados pelos pais ou podem nem ser aplicados.
javascript
jquery
css
Sam Saffron
fonte
fonte
.notransition
classe. Seria mais razoável fazer o contrário, ou seja, direcionar#elem.yestransition
com seu css e remover esta classe. Isso remove ter*
s desagradáveis em seu css.Respostas:
Resposta curta
Use este CSS:
Além disso, este JS (sem jQuery) ...
Ou esse JS com jQuery ...
... ou código equivalente usando qualquer outra biblioteca ou estrutura com a qual você esteja trabalhando.
Explicação
Este é realmente um problema bastante sutil.
Primeiro, você provavelmente deseja criar uma classe 'notransition' que possa ser aplicada aos elementos para definir seus
*-transition
atributos CSSnone
. Por exemplo:(Minor lado - nota a falta de um
-ms-transition
. Lá você não precisa dele A primeira versão do Internet Explorer para transições de apoio. Em tudo foi IE 10, que os apoiaram unprefixed.)Mas isso é apenas estilo e é fácil. Quando você tentar usar essa classe, encontrará uma armadilha. A armadilha é que um código como este não funcionará da maneira que você poderia esperar ingenuamente:
Ingenuamente, você pode pensar que a mudança na altura não será animada, porque acontece enquanto a classe 'notransition' é aplicada. Na realidade, porém, será animado, pelo menos em todos os navegadores modernos que tentei. O problema é que o navegador está armazenando em cache as alterações de estilo que ele precisa fazer até que o JavaScript termine de executar e, em seguida, fazendo todas as alterações em um único reflow. Como resultado, ele faz um reflow em que não há alteração líquida para se as transições estão ou não ativadas, mas há uma alteração líquida na altura. Consequentemente, anima a mudança de altura.
Você pode pensar que uma maneira razoável e limpa de contornar isso seria envolver a remoção da classe 'notransition' em um tempo limite de 1 ms, assim:
mas isso também não funciona de maneira confiável. Não consegui quebrar o código acima nos navegadores WebKit, mas no Firefox (em máquinas lentas e rápidas) às vezes você (aparentemente aleatoriamente) obtém o mesmo comportamento que usa a abordagem ingênua. Acho que o motivo disso é que é possível que a execução do JavaScript seja lenta o suficiente para que a função timeout esteja aguardando para ser executada no momento em que o navegador estiver ocioso e, caso contrário, estaria pensando em fazer um reflow oportunista e, se esse cenário acontecer, O Firefox executa a função na fila antes do reflow.
A única solução que encontrei para o problema é forçar um reflow do elemento, liberando as alterações de CSS feitas nele antes de remover a classe 'notransition'. Existem várias maneiras de fazer isso - veja aqui algumas. O mais próximo que existe de uma maneira "padrão" de fazer isso é ler a
offsetHeight
propriedade do elemento.Uma solução que realmente funciona, então, é
Aqui está um violino de JS que ilustra as três abordagens possíveis que descrevi aqui (a abordagem bem-sucedida e as duas sem êxito): http://jsfiddle.net/2uVAA/131/
fonte
Eu recomendaria desativar a animação, conforme sugerido por DaneSoul, mas tornando a mudança global:
.notransition
pode ser aplicado aobody
elemento, substituindo efetivamente qualquer animação de transição na página:fonte
Adicione uma classe CSS adicional que bloqueie a transição e remova-a para retornar ao estado anterior. Isso torna o código CSS e JQuery curto, simples e bem compreensível.
CSS :
!important
foi adicionado para garantir que essa regra tenha mais "peso", porque o ID normalmente é mais específico que a classe.JQuery :
fonte
Para uma solução JS pura (sem classes CSS), basta definir
transition
como'none'
. Para restaurar a transição conforme especificado no CSS, definatransition
como uma sequência vazia.Se você estiver usando prefixos de fornecedores, precisará defini-los também.
fonte
Você pode desativar a animação, a transição e as transformações para todos os elementos da página com este código css
fonte
Eu acho que você poderia criar uma classe css separada que você pode usar nesses casos:
Em jQuery, você alternaria a classe da seguinte maneira:
fonte
Se você deseja uma solução simples sem jquery para impedir todas as transições:
fonte
Se você deseja remover transições, transformações e animações de CSS da página atual, basta executar este pequeno script que escrevi (no console do seu navegador):
Ele usa o vanillaJS para carregar esse arquivo css . Aqui também está um repositório do github, caso você queira usá-lo no contexto de um raspador (Ruby-Selenium): remove-CSS-animations-repo
fonte
faz
em seus js matá-lo?
obviamente repita para cada um.
fonte
Eu teria uma classe no seu CSS assim:
e depois no seu jQuery:
fonte
#elem.no-transition
em seu CSS, apenas segmentou.no-transition
. Talvez você quisesse escrever#elem.no-transition
no seu CSS?