CSS transition-задержка с отрицательным значением?
Я пытаюсь понять отрицательные значения для CSS transition-delay
собственность. Сначала посмотрите пример кода. Их два div
s, которые имеют различные задержки перехода.
Я думал, что предоставление отрицательного значения для задержки будет таким же, как предоставление положительного значения right 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>
3 ответов
отрицательный 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>
на самом деле нет никаких причин обязательно избегать использования отрицательных значений длительности, поскольку они действительны, у них просто очень ограниченный случай использования.
Q: может ли кто-нибудь объяснить мне, что делает отрицательный
transition-delay
значение?
на документация MDN на transition-delay
:
отрицательные значения приводят к тому, что переход начинается немедленно, но, по-видимому, частично начинается с эффекта анимации.
это также описано в W3C рабочий проект для свойства, как отмечали ответ Александра О'Мары:
, если значение
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>
вы можете видеть, что синее поле (с задержкой перехода -1s
) немного нервный. Это потому, что начинается переход тут, и начинается на полпути через переход,как будто 1 секунда прошла с момента начала перехода.
в основном, отрицательные значения для свойства transition-delay
сделать переход начать там, где переход был бы после |x|
(абсолютное значение x
), где x
указанное значение свойства. Так, если указать -1s
для задержки переход начнется немедленно и начнется там, где переход был бы в 1s
in. Отрицательные значения также отнимают у продолжительность перехода.
Q: отрицательное значение для
transition-delay
действительны, или они не должны использоваться?
они абсолютно действительны и действительны с первого рабочий проект CSS переходов. Свойство допускает все значения времени, и разрешение отрицательных значений является следствием этого.
из-за определенного поведения transition-delay
для задержки перехода на определенный смещение, отрицательные значения следуют за этим путем смещения отрицательным значением. Это, в свою очередь, приводит к анимации, начинающейся частично, как будто абсолютное значение указанного времени уже прошло.
Q: если это нормально использовать их, что такое хороший вариант использования?
трудно наметить конкретный usecase для такого эффекта, как он не часто используется и очень ограничен в использовании. Я предполагаю, что потенциал потенциального использования может повторно используйте переход, прыгая в разные состояния во время переходного цикла.
выше особенно true при использовании анимации, вопреки переходам, поскольку они повторяются. Когда вы используете анимацию, отрицательные задержки могут позволить вам перейти к определенным точкам анимации и разрешить возможность повторного использования нескольких элементов, которые разделяют поведение, просто не время. Возьмите пример ниже (найдено здесь):
div {
border-radius:50%;
position:absolute;
top:50%; left:75%;
}
div:nth-of-type(odd) { background:black; }
div:nth-of-type(even) { background:white; border:2px solid black; }
div:nth-of-type(11) {
height:10px; width:10px;
margin-top:-5px; margin-left:-5px;
-webkit-animation:slide 3s ease-in-out infinite;
animation:slide 3s ease-in-out infinite;
}
div:nth-of-type(10) {
height:20px; width:20px;
margin-top:-12px; margin-left:-12px;
-webkit-animation:slide 3s -2.7s ease-in-out infinite;
animation:slide 3s -2.7s ease-in-out infinite;
}
div:nth-of-type(9) {
height:40px; width:40px;
margin-top:-20px; margin-left:-20px;
-webkit-animation:slide 3s -2.4s ease-in-out infinite;
animation:slide 3s -2.4s ease-in-out infinite;
}
div:nth-of-type(8) {
height:60px; width:60px;
margin-top:-32px; margin-left:-32px;
-webkit-animation:slide 3s -2.1s ease-in-out infinite;
animation:slide 3s -2.1s ease-in-out infinite;
}
div:nth-of-type(7) {
height:80px; width:80px;
margin-top:-40px; margin-left:-40px;
-webkit-animation:slide 3s -1.8s ease-in-out infinite;
animation:slide 3s -1.8s ease-in-out infinite;
}
div:nth-of-type(6) {
height:100px; width:100px;
margin-top:-52px; margin-left:-52px;
-webkit-animation:slide 3s -1.5s ease-in-out infinite;
animation:slide 3s -1.5s ease-in-out infinite;
}
div:nth-of-type(5) {
height:120px; width:120px;
margin-top:-60px; margin-left:-60px;
-webkit-animation:slide 3s -1.2s ease-in-out infinite;
animation:slide 3s -1.2s ease-in-out infinite;
}
div:nth-of-type(4) {
height:140px; width:140px;
margin-top:-72px; margin-left:-72px;
-webkit-animation:slide 3s -0.9s ease-in-out infinite;
animation:slide 3s -0.9s ease-in-out infinite;
}
div:nth-of-type(3) {
height:160px; width:160px;
margin-top:-80px; margin-left:-80px;
-webkit-animation:slide 3s -0.6s ease-in-out infinite;
animation:slide 3s -0.6s ease-in-out infinite;
}
div:nth-of-type(2) {
height:180px; width:180px;
margin-top:-92px; margin-left:-92px;
-webkit-animation:slide 3s -0.3s ease-in-out infinite;
animation:slide 3s -0.3s ease-in-out infinite;
}
div:nth-of-type(1) {
height:200px; width:200px;
margin-top:-100px; margin-left:-100px;
-webkit-animation:slide 3s ease-in-out infinite;
animation:slide 3s ease-in-out infinite;
}
@keyframes slide {
0% { left:75% }
50% { left:25%; }
100% { left:75%; }
}
@-webkit-keyframes slide {
0% { left:75% }
50% { left:25%; }
100% { left:75%; }
}
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
здесь отрицательные animation-delay
значения используются путем перехода в различные состояния в цикле анимации. Все круги ведут себя одинаково, двигаясь вперед и назад, но в разное время, когда они имитируют волну. Отрицательный animation-delay
заставляет круги двигаться в разное время, далее в цикл анимации.