【问题标题】:How can I achieve this kind of animation using css or js?如何使用 css 或 js 实现这种动画?
【发布时间】:2021-07-26 16:19:32
【问题描述】:

我正在尝试实现这种动画,其中项目保持正确然后从后面出现:

但是我的代码不起作用,它只是在错误的时间和错误的地方返回,这是我的代码:

.floatingItem {
  flex: 0 0 auto;
  width: 130px;
  height: 200px;
  animation: moveRight 2s linear infinite;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: 100ms all ease-in;
  img {
    width: 100px;
    height: 110px;
    transition: 100ms all ease-in;
  }
}

.fi2 {
  margin-top: 0;
}

@keyframes moveRight {
  0% {
    transform: translateX(-10%);
  }
  100% {
    transform: translateX(100%);
  }
}
<div class="floatingItems">

  <div class="floatingItem">

    <img class="floatImage" src="itemImage" alt="">

  </div>

</div>

【问题讨论】:

  • 您的.jpg 图像很好地向我们展示了您希望动画的外观。
  • 你如何管理这取决于你想要什么效果。你想调整图标的大小,使它们加上它们之间的间隙,总是至少填满视口的宽度吗? (使外观与图像中的图标宽度具有相同的比例差距 - 但有一些最小尺寸??)

标签: html css animation sass css-animations


【解决方案1】:

重叠六边形的给定布局假设有足够的空间至少覆盖视口的宽度。

这里我们假设已将足够多的图标或副本放入一行以确保覆盖宽度。

虽然可以单独为每个图标设置动画,但它非常混乱,并且比单个动画消耗更多的 CPU/GPU,并且存在时间可能会有点不同步的危险(尽管很轻微)。

在这里,我们将图标与完整副本组合在一起形成一条线。这样我们就可以连续滚动了。

CSS 变量用于设置相对计算的宽度和边距,以便整体可以响应,图标大小的上限和下限使它们保持可读性,但不会占用过多的屏幕。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.icons {
  --w: clamp(50px, 10vmin, 100px); /* don't let the icons get too big or too small */
  --n: 15; /* number of icons in each group (a group plus a copy of the group form a line) */
  --m: calc(var(--w) / 20); /* margin on each icon */
  /* for a totally general solution when there aren't many icons would need to adjust margin on each icon so one group at least fills width of viewport */
  position: fixed;
  bottom: 0;
  z-index: 99999;
}
.line {
  white-space: nowrap;
  animation: scroll 20s infinite linear;
  position: relative;
  --y: 0%;
}
.line:nth-child(2) {
  left: calc((var(--w) / -2) - var(--m)); /* offset the second line */
  --y: -25%;
}
.icon {
  width: var(--w);
  height: auto;
  margin: var(--m);
  display: inline-block;
  position: relative;
}
@keyframes scroll {
  0% {
    transform: translateX(-50%) translateY(var(--y));
  }
  100% {
    transform: translateX(0%) translateY(var(--y));
  }
}
<div class="icons">
  <div class="line">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
    <!-- this is a copy of the group above -->
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
  </div>
  <div class="line">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">

    <!-- this is a copy of the group above -->
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">
      <img class="icon" src="https://i.stack.imgur.com/wzsQv.png.png">
      <img class="icon" src="https://i.stack.imgur.com/TqwFZ.png.png">
      <img class="icon" src="https://i.stack.imgur.com/a3lIe.png.png">

  </div>
</div>

注意:似乎至少有些浏览器在用于顶部定位的计算值方面存在问题,因此底线向上平移而不是设置顶部(以使六边形“嵌套”到第一行)

【讨论】:

    【解决方案2】:

    项目一直向右移动然后从后面出现的动画

    这是一个移动的横幅效果。 translate 适用于元素本身的尺寸,所以在你的情况下,它只会向右移动等于它自己的宽度,然后跳回到它的原始位置,它不会一直持续到它的父级结束。

    要制作横幅效果,您可以绝对定位元素并为其right 属性设置动画,该属性是相对于父级的:

    .floatingItems {
      position: relative;
      height: 200px;
      background: dodgerblue;
    }
    
    .floatingItem {
      position: absolute; 
      display: flex;
      align-items: center;
      justify-content: center;
      width: 130px;
      height: 200px;
      animation: moveRight 2s linear infinite;
      background: #fff;
    }
    
    img {
      width: 100px;
      height: 110px;
    }
    
    @keyframes moveRight {
      0% {
        right: 100%;
      }
      100% {
        right: 0%;
      }
    }
    <div class="floatingItems">
      <div class="floatingItem">
        <img class="floatImage" src="https://picsum.photos/200/300" alt="">
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多