视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
css如何实现无限轮播图动画(代码示例)
2020-11-02 22:12:43 责编:小采
文档
 本篇文章给大家带来的内容是如何实现自动无限播放的轮播图动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

在之前的文章【css如何实现图片的旋转展示效果】中介绍了手动无限轮播图的制作,本篇我们来看看自动无限轮播图动画的制作。下面我们就来看看动画效果是如何实现的。

1、设置动画的舞台

HTML与之前文章里的示例非常相似。我们要有一个动画发生的舞台(#stage),一个将会旋转的div容器和一系列图像:

<div id="stage">
 <div id="rotator" style="-webkit-animation-name: rotator;">
 <a href="1.jpg"><img src="1.jpg" width="140"></a>
 <a href="2.jpg"><img src="2.jpg" width="140"></a>
 <a href="3.jpg"><img src="3.jpg" width="140"></a>
 <a href="4.jpg"><img src="4.jpg" width="140"></a>
 <a href="5.jpg"><img src="5.jpg" width="140"></a>
 <a href="6.jpg"><img src="6.jpg" width="140"></a>
 <a href="7.jpg"><img src="7.jpg" width="140"></a>
 <a href="8.jpg"><img src="8.jpg" width="140"></a>
 </div>
</div>

内联样式属性引用下面的动画 @keyframes。它需要内联而不是CSS,以便我们能够使用JavaScript停止和重新启动动画。

2、在3D空间中布置照片

CSS样式用于定位多张照片,首先围绕y轴旋转它们(垂直向上翻页),然后径向向外平移:

 #stage {
 margin: 2em auto 1em 50%;
 height: 140px;
 -webkit-perspective: 1200px;
 -webkit-perspective-origin: 0 50%;
 }
 #rotator a {
 position: absolute;
 left: -81px;
 }
 #rotator a img {
 padding: 10px;
 border: 1px solid #ccc;
 background: #fff;
 -webkit-backface-visibility: hidden;
 }
 #rotator a:nth-of-type(1) img {
 -webkit-transform: rotateY(-90deg) translateZ(300px);
 }
 #rotator a:nth-of-type(2) img {
 -webkit-transform: rotateY(-60deg) translateZ(300px);
 }
 #rotator a:nth-of-type(3) img {
 -webkit-transform: rotateY(-30deg) translateZ(300px);
 }
 #rotator a:nth-of-type(4) img {
 -webkit-transform: translateZ(300px);
 background: #000;
 }
 #rotator a:nth-of-type(5) img {
 -webkit-transform: rotateY(30deg) translateZ(300px);
 }
 #rotator a:nth-of-type(6) img {
 -webkit-transform: rotateY(60deg) translateZ(300px);
 }
 #rotator a:nth-of-type(n+7) { display: none; }

照片设置-81px的值代表向左移动,使前向照片在旋转轴上居中。距离是图像宽度的一半(140px / 2)加上LHS图像填充(10px)和边框(1px)。

该阶段需要设置立体的动画,舞台从页面的中心开始,因此旋转 元素下的锚元素需要向后移动以使动画居中。

我们只开始准备六张照片, 左边三张,中间一张,右边两张。最左侧的照片(位置1)从左侧开始,因此仅在第一次旋转后才可见。

当照片旋转时,它会消失(显示:无),并且新照片会附加到左侧,准备从位置1旋转。在7和更高的位置可以有任意数量的照片。只有当它们移动到可见位置时,它们才会出现。

甚至可以在动画进行时使用Ajax加载新照片。

3、添加动画效果

正如我们之前尝试的那样,不是将照片轮旋转整整360度,而是我们实际做的只是旋转30度 (足以从一张照片到下一张照片):

 @-webkit-keyframes rotator {
 from { -webkit-transform: rotateY(0deg); }
 to { -webkit-transform: rotateY(30deg); }
 }
 #rotator {
 -webkit-transform-origin: 0 0;
 -webkit-transform-style: preserve-3d;
 -webkit-animation-timing-function: cubic-bezier(1, 0.2, 0.2, 1);
 -webkit-animation-duration: 1s;
 -webkit-animation-delay: 1s;
 }
 #rotator:hover {
 -webkit-animation-play-state: paused;
 }

要使关键帧在其他浏览器中工作,请复制所有样式,替换-webkit- with -moz-和-ms-,如下面的示例代码块所示。

动画完成后,它会触发一个JavaScript事件,您可以在下一节中阅读该事件。事件处理程序沿着照片移动,以便在动画重置时,而不是回到初始状态,照片都围绕圆圈移动了一步。

为了更清楚地了解正在发生的事情,中心照片已在下面的演示中突出显示。在动画发生时,您将看到突出显示的节点旋转,然后重置回起始位置,但包含不同的照片。

4、 JavaScript添加动画控制器

我们在此示例中需要JavaScript来检测动画何时结束,以便协调通过车轮重置移动的照片。没有这个,轮子只会在前两张照片之间交替出现。

document.addEventListener("DOMContentLoaded", function() {
 var rotateComplete = function() {
 target.style.webkitAnimationName = "";
 target.insertBefore(arr[arr.length-1], arr[0]);
 setTimeout(function(el) {
 el.style.webkitAnimationName = "rotator";
 }, 0, target);
 };
 var target = document.getElementById("rotator");
 var arr = target.getElementsByTagName("a");
 target.addEventListener("webkitAnimationEnd", rotateComplete, false);
}, false);

对于每个WebKit样式和其他引用,存在Firefox(-moz-或Moz),Opera(-o-或O),甚至Internet Explorer(-ms-或ms)的替代品 - 我们必须忍受的混乱直到标准最终确定。

要在Safari,Chrome,Firefox,Opera和Internet Explorer 10中使用此功能,我们需要包含以下额外的设置:

 var rotateComplete = function() {
 with(target.style) {
 webkitAnimationName = MozAnimationName = msAnimationName = "";
 }
 target.insertBefore(arr[arr.length-1], arr[0]);
 setTimeout(function(el) {
 with(el.style) {
 webkitAnimationName = MozAnimationName = msAnimationName = "rotator";
 }
 }, 0, target);
 };
 var target = document.getElementById("rotator");
 var arr = target.getElementsByTagName("a");
 target.addEventListener("webkitAnimationEnd", rotateComplete, false);
 target.addEventListener("animationend", rotateComplete, false);
 target.addEventListener("MSAnimationEnd", rotateComplete, false);

目前尚不清楚为何需要setTimeout。我们不需要它来设置延迟,因为使用CSS完成,但没有setTimeout(甚至0ms)动画无法重新触发。

5、效果展示

这只是横向的轮播,在之后的文章【css实现三面立体旋转无限轮播图动画】里会在本篇文章的基础上改进轮播方式,制作不一样的的轮播图动画。

下载本文
显示全文
专题