Tengo un elemento DOM con algunos / todos los siguientes efectos 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;
}
Estoy escribiendo un complemento jQuery que cambia el tamaño de este elemento, necesito deshabilitar estos efectos temporalmente para poder cambiar el tamaño sin problemas.
¿Cuál es la forma más elegante de deshabilitar estos efectos temporalmente (y luego volver a habilitarlos), dado que pueden aplicarse de los padres o no aplicarse en absoluto?
javascript
jquery
css
Sam Azafrán
fuente
fuente
.notransition
clase. Sería más razonable hacerlo al revés, es decir, apunte#elem.yestransition
con su CSS y elimine esta clase. Eso elimina tener*
s desagradables en su CSS.Respuestas:
Respuesta corta
Usa este CSS:
Además, este JS (sin jQuery) ...
O este JS con jQuery ...
... o código equivalente usando cualquier otra biblioteca o marco con el que esté trabajando.
Explicación
Este es realmente un problema bastante sutil.
En primer lugar, probablemente desee crear una clase de 'notransición' que pueda aplicar a los elementos para establecer sus
*-transition
atributos CSSnone
. Por ejemplo:(Menor a un lado - nota la falta de una
-ms-transition
. Allí Usted no lo necesita La primera versión de Internet Explorer para las transiciones de apoyo. En absoluto era IE 10, que apoyaron ellas sin prefijo.)Pero eso es solo estilo, y es la parte fácil. Cuando trates de usar esta clase, te encontrarás con una trampa. La trampa es que un código como este no funcionará de la manera ingenuamente esperada:
Ingenuamente, puede pensar que el cambio de altura no se animará, porque ocurre mientras se aplica la clase 'notransition'. En realidad, sin embargo, será animado, al menos en todos los navegadores modernos que he probado. El problema es que el navegador está almacenando en caché los cambios de estilo que necesita hacer hasta que JavaScript haya terminado de ejecutarse, y luego está haciendo todos los cambios en un solo reflujo. Como resultado, realiza un reflujo donde no hay un cambio neto en si las transiciones están habilitadas o no, pero hay un cambio neto en la altura. En consecuencia, anima el cambio de altura.
Puede pensar que una forma razonable y limpia de evitar esto sería envolver la eliminación de la clase 'notransition' en un tiempo de espera de 1 ms, como este:
pero esto tampoco funciona de manera confiable. No pude hacer el salto de código anterior en los navegadores WebKit, pero en Firefox (tanto en máquinas lentas como rápidas) a veces (aparentemente al azar) obtendrás el mismo comportamiento que usar el enfoque ingenuo. Supongo que la razón de esto es que es posible que la ejecución de JavaScript sea lo suficientemente lenta como para que la función de tiempo de espera esté esperando para cuando el navegador esté inactivo y de lo contrario estaría pensando en hacer un reflujo oportunista, y si ese escenario sucede, Firefox ejecuta la función en cola antes del reflujo.
La única solución que he encontrado para el problema es forzar un reflujo del elemento, eliminando los cambios de CSS realizados antes de eliminar la clase 'notransition'. Hay varias formas de hacer esto; vea aquí algunas. Lo más parecido a una forma 'estándar' de hacerlo es leer la
offsetHeight
propiedad del elemento.Una solución que realmente funciona, entonces, es
Aquí hay un violín JS que ilustra los tres enfoques posibles que he descrito aquí (tanto el enfoque exitoso como los dos fallidos): http://jsfiddle.net/2uVAA/131/
fuente
Yo recomendaría deshabilitar la animación como sugiere DaneSoul, pero haciendo que el cambio sea global:
.notransition
luego se puede aplicar albody
elemento, anulando efectivamente cualquier animación de transición en la página:fuente
Agregue una clase CSS adicional que bloquee la transición y luego retírela para volver al estado anterior. Esto hace que los códigos CSS y JQuery sean cortos, simples y bien entendibles.
CSS :
!important
se agregó para asegurarse de que esta regla tendrá más "peso", ya que la ID normalmente es más específica que la clase.JQuery :
fuente
Para una solución JS puro (no hay clases CSS), acaba de establecer la
transition
a'none'
. Para restaurar la transición como se especifica en el CSS, establezca eltransition
en una cadena vacía.Si usa prefijos de proveedor, también deberá establecerlos.
fuente
Puede deshabilitar la animación, transición, transformaciones para todos los elementos en la página con este código CSS
fuente
Creo que podría crear una clase css separada que puede usar en estos casos:
Luego, en jQuery, alternaría la clase así:
fuente
Si desea una solución simple sin jquery para evitar todas las transiciones:
fuente
Si desea eliminar las transiciones, transformaciones y animaciones CSS de la página web actual, simplemente puede ejecutar este pequeño script que escribí (dentro de la consola de su navegador):
Utiliza vanillaJS para cargar este archivo css . Aquí también hay un repositorio de Github en caso de que desee usar esto en el contexto de un raspador (Ruby-Selenium): remove-CSS-animations-repo
fuente
hace
en tu js matarlo?
obviamente repito para cada uno.
fuente
Tendría una clase en su CSS como esta:
y luego en tu jQuery:
fuente
#elem.no-transition
en tu CSS, solo has apuntado.no-transition
. ¿Quizás quisiste escribir#elem.no-transition
en tu CSS?