Допустим, вы хотите сдвинуть элемент при :hover для создания забавного визуального эффекта.
CSS
@media (hover: hover) { .list--item { transition: 0.1s; transform: translateY(10px); } .list--item:hover, .list--item:focus { transform: translateY(0); } }
Классно! Но что если у вас есть несколько пунктов списка и вы хотите чтобы все они сдвигались при наведении, но каждый из них бы смещался пошагово по времени?
Хитрость заключается в transition-delay и применении разной задержки для каждого элемента. Давайте выберем каждый пункт списка по отдельности и применим к ним разные задержки. В данном случае мы выбираем вложенный <span> просто для удовольствия.
CSS
@media (hover: hover) { .list li a span { transform: translateY(100px); transition: 0.2s; } .list:hover span { transform: translateY(0); } .list li:nth-child(1) span { transition-delay: 0.0s; } .list li:nth-child(2) span { transition-delay: 0.05s; } .list li:nth-child(3) span { transition-delay: 0.1s; } .list li:nth-child(4) span { transition-delay: 0.15s; } .list li:nth-child(5) span { transition-delay: 0.2s; } .list li:nth-child(6) span { transition-delay: 0.25s; } }
Если вы хотите дать себе чуть больше программистского контроля, то можете установить задержку как пользовательское свойство CSS.
CSS
@media (hover: hover) { .list { --delay: 0.05s; } .list li a span { transform: translateY(100px); transition: 0.2s; } .list:hover span { transform: translateY(0); } .list li:nth-child(1) span { transition-delay: calc(var(--delay) * 0); } .list li:nth-child(2) span { transition-delay: calc(var(--delay) * 1); } .list li:nth-child(3) span { transition-delay: calc(var(--delay) * 2); } .list li:nth-child(4) span { transition-delay: calc(var(--delay) * 3); } .list li:nth-child(5) span { transition-delay: calc(var(--delay) * 4); } .list li:nth-child(6) span { transition-delay: calc(var(--delay) * 5); } }
Всё это может показаться немного капризным на ваш вкус. Скажем, ваш список вырастет, допустим, до семи или более пунктов и пошаговые переходы неожиданно перестанут работать для новых пунктов списка, поскольку здесь не учитывается их количество.
Так что при желании вы можете передать задержку из HTML.
HTML
<ul class="list"> <li><a href="#0" style="--delay: 0.00s;">① <span>This</span></a></li> <li><a href="#0" style="--delay: 0.05s;">② <span>Little</span></a></li> <li><a href="#0" style="--delay: 0.10s;">③ <span>Piggy</span></a></li> <li><a href="#0" style="--delay: 0.15s;">④ <span>Went</span></a></li> <li><a href="#0" style="--delay: 0.20s;">⑤ <span>To</span></a></li> <li><a href="#0" style="--delay: 0.25s;">⑥ <span>Market</span></a></li> </ul>
CSS
@media (hover: hover) { .list li a span { transform: translateY(100px); transition: 0.2s; } .list:hover span { transform: translateY(0); transition-delay: var(--delay); /* Берём из HTML */ } }
Или, если вы склоняетесь к Sass, то могли бы создать цикл с большим количеством пунктов, чем нужно в данный момент (зная, что дополнительный код довольно эффективно сожмётся).
SCSS
@media (hover: hover) { /* Основной стиль для :hover возьмите сверху */ @for $i from 0 through 20 { .list li:nth-child(#{$i + 1}) span { transition-delay: 0.05s * $i; } } }
Это может оказаться полезным, независимо от того, какой размер цикла вы выбираете.
Сайт