Подтвердить что ты не робот

Могу ли я применить переход CSS к свойству переполнения?

Я пытаюсь установить transition-delay в overflow свойство body при нажатии div путем добавления класса к body следующим образом:

$("div").click(function(){
    $("body").addClass("no_overflow");
});
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>
4b9b3361

Ответ 1

Существует много свойств, которые нельзя перенести. overflow среди них; движок рендеринга не знает, как перейти между "скрытыми" и "показанными", потому что это двоичные варианты, а не интервалы. Это по той же причине, почему вы не можете переходить между display: none; и display: block; (например): нет промежуточных фаз для использования в качестве переходов.

Вы можете увидеть список свойств, которые вы можете анимировать здесь в Mozilla Developer Network.

Ответ 2

переполнение не является атрибутом CSS. Вы можете увидеть полный список анимированных свойств CSS там.

Ответ 3

Вы можете моделировать задержку с помощью 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>

Ответ 4

Имеет смысл, что вы не можете переходить между двоичными атрибутами, например overflow: hidden; и overflow: visible, но было бы очень приятно, если бы вместо "перехода" это было бы (в js псевдокоде:

setTimeout("applyOverflowVisible()", transitionTime);

Но, конечно, вы можете сделать это сами в JavaScript, но тогда вы разделяете код между местами, и это может затруднить понимание кем-то другим. Я думаю, использование таких вещей, как React помогает, но даже там я хотел бы избежать смешивания css в js.