经常使用网易云音乐,看见它的首页轮播图想本身也实现一个,本文会经过 animation 结合 perspective 等 css 属性实现3d轮播的效果。让咱们开始吧! css
为了简单起步咱们先使用三张图片,定义基础的 html 和 css 结构以下:html
transform:scale(0.8)
,而后让两边的图片的大小缩放 0.8 咱们要作的就是让图片动起来就实现了轮播的效果。transform-style
和 perspective
这两个概念接下来围绕这两点展开分析如何实现。css3
选用animation写动画bash
动起来就是动画能够经过 css animation 以及 js中的 requestAnimationFrame 这两种。我选用 animation 做为实现手段。wordpress
分析动起来的阶段动画
只看一张图的周期分为三个阶段也就是 左边,中间,右边
,假设咱们在每一个阶段都停留2s,那么整个周期须要6s的时间。为了让过渡天然些,每次过渡的时候都预留0.5s过渡时间。那么过渡时间总共要1.5s 全部时间加起来须要 7.5sspa
animation使用3d
animation: three-D 7.5s ease -5s infinite;
表示整个过渡时间是 7.5s 因为 animation-delay 设置为 -5s 表示已经运动来 5秒也就是来到动画的 66% 的进度了。/* 总时长是 7.5s */
@keyframes three-D {
/* 停留2秒 */
0%,27%{
transform: translateX(230.3px) scale(0.8);
z-index: 1;
}
/* 过渡时间为 0.5s */
34%,61%{
z-index: 2;
transform: translateX(98.7px) scale(1);
}
/* 过渡时间为 0.5s */
68% ,95%{
z-index: 1;
transform: translateX(-32.9px) scale(0.8);
}
/* 过渡时间为 0.5s */
100% {
z-index: 1;
transform: translateX(230.3px) scale(0.8);
}
}
复制代码
给他们的图片的父级设置视角,展现方式为3d。更多属性能够参考张旭鑫 CSS3 3D文章解释code
transform-style: preserve-3d;
perspective: 800px;
复制代码
使用了这个属性后,咱们能够在图片的 左中上
三种位置来改变他们不一样的translateZ
的值来实现3d的效果,其实 translateZ
就是改变图片和用户的距离,咱们经过 scale(0.8) 已经达到相同的效果,由于距离用户近也就觉得这图片要大。
除了改变用户的距离,咱们还自定义的添加一些属性如,图片 rotateY 的角度,来实现开屏的效果。可根据本身的业务须要来添加。orm
当轮播图超过3张以上,拿四张来举例,一张图的周期须要划分为四个阶段。以下图分别在这四个阶段,3,4表示在同一个位置,仍是和以前同样在每一个阶段停留 2s 停留总时间为 8s , 1-2,2-3,4-1须要过渡时间 0.5s 总的过渡时间为 1.5s 。最终所需时间为 9.5s 。
我采用的方式是当图片到了第四个阶段就让他的 opacity 为 0 ,那么即便最后一张图片到了第四个阶段也不会遮住上一张。
/* 总时长是 9.5s */
@keyframes three-D {
/* 停留2秒 */
0%,21%{
transform: translateX(230.3px) translateZ(40px) scale(0.8);
z-index: 3;
}
/* 过渡时间为 0.5s */
26%,47%{
z-index: 4;
transform: translateX(98.7px) scale(1);
}
/* 过渡时间为 0.5s */
51% ,73%{
z-index: 2;
opacity: 1;
transform: translateX(-32.9px) scale(0.8);
}
/* 第三阶段图片隐藏 */
74%,96%{
opacity: 0;
z-index: 1;
transform: translateX(-32.9px) scale(0.8);
}
/* 过渡时间为 0.5s */
100% {
opacity: 1;
z-index: 1;
transform: translateX(230.3px) scale(0.8);
}
}
复制代码
经过css实现了网易云音乐轮播的效果,若是想要和轮播图有交互 会用到 animation-play-state 这个属性,若是业务有需求也能够加上。最后关于3d轮播图有好的实现方式能够在留言区评论。