图片翻转切换,在不使用CSS3的情况下,一般都是使用JS实现动画,同时操作元素的width和left,或者height和top以模拟翻转的效果,并在适当时候改变src或者z-index实现图片切换。

无意中发现CSS3的方案, http://www.webhek.com/css-flip/  赶紧学习并总结如下

先上代码(多数照搬自上述链接,有很大兼容问题,小心使用)

HTML:

<div class="flip-container">
<div class="flipper">
<div class="front">here is content : AA</div>
<div class="back">here is content : BB</div>
</div>
</div>

CSS:

.flip-container {
margin: 30px;
display: inline-block;
border: 1px solid #aaa;
-webkit-perspective:;
-moz-perspective:;
-ms-perspective:;
perspective:;
-ms-transform: perspective(500px);
-moz-transform: perspective(500px); /*重要*/
transform-style: preserve-3d; /*重要*/
}
.flipper {
position: relative;
width: 200px;
height: 200px;
transition: 0.6s;
transform-style: preserve-3d; /*重要*/
}
/* 触发翻转 */
.flip-container:hover .flipper{
transform: rotateY(180deg); }
.front ,.back{
position: absolute;
left:;
top:;
backface-visibility: hidden; /*重要*/
width: 100%;
height: 100%;
}
.front {
transform: rotateY(0deg);
z-index:;
background: red;
}
.back {
transform: rotateY(-180deg);
background: green;
}
  • 在最外层的容器元素上设置整个动画区域的透视(perspective)属性。
  • 当外层容器元素遇到鼠标悬停事件时,内部存放卡片的容器旋转180度。这里也是控制旋转速度的地方。如果将旋转值设置为-180deg,是反向旋转。
  • 表示卡片正面和背面的元素都要绝对定位,这样它们才能在相同的位置相互遮挡。它们的背面可视性(backface-visibility)属性设置为隐藏,这样每个卡片的背面在翻转时都是看不见的。
  • 将卡片的正面设置为一个比背面要高的z-index值,这样保证卡片的正面在最上面。
  • 将背面卡片旋转180度,这样让它扮演背面的角色。

照搬结束,其中CSS中注释了重要的需要特别注意。

perspective 属性定义 3D 元素距视图的距离,以像素计。直观现象就是内层的元素在翻转时会溢出外层边框,如果不写,或者属性值为0,则只在外层边框内变化。

且属性值需要特别注意和需要翻转的元素的宽高相适应,太少溢出很夸张,太多了和设为0的区别不大。区别效果如下图所示

transform-style: preserve-3d; transform-style 属性规定如何在 3D 空间中呈现被嵌套的元素(照抄自w3cschool)。

flip-container 和 flipper 都需要设置,flip-container不设置会导致溢出的3D效果缺少,flipper 不设置则容器翻转后,我们看到的还是front的背面,backface-visibility: hidden不能体现效果。

比较坑的是transform-style即使在IE11中都是不支持的。

所以还有一个兼容IE的方案,就是不翻转容器,而是同时翻转front和back,幸好IE还是支持backface-visibility: hidden的,所以翻转效果和上一个方案一致。

HTML如下:

<div class="flip-container">
<div class="front">here is content : AA</div>
<div class="back">here is content : BB</div>
</div>

由于直接翻转front和back,flipper就显得多余了,去掉了flipper。

CSS代码如下(经过多方试验,尽量支持各个浏览器,并降级处理了不支持CSS3翻转的浏览器,保留了切换效果)

.flip-container {
-webkit-perspective:;
-moz-perspective:;
-ms-perspective:;
perspective:;
-ms-transform: perspective(500px);
-moz-transform: perspective(500px);
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
margin: 30px;
display: inline-block;
border: 1px solid #aaa;
position: relative;
}
/*由于内层绝对定位导致高度缺少,这里显式设置了宽高*/
.flip-container, .front, .back {
width: 200px;
height: 200px;
} .flip-container:hover .front {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.flip-container:hover .back {
-webkit-transform: rotateY(0deg);
-moz-transform: rotateY(0deg);
-o-transform: rotateY(0deg);
-ms-transform: rotateY(0deg);
transform: rotateY(0deg);
z-index:; /* 降级处理不支持CSS3的浏览器,只是简单的将back上升盖住front */
} .front, .back {
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transition: 0.6s;
-moz-transition: 0.6s;
-o-transition: 0.6s;
-ms-transition: 0.6s;
transition: 0.6s;
position: absolute;
top: 0px;
left: 0px;
}
.front {
background: red;
z-index:;
}
.back {
background: green;
-webkit-transform: rotateY(-180deg);
-moz-transform: rotateY(-180deg);
-o-transform: rotateY(-180deg);
-ms-transform: rotateY(-180deg);
transform: rotateY(-180deg);
}

以上也许有许多不必要的兼容代码,水平有限了,欢迎交流更简练的写法。

还有一个小TIPS,在其他情况使用hover触发元素翻转时应如下使用,固定宽高的父元素触发,子元素翻转

.outer {
width: 200px;
height: 200px;
}
.inner {
transition: 0.6s;
}
.outer:hover .inner{
transform: rotateY(180deg);
}

如下直接对元素hover触发翻转会有很大的使用问题,因为元素翻转过程中,元素区域变小,光标就脱离元素了,于是元素还原,又触发hover变小,造成不顺畅

.inner {
width: 200px;
height: 200px;
  transition: 0.6s;
}
.inner:hover{
transform: rotateY(180deg);
}

关于CSS3 transform的更详细介绍,参见大神文章好吧,CSS3 3D transform变换,不过如此!

CSS3图片翻转切换案例及其中重要属性解析的更多相关文章

  1. CSS3图片翻转动画技术详解

    CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...

  2. css3图片翻转

    <!DOCTYPE> <html lang="en"> <head> <meta http-equiv="Content-Typ ...

  3. jquery.roundabout.js图片叠加3D旋转插件多功能图片翻转切换效果

    http://www.17sucai.com/pins/4880.html DEMO演示地址:http://www.17sucai.com/pins/demoshow/4880

  4. HTML5/CSS3图片左右切换弹性动画

    在线演示 本地下载

  5. 14款CSS3图片层叠切换动画

    在线演示 本地下载

  6. div 中图片溢出问题及 CSS3中图片翻转问题

    如果设置一个div 装两张以上的图片,如果不设置好div的宽度和高度,就会使图片溢出. 我们知道,div是可以由图片撑开其宽高的,也就是说如果只放一张图片的情况下,不设置div的宽高,div的宽高会默 ...

  7. 原生js+css3实现图片自动切换,图片轮播

    运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...

  8. tab切换效果 网站中的图片自动切换

    网站中的图片自动切换 今天上一套tab切换效果的代码 动图就自己实现吧! 下面贴HTML代码,大体分两部分,图片div和按钮div,代码很容易看懂~ <!DOCTYPE html> < ...

  9. 使用 jQuery & CSS3 实现翻转的作品集滑块

    作为 Web 开发人员,我想你一定见过各种各样的图片滑块效果.展示产品或者个人作品的方法有很多,其中之一是使用网格样式的滑块效果.在本教程中,我将分享如何使用 jQuery 和 CSS3 变换实现翻转 ...

随机推荐

  1. MongoDB学习系列(1)--入门介绍

    MongoDB是一款为Web应用程序设计的面向文档结构的数据库系统. MongoDB贡献者是10gen公司.地址:http://www.10gen.com 1.MongoDB主要特性: 1.1文档数据 ...

  2. 把《c++ primer》读薄(4-1 c和c++数组)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. c和c++的数组和指针都属于低级的复合数据类型,比如c++的数组,类似vector容器,指针类似迭代器.低级的数据类型优势是速度 ...

  3. 【数据挖掘】朴素贝叶斯算法计算ROC曲线的面积

    题记:          近来关于数据挖掘学习过程中,学习到朴素贝叶斯运算ROC曲线.也是本节实验课题,roc曲线的计算原理以及如果统计TP.FP.TN.FN.TPR.FPR.ROC面积等等.往往运用 ...

  4. 奇葩bug笔记

    一.Filemanager-master (jsp) 1.上传的html文件需要保证带外链的<script src="..."></script>标签在&l ...

  5. 关于Java中的final关键字

    Java中的final关键字是用来限制用户行为的,说白了,就是用来限制我们这些程序员的.final可以用来修饰:变量.方法.类. 1)Java final variable final用来修饰变量时, ...

  6. MySQL的多存储引擎架构

    支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将 ...

  7. C#程序开发中经常遇到的10条实用的代码

    1 读取操作系统和CLR的版本 OperatingSystem os = System.Environment.OSVersion; Console.WriteLine("Platform: ...

  8. iOS 视图控制器 (内容根据iOS编程编写)

    视图控制器是  UIViewController 类或其子类对象.每个视图控制器都负责管理一个视图层次结构,包括创建视图层级结构中的视图并处理相关用户事件,以及将整个视图层次结构添加到应用窗口. 创建 ...

  9. LINQ to SQL语句(16)之对象标识

    对象标识 运行库中的对象具有唯一标识.引用同一对象的两个变量实际上是引用此对象的同一实例.你更改一个变量后,可以通过另一个变量看到这些更改. 关系数据库表中的行不具有唯一标识.由于每一行都具有唯一的主 ...

  10. Paypal支付小记

    Paypal支付小记 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impo ...