美文网首页让前端飞Web前端之路
交错排序的CSS Transitions(译)

交错排序的CSS Transitions(译)

作者: solfKwolf | 来源:发表于2019-08-15 19:04 被阅读2次

    你可以通过: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/

    )

    相关文章

      网友评论

        本文标题:交错排序的CSS Transitions(译)

        本文链接:https://www.haomeiwen.com/subject/qartsctx.html