纯CSS3制作满屏图像幻灯片
记得前段时间在《完美的页面背景图片制作》介绍了几种实现全屏背景图片的制作方法,其中第一种就是使用的CSS3的background-size来实现的。今天看了Mary Lou (Manoela Ilic)写的一篇有关于全屏背景图像的幻灯片效果的教程《Fullscreen Background Image Slideshow with CSS3》,觉得特有意思,同时勾起了我动手的冲动。在动手之前我在想,这样效果能不能配合Dan Eden的Animate.css(有关于animate.css的中文介绍可以点击这里)制作出不同的动画效果呢?经过自己动手一试,还真没有问题,此方案可行。于是整理出来与大家一起分享。
HTML Markup
<ul class="cb-slideshow"> <li>image1</li> <li>image2</li> <li>image3</li> <li>image4</li> <li>image5</li> <li>image6</li> </ul> <div id="wrapper"> <!-- Page Content here--> </div>
这里采用了一个简单清晰的结构,使用列表来放置不同的背景图片,而页面的内容都将放在“div#wrapper”容器之中。
CSS Code
下面主要来看样式是如何实现,大家要是感兴趣的话可以跟着一起动手来制作:
第一步:固定图片,并全屏显示
在这一步中,把列上固定在窖口左上角,并使其大小等于浏览器屏幕,为了效果更好些,还使用了“:after”给他们加上一层面纱效果,具体看下面代码:
*{ margin:0; padding:0; } body{ background: #000; font: 15px/400 Constantia, Palatino, "Palatino Linotype", "Palatino LT STD", Georgia, serif; color: #aa3e03; overflow-y: scroll;/*这个很重要*/ overflow-x: hidden;/*这个很重要*/ } .cb-slideshow, .cb-slideshow:after { position: fixed; width: 100%; height: 100%; top:0; left:0; z-index:0; } .cb-slideshow:after { content:""; background: url("images/pattern.png") repeat left top; }
第二步:列表上放置不同的背景图片
为了让背景图片能全屏显示,将列表项绝对定位,并使用其大小等于浏览器屏幕大小,同时将背景图片放大到全屏,具体代码如下所示:
.cb-slideshow li { position: absolute; width:100%;/*这个很重要*/ height: 100%;/*这个很重要*/ top:0; left:0; color: transparent; /*===放大背景图片==*/ -moz-background-size: cover; -webkit-background-size: cover; -o-background-size: cover; -ms-background-size: cover; background-size: cover; background-position: center;/*背景图片居中显示*/ background-repeat: none;/*背景图片不平铺*/ opacity:0;/*载入时为透明*/ z-index:0; } /*====设置不同的背景图片===*/ .cb-slideshow li:nth-child(1) { background-image: url("images/1.jpg"); } .cb-slideshow li:nth-child(2){ background-image: url("images/2.jpg"); } .cb-slideshow li:nth-child(3) { background-image: url("images/3.jpg"); } .cb-slideshow li:nth-child(4){ background-image: url("images/4.jpg"); } .cb-slideshow li:nth-child(5){ background-image: url("images/5.jpg"); } .cb-slideshow li:nth-child(6){ background-image: url("images/6.jpg"); }
第三步:自定义动画
这一步是一个关键步,使用Animation中的keyframe来定义动画效果:
@keyframes imageAnimation {/*==定义了一个imageAimation的动画==*/ 0% {/*==开始效果==*/ opacity: 0; transform: translateY(2000px); animation-timing-function: ease-in; } 8% {/*==8%位置处的效果==*/ opacity: 1; transform: translateY(-30px); animation-timing-function: ease-out; } 17% {/*=17%处的效果==*/ opacity: 1; } 25% {/*==25%处效果==*/ opacity:0; transform: translateY(10px); } 100% {/*==结束时效果==*/ opacity:0; transform: translateY(0); } }
上面我们创建一个叫“imageAnimation”的动画,具体如何创建这样的动画,大家感兴趣的话可以点击《Animation》一文。
第四步:调用动画imageAnimation
上一步定义好动画效果了,那么这一步就需将动画调用进来:
.cb-slideshow li { position: absolute; width:100%; height: 100%; top:0; left:0; color: transparent; background-size: cover; background-position: center; background-repeat: none; opacity:0; z-index:0; -webkit-backface-visibility: hidden; -webkit-animation: imageAnimation 36s linear infinite 0s; -moz-animation: imageAnimation 36s linear infinite 0s; -o-animation: imageAnimation 36s linear infinite 0s; -ms-animation: imageAnimation 36s linear infinite 0s; animation: imageAnimation 36s linear infinite 0s; } .cb-slideshow li:nth-child(1) { background-image: url("images/1.jpg"); } .cb-slideshow li:nth-child(2){ background-image: url("images/2.jpg"); -webkit-animation-delay: 6s; -moz-animation-delay: 6s; -o-animation-delay: 6s; -ms-animation-delay: 6s; animation-delay: 6s; } .cb-slideshow li:nth-child(3) { background-image: url("images/3.jpg"); -webkit-animation-delay: 12s; -moz-animation-delay: 12s; -o-animation-delay: 12s; -ms-animation-delay: 12s; animation-delay: 12s; } .cb-slideshow li:nth-child(4){ background-image: url("images/4.jpg"); -webkit-animation-delay: 18s; -moz-animation-delay: 18s; -o-animation-delay: 18s; -ms-animation-delay: 18s; animation-delay: 18s; } .cb-slideshow li:nth-child(5){ background-image: url("images/5.jpg"); -webkit-animation-delay: 24s; -moz-animation-delay: 24s; -o-animation-delay: 24s; -ms-animation-delay: 24s; animation-delay: 24s; } .cb-slideshow li:nth-child(6){ background-image: url("images/6.jpg"); -webkit-animation-delay: 30s; -moz-animation-delay: 30s; -o-animation-delay: 30s; -ms-animation-delay: 30s; animation-delay: 30s; }
上面有几个关键的参数:
- animation-name:动画名称,调用的是“imageAnimation”
- animation-duration:动画持续的时间是36s
- animation-timing-function:动画频率使用的是linear
- animation-iteration-count:动画播放次数是无数次
- animation-delay:动画延迟时间,默认是0s
每个图片的动画延迟时间是以6s递增,依次是0s,6s,12s,18s,24s,30s。当然大家可以根据自己的需求去配置的。
第六步:定义主内容样式
定义主内容样式有一点需要注意,那就是内容层次和前面列表图片的层次关系,我们主要使用“z-index”来控制,另外为了能看到底下的背景效果,背景色还采用了rgba来写样式:
#wrapper { width: 960px; background: rgba(255,255,255,0.8); margin: 0 auto; position: relative; z-index:99999; }
那么到这一步可以说效果出来了,不过此时所有图片的动画效果都是一样的,那么为了让每次图片有不同的动画效果播放,我们可以借用Dan Eden的Animate.css中的动画效果,当然大家可以在此基础上制作自己需要的动画风格,然后只需要在相应的列表项中调用不同的动画:
@keyframes bounceInDown { 0% { opacity: 0; transform: translateY(-2000px); } 8% { opacity: 1; transform: translateY(30px) rotate(360deg); } 17% { opacity:1; transform: translateY(-10px) rotate(720deg); } 25% { opacity:0; transform: translateY(-10px) rotate(0deg); } 100% { transform: translateY(0); } }
比如说我们在第二张图片中调用了这个动画效果:
.cb-slideshow li:nth-child(2){ background-image: url("images/2.jpg"); -moz-animation-name: bounceInDown; -webkit-animation-delay: 6s; -moz-animation-delay: 6s; -o-animation-delay: 6s; -ms-animation-delay: 6s; animation-delay: 6s; }
那么到这里我们样式就算是完成了,全部样式如下:
*{ margin:0; padding:0; } body{ background: #000; font: 15px/400 Constantia, Palatino, "Palatino Linotype", "Palatino LT STD", Georgia, serif;; color: #aa3e03; overflow-y: scroll; overflow-x: hidden; } .cb-slideshow, .cb-slideshow:after { position: fixed; width: 100%; height: 100%; top:0; left:0; z-index:0; } .cb-slideshow:after { content:""; background: url("images/pattern.png") repeat left top; } .cb-slideshow li { position: absolute; width:100%; height: 100%; top:0; left:0; color: transparent; background-size: cover; background-position: center; background-repeat: none; opacity:0; z-index:0; -webkit-backface-visibility: hidden; -webkit-animation: imageAnimation 36s linear infinite 0s; -moz-animation: imageAnimation 36s linear infinite 0s; -o-animation: imageAnimation 36s linear infinite 0s; -ms-animation: imageAnimation 36s linear infinite 0s; animation: imageAnimation 36s linear infinite 0s; } .cb-slideshow li:nth-child(1) { background-image: url("images/1.jpg"); } .cb-slideshow li:nth-child(2){ background-image: url("images/2.jpg"); -moz-animation-name: bounceInDown; -webkit-animation-delay: 6s; -moz-animation-delay: 6s; -o-animation-delay: 6s; -ms-animation-delay: 6s; animation-delay: 6s; } .cb-slideshow li:nth-child(3) { background-image: url("images/3.jpg"); -webkit-animation-delay: 12s; -moz-animation-delay: 12s; -o-animation-delay: 12s; -ms-animation-delay: 12s; animation-delay: 12s; } .cb-slideshow li:nth-child(4){ background-image: url("images/4.jpg"); -webkit-animation-delay: 18s; -moz-animation-delay: 18s; -o-animation-delay: 18s; -ms-animation-delay: 18s; animation-delay: 18s; } .cb-slideshow li:nth-child(5){ background-image: url("images/5.jpg"); -webkit-animation-delay: 24s; -moz-animation-delay: 24s; -o-animation-delay: 24s; -ms-animation-delay: 24s; animation-delay: 24s; } .cb-slideshow li:nth-child(6){ background-image: url("images/6.jpg"); -webkit-animation-delay: 30s; -moz-animation-delay: 30s; -o-animation-delay: 30s; -ms-animation-delay: 30s; animation-delay: 30s; } /*定义动画*/ @-moz-keyframes imageAnimation { 0% { opacity: 0; -moz-transform: translateY(2000px); -moz-animation-timing-function: ease-in; } 8% { opacity: 1; -moz-transform: translateY(-30px); -moz-animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity:0; -moz-transform: translateY(10px); } 100% { opacity:0; -moz-transform: translateY(0); } } @-webkit-keyframes imageAnimation { 0% { opacity: 0; -webkit-transform: translateY(2000px); -webkit-animation-timing-function: ease-in; } 8% { opacity: 1; -webkit-transform: translateY(-30px); -webkit-animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity:0; -webkit-transform: translateY(10px); } 100% { opacity:0; -webkit-transform: translateY(0); } } @-o-keyframes imageAnimation { 0% { opacity: 0; -o-transform: translateY(2000px); -o-animation-timing-function: ease-in; } 8% { opacity: 1; -o-transform: translateY(-30px); -o-animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity:0; -o-transform: translateY(10px); } 100% { opacity:0; -o-transform: translateY(0); } } @-ms-keyframes imageAnimation { 0% { opacity: 0; -ms-transform: translateY(2000px); -ms-animation-timing-function: ease-in; } 8% { opacity: 1; -ms-transform: translateY(-30px); -ms-animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity:0; -ms-transform: translateY(10px); } 100% { opacity:0; -ms-transform: translateY(0); } } @keyframes imageAnimation { 0% { opacity: 0; transform: translateY(2000px); animation-timing-function: ease-in; } 8% { opacity: 1; transform: translateY(-30px); animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity:0; transform: translateY(10px); } 100% { opacity:0; transform: translateY(0); } } @-moz-keyframes bounceInDown { 0% { opacity: 0; -moz-transform: translateY(-2000px); } 8% { opacity: 1; -moz-transform: translateY(30px) rotate(360deg); } 17% { opacity:1; -moz-transform: translateY(-10px) rotate(720deg); } 25% { opacity:0; -moz-transform: translateY(-10px) rotate(0deg); } 100% { -moz-transform: translateY(0); } } @-webkit-keyframes bounceInDown { 0% { opacity: 0; -webkit-transform: translateY(-2000px); } 8% { opacity: 1; -webkit-transform: translateY(30px) rotate(360deg); } 17% { opacity:1; -webkit-transform: translateY(-10px) rotate(720deg); } 25% { opacity:0; -webkit-transform: translateY(-10px) rotate(0deg); } 100% { -webkit-transform: translateY(0); } } @-o-keyframes bounceInDown { 0% { opacity: 0; -o-transform: translateY(-2000px); } 8% { opacity: 1; -o-transform: translateY(30px) rotate(360deg); } 17% { opacity:1; -o-transform: translateY(-10px) rotate(720deg); } 25% { opacity:0; -o-transform: translateY(-10px) rotate(0deg); } 100% { -o-transform: translateY(0); } } @-ms-keyframes bounceInDown { 0% { opacity: 0; -ms-transform: translateY(-2000px); } 8% { opacity: 1; -ms-transform: translateY(30px) rotate(360deg); } 17% { opacity:1; -ms-transform: translateY(-10px) rotate(720deg); } 25% { opacity:0; -ms-transform: translateY(-10px) rotate(0deg); } 100% { -ms-transform: translateY(0); } } @keyframes bounceInDown { 0% { opacity: 0; transform: translateY(-2000px); } 8% { opacity: 1; transform: translateY(30px) rotate(360deg); } 17% { opacity:1; transform: translateY(-10px) rotate(720deg); } 25% { opacity:0; transform: translateY(-10px) rotate(0deg); } 100% { transform: translateY(0); } } #wrapper { width: 960px; background: rgba(255,255,255,0.8); margin: 0 auto; position: relative; z-index:99999; }
到这效果就算是全部出来了,大家感兴趣的话不仿试试,希望您喜欢这个教程。如果你有更好的效果,记得与我们一起分享。
如需转载烦请注明出处:W3CPLUS