Puis-je appliquer une transition CSS à la propriété overflow?

j'essaie de mettre un transition-delayoverflowbody quand div est cliqué en ajoutant une classe à la body comme suit:

$("div").click(function(){
    $("body").addClass("no_overflow");
});
css lang-css prettyprint-override">div{
  background:lime;
  height:2000px;
}
.no_overflow{  
 overflow:hidden;
}
body{  
  overflow:auto;
  transition: overflow 0 2s;  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>I'm div</div>

cependant, cela ne semble pas fonctionner (il n'y a pas de délai). Est-ce que je fais quelque chose de mal ici?

je sais que cela peut être réalisé à l'aide de setTimeout fonction, mais se demandait pourquoi cela ne pouvait pas être réalisé en utilisant des transitions css? Il n'existe aucun style particulier propriétés auxquelles les transitions css peuvent être appliquées?

19
demandé sur TylerH 2015-01-12 18:00:24

4 réponses

il y a beaucoup de propriétés qui ne peuvent pas être transitionnées. overflow est parmi eux; le moteur de rendu n'a aucune idée de comment faire la transition entre "caché" et "montré", parce que ce sont des options binaires, pas des intervalles. C'est la même raison pour laquelle vous ne pouvez pas faire la transition entre display: none; et display: block; (par exemple): il n'y a pas de phases intermédiaires à utiliser comme transitions.

Vous pouvez voir une liste de propriétés que vous pouvez animer ici sur Mozilla Developer Réseau.

37
répondu TylerH 2015-06-07 18:10:30

Vous pouvez simuler un retard animation:

$("div").click(function() {
  $("body").addClass("no_overflow");
});
div {
  background: lime;
  height: 2000px;
}

.no_overflow {
  overflow: hidden;
  /* persist overflow value from animation */
  animation: 7s delay-overflow;
}

body {
  overflow: auto;
}

@keyframes delay-overflow {
  from { overflow: auto; }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>I'm div</div>

vous devrez appliquer une animation séparée à .body si vous voulez un délai sur removeClass, et aussi pour vous assurer que les deux animations ne se chevauchent pas ou qu'elles s'annulent mutuellement.

8
répondu Dmitry 2016-12-19 11:25:53

overflow n'est pas CSS animables de la propriété. Vous pouvez voir la liste complète des propriétés animables CSS il y a.

7
répondu Evgeny Samsonov 2015-01-12 15:09:27

Il est logique que vous ne pouvez pas la transition entre les attributs binaires par exemple overflow: hidden; et overflow: visible mais il aurait été vraiment agréable si au lieu de "transitionner" alors ce serait comme (dans le pseudo code js:

setTimeout("applyOverflowVisible()", transitionTime);

Mais bien sûr, vous pouvez le faire vous-même en JavaScript, mais ensuite vous divisez le code entre les lieux, et il peut rendre difficile à comprendre par quelqu'un d'autre. Je suppose que L'utilisation de choses comme React aide, mais même là, je voudrais éviter de mélanger css dans le js.

1
répondu OZZIE 2016-11-16 10:03:02