你可以通过:hover来移动一个元素获得一个有趣的视觉效果:
@media (hover: hover) {
.list--item {
transition: 0.1s;
transform: translateY(10px);
}
.list--item:hover,
.list--item:focus {
transform: translateY(0);
}
}
很好,但如果你的页面拥有几个列表项,并且你想让他们在hover时都移动,但是彼此之间有交错的间隔。
秘诀在与[
transition-delay](https://css-tricks.com/almanac/properties/t/transition-delay/)
,对于每个列表项目都进行不同的延迟。
@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;
}
}
如果你想代码可具编程性,你应该摆delay
设置成css自定义属性
@media (hover: hover) {
.list {
--delay: 0.05s; // 可以是常规的CSS属性,但需要以两个破折号(`--`)开始,这里的作用域是在.list下
}
.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);
}
}
当然上面的代码还是有点问题的,当页面列表项目过多时,需要写多个css样式,最快的方法之一就是用html的style属性。
<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>
@media (hover: hover) {
.list li a span {
transform: translateY(100px);
transition: 0.2s;
}
.list:hover span {
transform: translateY(0);
transition-delay: var(--delay); /* comes from HTML */
}
}
如果你使用scss,那就更简单了
@media (hover: hover) {
/* base hover styles from above */
@for $i from 0 through 20 {
.list li:nth-child(#{$i + 1}) span {
transition-delay: 0.05s * $i;
}
}
}
[原文链接](https://css-tricks.com/staggered-css-transitions/
)
网友评论