使用css编写无限重复加载动画

难点介绍

在开始写代码之前,我们可以思考,在浏览器页面里,我们怎么可以感觉到一个元素在无限重复滚动。实际上我们的元素首尾是断开的,所以说,我们看到的无限重复滚动的动画,他不是连续的,是我们的眼睛被欺骗了,我们想要达到的就是这种效果。

如何达到眼睛被欺骗的效果

平常的思路

我们可以将滚动的元素复制成两份,元素1在我们的视野里滚动,另外一份在元素2跟在元素1后面滚动,这两个相同元素的无限滚动,不就成了无限加载了吗

升级版思路

按照前面的思路来写代码,不仅要写两个盒子去装元素,还需要写两个动画
但是我们仔细思考一下,一个元素在前面滚动,另外一个元素紧跟在后面滚动,如果我们把这两个系统的元素看作同一个元素,那么我是不是只需要写一个元素,让这个元素滚动自身的百分之50,循环下去,不也可以无限滚动吗

代码环节

复制到vscode的html页面里就可以运行了

平常思路代码

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 
        这里的relative可有意思了,我们的元素自身的宽度在平常状态下只能获取到可见区域的宽度
        而在absolute状态下可以获取到元素可见与不可见的总宽度
        在写这个的时候这个问题也困扰了我好久
       */
      .slider {
        position: relative;
        width: 200px;
        height: 100px;
        overflow: hidden;
      }

      .slider-absolute {
        position: absolute;
        top: 0;
        left: 0;
        display: flex;
        justify-content: flex-start;
        align-items: center;
        /* 不能让元素换行 */
        flex-wrap: nowrap;
      }

      .box {
        display: flex;
        align-items: center;
        justify-content: flex-start;
        animation: slider 5s infinite linear;
      }

      span {
        display: inline-block;
        padding: 10px;
        background-color: aqua;
        /* 只能用与动画方向相反的元素间的间隔 不然会出现卡顿 */
        margin-right: 20px;
      }

      @keyframes slider {
        0% {
          transform: translateX(0);
        }

        100% {
          transform: translateX(-100%);
          /* 若元素有隐藏在父级元素之外的内容 需要使用绝对定位来获取自己本身可见与不可见的宽度 */
        }
      }
    </style>
  </head>
  <body>
    <div class="slider">
      <div class="slider-absolute">
        <div class="box">
          <span>1</span>
          <span>2</span>
          <span>3</span>
          <span>4</span>
          <span>5</span>
        </div>
        <div class="box">
          <span>1</span>
          <span>2</span>
          <span>3</span>
          <span>4</span>
          <span>5</span>
        </div>
      </div>
    </div>
  </body>
</html>

升级版代码

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 
        这里的relative可有意思了,我们的元素自身的宽度在平常状态下只能获取到可见区域的宽度
        而在absolute状态下可以获取到元素可见与不可见的总宽度
        在写这个的时候这个问题也困扰了我好久
       */
      .slider {
        position: relative;
        width: 200px;
        height: 100px;
        overflow: hidden;
      }

      .box {
        position: absolute;
        left: 0;
        top: 0;
        display: flex;
        justify-content: flex-start;
        align-items: center;
        /* 不能让元素换行 */
        flex-wrap: nowrap;
        animation: slider 5s infinite linear;
      }

      span {
        display: inline-block;
        padding: 10px;
        background-color: aqua;
        /* 只能用与动画方向相反的元素间的间隔 不然会出现卡顿 */
        margin-right: 20px;
      }

      @keyframes slider {
        0% {
          transform: translateX(0);
        }

        100% {
          /* 若元素有隐藏在父级元素之外的内容 需要使用绝对定位来获取自己本身可见与不可见的宽度 */
          transform: translateX(-50%);
        }
      }
    </style>
  </head>
  <body>
    <div class="slider">
      <div class="box">
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
        <span>5</span>
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
        <span>5</span>
      </div>
    </div>
  </body>
</html>

原文地址

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐