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

网上有很多其它的教材,但里面添加了很多多余的代码样式,需要读者去分清哪些是必要的,那些是无用的;本文避免了这些问题,只列出了必要的CSS代码,你可以在其上添加自己喜欢的风格来美化这些卡片。

HTML代码

实现正反面效果的HTML代码,估计你也能想到应该是这样的:

<div class="flip-container" ontouchstart="this.classList.toggle('hover');">
<div class="flipper">
<div class="front">
<!-- 前面内容 -->
</div>
<div class="back">
<!-- 背面内容 -->
</div>
</div>
</div>

正如你想到的,应该有两个容器,分别存放卡片“前面”和“背面”,通过CSS,我们会指定这两个容器元素自己的作用。还有需要注意的是ontouchstart这段js,它能让你使用触屏来触发翻转动作。显然,你应该把这段代码单独提取出来,让JavaScript代码放到一起。

CSS代码

/* entire container, keeps perspective */
.flip-container {
perspective:;
}
/* flip the pane when hovered */
.flip-container:hover .flipper, .flip-container.hover .flipper {
transform: rotateY(180deg);
} .flip-container, .front, .back {
width: 320px;
height: 480px;
} /* flip speed goes here */
.flipper {
transition: 0.6s;
transform-style: preserve-3d; position: relative;
} /* hide back of pane during swap */
.front, .back {
backface-visibility: hidden; position: absolute;
top:;
left:;
} /* front pane, placed above back */
.front {
z-index:;
} /* back, initially hidden pane */
.back {
transform: rotateY(180deg);
}

下面是大概的整个过程的原理:

  • 在最外层的容器元素上设置整个动画区域的透视(perspective)属性。
  • 当外层容器元素遇到鼠标悬停事件时,内部存放卡片的容器旋转180度。这里也是控制旋转速度的地方。如果将旋转值设置为-180deg,是反向旋转。
  • 表示卡片正面和背面的元素都要绝对定位,这样它们才能在相同的位置相互遮挡。它们的背面可视性(backface-visibility)属性设置为隐藏,这样每个卡片的背面在翻转时都是看不见的。
  • 将卡片的正面设置为一个比背面要高的z-index值,这样保证卡片的正面在最上面。
  • 将背面卡片旋转180度,这样让它扮演背面的角色。

这就是全部这些代码的作用!你把这段代码放到你的网页里,然后修饰一下卡片的样式就行了!

注:对卡片元素的某些属性设置一些特定的值(例如)(like overflow: hidden)会导致其子元素丧失3D变换功能。我认可他的观点,因为正是在本文的例子中我正好遇到了overflow: hidden相关的麻烦,它导致了3D变换子元素全都出现在了同一个平面上,有几个是被旋转了180度。

触发CSS翻转

如果你喜欢用JavaScript来触发翻转动作,下面这个简单的css样式类就能帮你做到这样:

.flip-container:hover .flipper, .flip-container.hover .flipper, .flip-container.flip .flipper {
transform: rotateY(180deg);
}

使用javascript给容器元素添加这个css flip类就能触发卡片翻转——不需要用户悬停鼠标在上面。用document.querySelector("#myCard").classList.toggle("flip")实现它!

CSS竖向翻转

执行竖向翻转也很简单,跟横向翻转一样,只需要修改一下 transform-origin的值,然后让它按X轴旋转。

.vertical.flip-container {
position: relative;
} .vertical .back {
transform: rotateX(180deg);
} .vertical.flip-container .flipper {
transform-origin: 100% 213.5px; /* 高的一半 */
} .vertical.flip-container:hover .flipper {
transform: rotateX(-180deg);
}

注意这里用的是rotateX,而不是之前的rotateY

让IE支持这种动画技术

需要针对IE对这段标准的卡片翻转代码进行特殊的修改,因为IE还没有实现现代浏览器中的transform功能。基本的做法就是对正面和背面两个卡片同时分别翻转:

/* entire container, keeps perspective */
.flip-container {
perspective:;
transform-style: preserve-3d;
}
/* UPDATED! flip the pane when hovered */
.flip-container:hover .back {
transform: rotateY(0deg);
}
.flip-container:hover .front {
transform: rotateY(180deg);
} .flip-container, .front, .back {
width: 320px;
height: 480px;
} /* flip speed goes here */
.flipper {
transition: 0.6s;
transform-style: preserve-3d; position: relative;
} /* hide back of pane during swap */
.front, .back {
backface-visibility: hidden;
transition: 0.6s;
transform-style: preserve-3d; position: absolute;
top:;
left:;
} /* UPDATED! front pane, placed above back */
.front {
z-index:;
transform: rotateY(0deg);
} /* back, initially hidden pane */
.back {
transform: rotateY(-180deg);
} /*
Some vertical flip updates
*/
.vertical.flip-container {
position: relative;
} .vertical .back {
transform: rotateX(180deg);
} .vertical.flip-container:hover .back {
transform: rotateX(0deg);
} .vertical.flip-container:hover .front {
transform: rotateX(180deg);
}

使用上面的这段代码,IE10里也能正确的进行卡片翻转了!

这个CSS卡片翻转动画技术一直是一个经典的案例,代表着CSS动画能够实现的效果,甚至3DCSS动画能实现的强大效果。优点就是使用的代码很少很简单。对于制作HTML5动画来说这种效果非常的实用,可以说完美。

参考地址



CSS3图片翻转动画技术详解的更多相关文章

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

    因为不断有人问我,现在我补充一下:IE是支持这种技术的!尽管会很麻烦.需要做的是旋转front和back元素,而不是旋转整个容器元素.如果你使用的是最新版的IE,可以忽略这一节.IE10+是支持的,I ...

  2. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  3. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  4. IPv6技术详解:基本概念、应用现状、技术实践(下篇)

    本文来自微信技术架构部的原创技术分享. 1.前言 在上篇<IPv6技术详解:基本概念.应用现状.技术实践(上篇)>,我们讲解了IPV6的基本概念. 本篇将继续从以下方面展开对IPV6的讲解 ...

  5. IPv6技术详解:基本概念、应用现状、技术实践(上篇)

    本文来自微信技术架构部的原创技术分享. 1.前言 普及IPV6喊了多少年了,连苹果的APP上架App Store也早已强制IPV6的支持,然并卵,因为历史遗留问题,即使在IPV4地址如果饥荒的情况下, ...

  6. Protocol Buffer技术详解(数据编码)

    Protocol Buffer技术详解(数据编码) 之前已经发了三篇有关Protocol Buffer的技术博客,其中第一篇介绍了Protocol Buffer的语言规范,而后两篇则分别基于C++和J ...

  7. CSS3盒模型display:box详解

    display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box ...

  8. CDN学习笔记二(技术详解)

    一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...

  9. CDN技术详解及实现原理

    CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...

随机推荐

  1. Mesos源码分析(15): Test Executor的运行

    Test Executor的代码在src/examples/test_executor.cpp中   int main(int argc, char** argv) {   TestExecutor ...

  2. 多媒体文件格式(一):MP4 格式

    在互联网常见的格式中,跨平台最好的应该就属MP4文件了.因为MP4文件既可以在PC平台的Flashplayer中播放,又可以在移动平台的Android.iOS等平台中进行播放,而且使用系统默认的播放器 ...

  3. JDK设计模式之——装饰者模式

    假定已经有三个类A,B和C他们的继承关系如下          ClassA Class B extends A  Class C extends A  想进一步扩展类B和类C的功能,新增三个方法 m ...

  4. [Swift]LeetCode110. 平衡二叉树 | Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  5. [Swift]LeetCode450. 删除二叉搜索树中的节点 | Delete Node in a BST

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

  6. zuul进阶学习(二)

    1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ...

  7. the python challenge闯关记录(9-16)

    9 第九关 是一张图,上面有很多的黑点,查看网页源代码发现了上一关的提示: 还发现了一大串的数字 感觉又是一个使用PIL库进行图像处理的题,百度后知道要将这些点连接起来并重新画图.但是不能在原始图上修 ...

  8. 专访 | 新浪架构师:0-5年Java工程师的职业规划如何做?

    经历了2018年末的阵痛,大家都积攒着一股暗劲蠢蠢欲动. 3月初即将迎来2019年互联网行业换工作的大潮,技术工程师的升级换位对于一家互联网公司来说无疑是命脉般的存在——技术强则公司强! 如何做一个抢 ...

  9. 第四周 IP通信基础回顾

    传输层的作用:分割上层数据:在应用主机程序之间建立到端的连接:流量控制:面向连接与面向非连接. URG=1,紧急指针字段有效. 窗口字段- 占2个字节,用来让对方设置发送窗口的依据,单位为字节. TC ...

  10. Java操作符真的简单到易如反掌?

    之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...