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

Задержка перехода CSS с отрицательным значением?

Я пытаюсь понять отрицательные значения для свойства CSS transition-delay. Сначала посмотрите пример кода. Есть два div, которые имеют разные задержки перехода.

Я думал, что отрицательное значение для задержки будет таким же, как положительное значение вправо div (0.2s), но оно не ведет себя одинаково. Я думаю, что он не рисует для 0.2s, что делает переход прыжком.

  • Может ли кто-нибудь объяснить мне, что делает отрицательное значение transition-delay?
  • Является ли отрицательное значение для transition-delay действительным, или они не должны использоваться?
  • Если это нормально, используйте хороший вариант?

function toggle() {
  var left = document.querySelector('.left');
  var right = document.querySelector('.right');
  left.classList.toggle('hidden');
  right.classList.toggle('hidden');
  left.classList.toggle('show');
  right.classList.toggle('show');
}
window.setInterval(toggle, 1500);
window.setTimeout(toggle, 100);
#container {
  background: yellow;
  display: flex;
  width: 200px;
  height: 200px;
  overflow: hidden;
}
.left,
.right {
  flex: 1;
}
.left {
  background: red;
  transition: transform 1s -0.2s cubic-bezier(0.19, 1, 0.22, 1);
}
.right {
  background: blue;
  transition: transform 1s cubic-bezier(0.19, 1, 0.22, 1);
}
.hidden {
  transform: translateY(100%);
}
.show {
  transform: translateY(0%);
}
.container-hide {
  transform: translateY(-100%);
}
<div id="container">
  <div class="left hidden"></div>
  <div class="right hidden"></div>
</div>
4b9b3361

Ответ 1

Отрицательный transition-delay фактически полностью действителен и имеет другое значение, что 0s и не совпадает с положительной задержкой.

Выдержка из Рабочий проект W3C для задержки перехода:

Если значение для transition-delay является отрицательным смещением по времени, переход будет выполняться в момент изменения свойства, но, похоже, начнет выполнение с указанным смещением. То есть переход, по-видимому, начнется частично через его игровой цикл. В случае, когда переход подразумевает начальные значения и отрицательный transition-delay, начальные значения берутся с момента изменения свойства.

В результате первая часть анимации будет пропущена. В принципе, время начала сдвигается, изменяя вычисленную точку анимации.

Итак, если анимация продолжительности 10s имеет задержку -5s, она, похоже, начнет движение на полпути (пропустив первую половину) и завершив только 5s. Вот простой пример, чтобы показать этот эффект в действии.

Иллюстративный пример:

function toggle() {
  var left = document.querySelector('.left');
  var right = document.querySelector('.right');
  left.classList.toggle('hidden');
  right.classList.toggle('hidden');
  left.classList.toggle('show');
  right.classList.toggle('show');
}
window.setInterval(toggle, 15000);
window.setTimeout(toggle, 100);
#container {
  background: yellow;
  display: flex;
  width: 200px;
  height: 200px;
  overflow: hidden;
}
.left,
.right {
  flex: 1;
}
.left {
  background: red;
  transition: transform 10s linear;
  transition-delay: -5s;
}
.right {
  background: blue;
  transition: transform 10s linear;
  transition-delay: 0s;
}
.hidden {
  transform: translateY(100%);
}
.show {
  transform: translateY(0%);
}
.container-hide {
  transform: translateY(-100%);
}
<div id="container">
  <div class="left hidden"></div>
  <div class="right hidden"></div>
</div>

Ответ 2

Q: Может ли кто-нибудь объяснить мне, что делает отрицательное значение transition-delay?

В документация MDN для transition-delay:

Отрицательные значения заставляют переход начать немедленно, но для того, чтобы переход, казалось, начинался частично через эффект анимации.

Это также описано в W3C Working Draft для свойства, как упоминалось Alexander Ответ "Мара" :

Если значение transition-delay является отрицательным смещением по времени, тогда переход будет выполняться в момент, когда свойство будет изменено, но, похоже, начнет выполнение с указанным смещением. То есть переход, по-видимому, начнется частично через его игровой цикл. В случае, когда переход подразумевает начальные значения и отрицательную задержку перехода, начальные значения берутся с момента изменения свойства.

Это означает, что переход начнется немедленно и частично, как будто указанное время уже прошло. Например, рассмотрим это (открытый фрагмент):

#box1 {
  width: 200px;
  height: 50px;
  
  transition: width 3s 1s;
    
  background-color: green;
}

#box2 {
  width: 200px;
  height: 50px;
  
  transition: width 3s 0s;
    
  background-color: red;
}

#box3 {
  width: 200px;
  height: 50px;
  
  transition: width 3s -1s;
    
  background-color: blue;
}


#box1:hover, #box2:hover, #box3:hover {
  width: 400px;
}
<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>

<ul>
  <li>Box 1 (green) has transition delay of 1s.</li>
  <li>Box 2 (red) has transition delay of 0s.</li>
  <li>Box 3 (blue) has transition delay of -1s.</li>
<ul>  

Ответ 3

Отрицательный переход будет вычитаться из времени перехода, но он не пройдет 0.