我正在尝试来回动画(或向右无限滚动)一堆图像,但是我面临的一个问题是,当动画开始(和反转时)时,图像隐藏在视图之外。
这是因为我正在使用translate(-100%)
。
[如果可能,我不想依靠图像大小或限制视口大小来完成这项工作。
(忽略动画的速度,稍后将设置为更长的时间)
.slideshow {
height: 150px;
/*max-width: 800px;*/ /*The width of the page cannot be a problem*/
margin: 0 auto;
position: relative;
overflow: hidden;
transform: translate3d(0, 0, 0);
}
.slideshow > div {
height: 150px;
width: 2000px; /*I don't want to have to input a width.*/
position: absolute;
top: 0;
left: 0;
height: 100%;
transform: translate3d(0, 0, 0);
}
.move > img {
height: 150px;
}
.slideshow .move {
animation: moveSlideshow 10s linear infinite alternate-reverse;
}
.slideshow .move:hover {
-webkit-animation-play-state: paused;
-moz-animation-play-state: paused;
-o-animation-play-state: paused;
animation-play-state: paused;
}
@keyframes moveSlideshow {
0% {
transform: translateX(0%);
}
100% {
transform: translateX(-100%); /*The width of the page needs to be taken into consideration*/
}
}
<div class="slideshow">
<div class="move">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
</div>
</div>
transform: translateX(100%) translateX(-50px);
,但是它不起作用。我的第一个目标是制作一个无限滚动器,当动画结束时,它应该重新开始,但不会引起注意(平滑重新启动,结束图像之后必须是开始图像)。
如果无法执行此操作,我希望有一个来回动画,但要从最后一个图像接触视口的右边缘开始。(使用上面的代码,动画从左侧的图像开始)
如何修复此动画?(启用无限平滑滚动或不从视图中消失)
通过使用以下关键帧,我设法使其可以与动画来回工作:
@keyframes moveSlideshow {
0% {
transform: translateX(0%);
}
100% {
-ms-transform: translateX(-100%) translateX(100vw);
transform: translateX(calc(-100% + 100vw));
}
}
现在,最后一张图像在右侧开始,而第一张图像在左侧结束。唯一的问题是,当视口宽度改变时,动画播放的速度也会改变。
要使滚动连续且无限,您需要复制图像。
然后很容易实现您想要的目标:
.slideshow {
height: 150px;
margin: 0 auto;
position: relative;
transform: translate3d(0, 0, 0);
display: flex;
width: 100%;
overflow: hidden;
}
.move {
height: 100%;
transform: translate3d(0, 0, 0);
display: flex;
animation: moveSlideshow 10s linear infinite;
}
.move > img {
height: 150px;
width: auto;
}
.slideshow:hover .move {
animation-play-state: paused;
}
@keyframes moveSlideshow {
0% {
transform: translateX(0%);
}
100% {
transform: translateX(-100%);
/*The width of the page needs to be taken into consideration*/
}
}
<div class="slideshow">
<div class="move">
<img src="https://via.placeholder.com/400x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/200x150">
</div>
<div class="move">
<img src="https://via.placeholder.com/400x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/300x150">
<img src="https://via.placeholder.com/200x150">
</div>
</div>