如何使用css或js实现这种动画?
How can I achieve this kind of animation using css or js?
我正在尝试实现这种项目一直向右移动然后从后面出现的动画:
但是我的代码不起作用,它只是在错误的时间和错误的位置返回左侧这是我的代码:
.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>
animation where the items keep going right and then comes from behind
这是一个移动的横幅效果。 translate
适用于元素本身的尺寸,所以在你的情况下,它只会向右移动等于它自己的宽度,然后跳回到它的原始位置,它不会一直移动到它的末尾parent.
要制作横幅效果,您可以绝对定位元素并为其设置动画 right
属性,这是相对于 parent:
.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>
给定的重叠六边形布局假定有足够的至少覆盖视口的宽度。
此处我们假设已将足够多的图标或副本放入一行以确保覆盖宽度。
虽然可以单独为每个图标制作动画,但它非常混乱,并且可能比单个动画消耗更多 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>
注意:似乎至少某些浏览器在用于顶部定位的计算值方面存在问题,因此底线向上平移而不是设置顶部(使六边形 'nestle' 成为第一行)
我正在尝试实现这种项目一直向右移动然后从后面出现的动画:
但是我的代码不起作用,它只是在错误的时间和错误的位置返回左侧这是我的代码:
.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>
animation where the items keep going right and then comes from behind
这是一个移动的横幅效果。 translate
适用于元素本身的尺寸,所以在你的情况下,它只会向右移动等于它自己的宽度,然后跳回到它的原始位置,它不会一直移动到它的末尾parent.
要制作横幅效果,您可以绝对定位元素并为其设置动画 right
属性,这是相对于 parent:
.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>
给定的重叠六边形布局假定有足够的至少覆盖视口的宽度。
此处我们假设已将足够多的图标或副本放入一行以确保覆盖宽度。
虽然可以单独为每个图标制作动画,但它非常混乱,并且可能比单个动画消耗更多 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>
注意:似乎至少某些浏览器在用于顶部定位的计算值方面存在问题,因此底线向上平移而不是设置顶部(使六边形 'nestle' 成为第一行)