当前位置主页 > 资料库 > 前端教程 > 纯CSS 3D百叶窗图像过渡特效

纯CSS 3D百叶窗图像过渡特效

02-23

查看演示 下载地址

你可能已经在网上看到过不少使用jQuery制作的百叶窗效果,我们可不可以使用纯CSS来完成这项工作呢?答案是肯定的。我们不仅可以制作出这种百叶窗效果,还可以使它具有响应性。

要制作纯CSS的百叶窗效果,HTML结构是个关键。在html结构中,需要使用多幅相同的图片来组织一个“百叶窗”。我们的demo中制作10个百叶窗窗条,需要10个相同的<img>,将它们放置在一个<figure>标签中。同时,我们还需要10幅其它图片放置在百叶窗的反面。每一组图片都设置不同的class,代码如下:

<figure id="blinds">
    <img src="autumn-face.jpg" alt class="first">
    <img src="autumn-face.jpg" alt class="first">
    …
    <img src="autumn-face.jpg" alt class="first">
    <img src="julia.jpg" alt class="second">
    <img src="julia.jpg" alt class="second">
    …
    <img src="julia.jpg" alt class="second">
</figure>                           
                            

实际上,整个效果只会加载两幅图片,所有的图片都必须是相同的尺寸,并且具有相同的绝对定位。<figure>元素设置为其容器的100%宽度,它的高度设置使用了一些小技巧,这个技巧可以使它具有更好的响应式效果。

#blinds {
    margin: 0; position: relative; padding-bottom: 56.5%;
    perspective: 1800px; height: transform-style: preserve-3d;
    max-width: 1000px;
}
#blinds img { top: 0; left: 0; position: absolute; transition: 1s; }                              
                            

位于百叶窗背面的图片需要旋转180度,并使用一个很小的translate值使它们隐藏在其它图片的后面。

#blinds img.first { transform: rotateY(0deg); }
#blinds img.second { transform: rotateY(-180deg) translateZ(1px); }                             
                            
nth-child选择器来选择相应的图片,并用clip属性来制作切片效果。所有的图片clip的值从左向右依次增加100像素。

#blinds img:nth-child(1), #blinds img:nth-child(11) {
    clip: rect(0px, 100px, 840px, 0px); }
#blinds img:nth-child(2), #blinds img:nth-child(12) {
    clip: rect(0px, 200px, 840px, 100px); }
#blinds img:nth-child(3), #blinds img:nth-child(13) {
    clip: rect(0px, 300px, 840px, 200px); }
…
#blinds img:nth-child(10n) {clip: rect(0px, 1000px, 840px, 900px); }                             
                            

在为图片使用clip后,图片的transform-origin任然是在原来图片的中心。我们需要设置所有切片的transform-origin在切片的中心线上,而不是原来图片的中心。

#blinds img:nth-child(1), #blinds img:nth-child(11) {
    clip: rect(0px, 100px, 840px, 0px);
    transform-origin: 50px 0px; 
}
#blinds img:nth-child(2), #blinds img:nth-child(12) {
    clip: rect(0px, 200px, 840px, 100px);
    transform-origin: 150px 0px; 
}
#blinds img:nth-child(3), #blinds img:nth-child(13) {
    clip: rect(0px, 300px, 840px, 200px);
    transform-origin: 250px 0px; 
}
…
#blinds img:nth-child(10n) {
    clip: rect(0px, 1000px, 840px, 900px);
    transform-origin: 950px 0px; 
}                                
                            

然后我们可以在鼠标滑过图片的时候将各组图片分别旋转180度。

#blinds:hover img.first { transform: rotateY(180deg); }
#blinds:hover img.second { transform: rotateY(0deg) translateZ(1px); }                                
                            

这时候,所有的百叶窗切片将同时被旋转。要制作百叶窗的“脉动”效果,可以为每个切片的transition设置一个延迟时间。

#blinds img:nth-child(1), #blinds img:nth-child(11) {
    clip: rect(0px, 100px, 840px, 0px);
    transform-origin: 50px 0px; 
}
#blinds img:nth-child(2), #blinds img:nth-child(12) {
    clip: rect(0px, 200px, 840px, 100px);
    transform-origin: 150px 0px;
    transition-delay: 100ms; 
}
#blinds img:nth-child(3), #blinds img:nth-child(13) {
    clip: rect(0px, 300px, 840px, 200px);
    transform-origin: 250px 0px;
    transition-delay: 200ms; 
}
…
#blinds img:nth-child(10n) {
    clip: rect(0px, 1000px, 840px, 900px);
    transform-origin: 950px 0px;
    transition-delay: 900ms; 
}                                
                            

使用clip属性的一个最大的好处是它天然具有响应式效果:如果图片被缩小,所有的切片会相应的减少。查看demo,试着缩小你的浏览器,当浏览器的宽度小于500像素的时候,图片百叶窗只有5个切片。

查看演示 下载地址

Previous:
上一篇:使用CSS和SVG制作跨浏览器的drop shadow阴影效果
Next:
下一篇:CSS3和js打造四格漫画风格的LightBox特效
返回顶部