J'ai un élément DOM avec certains / tous les effets suivants appliqués:
#elem {
-webkit-transition: height 0.4s ease;
-moz-transition: height 0.4s ease;
-o-transition: height 0.4s ease;
transition: height 0.4s ease;
}
J'écris un plugin jQuery qui redimensionne cet élément, je dois désactiver ces effets temporairement afin de pouvoir le redimensionner en douceur.
Quelle est la façon la plus élégante de désactiver temporairement ces effets (puis de les réactiver), étant donné qu'ils peuvent être appliqués par les parents ou pas du tout.
javascript
jquery
css
Sam Saffron
la source
la source
.notransition
classe. Il serait plus raisonnable de le faire dans l'autre sens, c'est-à-dire de cibler#elem.yestransition
avec votre CSS et de supprimer cette classe. Cela supprime les méchants*
s dans votre CSS.Réponses:
Réponse courte
Utilisez ce CSS:
Plus soit ce JS (sans jQuery) ...
Ou ce JS avec jQuery ...
... ou du code équivalent utilisant n'importe quelle autre bibliothèque ou framework avec lequel vous travaillez.
Explication
Il s'agit en fait d'un problème assez subtil.
Tout d'abord, vous souhaiterez probablement créer une classe «notransition» que vous pouvez appliquer aux éléments pour définir leurs
*-transition
attributs CSSnone
. Par exemple:(Mineure de côté - notez l'absence d'un
-ms-transition
. Vous n'en avez pas besoin. La première version d'Internet Explorer pour prendre en charge les transitions du tout était IE 10, qui les supportait préfixés.)Mais ce n'est que du style et c'est la partie la plus facile. Lorsque vous venez d'essayer et d'utiliser cette classe, vous rencontrerez un piège. Le piège est que le code comme celui-ci ne fonctionnera pas comme vous pourriez vous y attendre naïvement:
Naïvement, vous pourriez penser que le changement de hauteur ne sera pas animé, car il se produit lorsque la classe «notransition» est appliquée. En réalité, cependant, il sera animé, du moins dans tous les navigateurs modernes que j'ai essayés. Le problème est que le navigateur met en cache les modifications de style qu'il doit apporter jusqu'à ce que JavaScript soit terminé, puis effectue toutes les modifications en une seule redistribution. Par conséquent, il effectue une refusion où il n'y a pas de changement net quant à l'activation ou non des transitions, mais il y a un changement net de la hauteur. Par conséquent, il anime le changement de hauteur.
Vous pourriez penser qu'un moyen raisonnable et propre de contourner ce problème serait d'encapsuler la suppression de la classe «notransition» dans un délai de 1 ms, comme ceci:
mais cela ne fonctionne pas de manière fiable non plus. Je n'ai pas pu faire la rupture de code ci-dessus dans les navigateurs WebKit, mais sur Firefox (sur les machines lentes et rapides), vous obtiendrez parfois (apparemment au hasard) le même comportement qu'en utilisant l'approche naïve. Je suppose que la raison en est qu'il est possible que l'exécution de JavaScript soit suffisamment lente pour que la fonction de délai d'attente soit en attente d'exécution au moment où le navigateur est inactif et penserait autrement à faire une redistribution opportuniste, et si ce scénario se produit, Firefox exécute la fonction en file d'attente avant la redistribution.
La seule solution que j'ai trouvée au problème est de forcer une redistribution de l'élément, en vidant les modifications CSS qui y sont apportées, avant de supprimer la classe 'notransition'. Il existe différentes façons de le faire - voir ici pour certains. La chose la plus proche d'une méthode «standard» est de lire le
offsetHeight
propriété de l'élément.Une solution qui fonctionne alors est
Voici un violon JS qui illustre les trois approches possibles que j'ai décrites ici (à la fois l'approche réussie et les deux infructueuses): http://jsfiddle.net/2uVAA/131/
la source
Je recommanderais de désactiver l'animation comme suggéré par DaneSoul, mais de rendre le changement global:
.notransition
peut ensuite être appliqué à l'body
élément, remplaçant efficacement toute animation de transition sur la page:la source
Ajoutez une classe CSS supplémentaire qui bloque la transition, puis supprimez-la pour revenir à l'état précédent. Cela rend le code CSS et JQuery court, simple et bien compréhensible.
CSS :
!important
a été ajouté pour être sûr que cette règle aura plus de "poids", car l'ID est normalement plus spécifique que la classe.JQuery :
la source
Pour une solution JS pure (pas de classes CSS), définissez simplement le
transition
sur'none'
. Pour restaurer la transition comme spécifié dans le CSS, définissez letransition
sur une chaîne vide.Si vous utilisez des préfixes de fournisseurs, vous devrez également les définir.
la source
Vous pouvez désactiver l'animation, la transition, les transformations pour tous les éléments de la page avec ce code CSS
la source
Je pense que vous pouvez créer une classe CSS distincte que vous pouvez utiliser dans ces cas:
Ensuite, dans jQuery, vous basculeriez la classe comme suit:
la source
Si vous voulez une solution simple sans jquery pour empêcher toutes les transitions:
la source
Si vous souhaitez supprimer les transitions, transformations et animations CSS de la page Web actuelle, vous pouvez simplement exécuter ce petit script que j'ai écrit (dans la console de votre navigateur):
Il utilise vanillaJS pour charger ce fichier css . Voici également un dépôt github au cas où vous voudriez l'utiliser dans le contexte d'un grattoir (Ruby-Selenium): remove-CSS-animations-repo
la source
Est-ce que
dans votre js le tuer?
répéter évidemment pour chacun.
la source
J'aurais une classe dans votre CSS comme ceci:
puis dans votre jQuery:
la source
#elem.no-transition
dans votre CSS, vous venez de cibler.no-transition
. Peut-être vouliez-vous écrire#elem.no-transition
dans votre CSS?