CSS3实现翻转卡牌效果

哈希苔原
• 阅读 15584

今天在工作中遇到需求,需要用CSS3写一个卡片翻转效果,这个效果看起来简单,但是还是涉及到一些不常用的CSS3中的3D转换的属性以及实现该效果的思路,所以这里总结一下。

原文链接:http://mrzhang123.github.io/2016/08/17/FlipCards/

项目地址:https://github.com/MrZhang123/Practice/tree/master/FlipCards

需要的CSS3属性

perspective

目前浏览器都不支持perspective属性

在chrome和Safari中需要使用-webkit-perspective,而在Firefox中需要使用-moz-perspective来定义。

定义和用法

perspective属性定义3D元素距视图的距离,以像素计。该属性允许改变查看3D元素的视图。当为元素定义

perspective属时,其子元素会获得透视效果,而不是元素本身。换句话说,设置这个元素是为了给该元素的子元素用。

number:元素距离视图的距离,以像素计

none:默认值,与0相同。不设置透视

transform-style

Firefox支持transfrom-style属性。

Chrome、Safari和Opera支持代替的-webkit-transform-style属性。

定义和用法

transform-style属性固定如何在3D空间中呈现被嵌套的元素。一般给父元素设置让其所有子元素跟着父元素一起位置移动,一般会设置。

flat:子元素将不保留其3D位置(默认值)

perserve-3d:子元素将保留其3D位置

transition

IE10+、Firefox、Opera、Chrome均支持transition属性。Safari支持替代的-webkit-transition属性。但是IE9-不支持该属性。

定义和用法

transition属性是一个简写属性,用于设置四个过渡属性:

  • transiton-property:规定设置过渡效果的CSS属性的名称

  • transiton-duration:规定完成过渡效果需要多少秒或毫秒

  • transiton-timing-funciton:规定速度效果的速度曲线

  • transition-delay:规定过渡效果何时开始

transiton-duration必须设置,否则时长为0 ,不会有过渡效果

backface-visibility

只有IE10+和Firefox支持backface-visibility,Opera15+、Safari和Chrome支持替代的-webkit-backface-visibility

定义和用法

backface-visibility属性定义当前元素不面向屏幕时是否可见,如果元素在旋转后不希望看到背面,则可以使用。

visible:背面是可见的(默认值)

hidden:背面是不可见的

实现的思路

要实现类似的翻牌效果,首先我们需要有一张可以翻的牌,这张牌由两个元素重叠组成,位于上层正面我们看到,而位于下层的背面我们看不到并且本身是绕Y轴旋转过的,这样,当鼠标移动上去后,同时让正面和背面执行旋转就可以实现翻牌效果。

实现

基本结构代码如下:

<div id="content">
    <ul>
        <li>
            <a href="#" >
                <div>
                    <h3>测试正面1</h3>
                    <p>文字文字文字文字文字文字文字文字文字文字文字</p>
                </div>
                <div>
                    <h3>测试背面1</h3>
                    <p>文字文字文字文字文字文字文字文字文字文字文字</p>
                </div>
            </a>
        </li>        
    </ul>
</div>
ul,li {
    margin:0;
    padding:0;
    list-style:none;
}
#content ul li{
    width: 225px;
    height: 180px;
}
#content ul li a{
    position: relative;
    display: block;
    width: 100%;
    height: 100%;
}
#content ul li a > div{
    position: absolute;
    left: 0;
    height: 0;
    width: 100%;
    height: 100%;
    color: #fff;
}
#content ul li a div:first-child{
    background-color: rgb(255, 64, 129);
    z-index:2;
}
#content ul li a div:last-child{
    background:rgb(0, 188, 212);
    z-index:1;
}
#content ul li a div h3{
    margin: 0 auto 15px;
    padding: 15px 0;
    width: 200px;
    height: 16px;
    line-height: 16px;
    font-size: 14px;
    text-align: center;
    border-bottom: 1px #fff dashed;
}

#content ul li a div p{
    padding: 0 10px;
    font-size: 12px;
    text-indent: 2em;
    line-height: 18px;
}

这样就让两个div叠在一起了,但是如果要进行翻转的话,首先是需要将背面本身就翻过去,当鼠标放上去之后翻转过来,让我们看到,所以我们需要给背面添加翻转180°的属性,鼠标放上去之后让它翻转到0°,同时为保证每个浏览器渲染统一,给正面加一个翻转0°,鼠标移动上去之后翻转-180°,并且是一个动画,所以要添加过渡。所以给正面背面添加CSS如下:

#content ul li a > div{
    -webkit-transition:.8s ease-in-out;
    -moz-transition:.8s ease-in-out;
}
#content ul li a div:first-child{
    -webkit-transform:rotateY(0);
    -moz-transform:rotateY(0);
}
#content ul li a div:last-child{
    -webkit-transform:rotateY(180deg);
    -moz-transform:rotateY(180deg);
}
#content ul li a:hover div:first-child{
    -webkit-transform:rotateY(-180deg);
    -moz-transform:rotateY(-180deg);
}
#content ul li a:hover div:last-child{
    -webkit-transform:rotateY(0);
    -moz-transform:rotateY(0);
}

在添加这些CSS3属性后,可以实现翻转,但是发现只看到正面,没有看到背面,这又是为什么呢,前面提到有一个属性backface-visibility,这个属性用于控制在翻转后,元素的背面是否可见,默认是可见的,所以就会挡着背面那个元素,我们需要手动设置元素翻转后背面不可见,所以需要设置:

#content ul li a > div{
     -webkit-backface-visibility: hidden;
     -moz-backface-visibility: hidden;
}

这样设置之后,由于正面的元素在翻转后背面不可见,我们就可以看到背面的元素了。

但是,仔细观察会发现这个翻转似乎并不是那么立体,似乎在两条平行线之间实现了翻转,所以我们需要设置一个观察点距离视图的距离,这时候就需要给父元素添加perspective属性,这个属性的值一般为800px ~ 1000px,这个范围内的值会看上去合理。所以给父元素添加:

#content ul li a{
    -webkit-perspective: 800px;
    -moz-perspective: 800px;
}

至此,就实现了一个翻转卡牌的效果,但是这里需要解决一个问题,因为perspective属性不被IE支持(Microsoft Edge支持),所以需要进行降级,我的做法是直接显示隐藏。那么如何识别IE9+浏览器呢?在stackoverflow中我找到了答案:

附:CSS中识别各类IE的方法

IE6

* html .ie6{
    property:value;
}

or

html .ie6{
    _property:value;
}

IE7

*+html .ie7{
    property:value;
}

or

*:first-child+html ie7{
    property:value;
}

IE6 and IE7

@media screen\9{
    ie67{property:value;}
}

or

.ie67{ *property:value;}

or

.ie67{ #property:value;}

IE6,7 and 8

@media \0screen\,screen\9{
    ie678{property:value;}
}

IE8

html>/**/body .ie8{property:value;}

or

@media \0screen{
    ie8{property:value;}
}

只在IE8标准模式

.ie8{property/*\**/:value\9;}

IE8,9 and 10

@media screen\0{
    ie8910{property:value;}
}

IE9 only

@media screen and (min-width:0\0) and (min-resolution: .001dpcm){
    /*IE9 CSS*/
    .ie9{property:value;}
}

IE9+

@media screen and (min-width:0\0) and (min-resolution: +72dpi){
    /*IE9+ CSS*/
    .ie9up{property:value;}
}

IE9 and 10

@media screen and (min-width:0){
    .ie910{property:value;}
}

IE10 only

_:-ms-lang(x), ie10 {property:value;}

IE10+

_:-ms-lang(x), ie10up{property:value;}

or

@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){
    .ie10up{property:value;}
}

IE11+

_:-ms-fullscreen, :root .ie11up{property:value;}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
九路 九路
4年前
一篇文章带你了解CSS 渐变知识
CSS3渐变使您能够是你的背景颜色在两个或多个颜色之间平滑过渡。早些时候,你必须使用图像实现这些效果。然而,通过使用CSS3渐变可以减少下载时间和带宽的使用.此外,缩放的元素在缩放时看起来更好,因为渐变是由浏览器生成的。一、浏览器支持表中的数字指定完全支持该属性的第一个浏览器版本。(来源于百度)数字后面的w
菜园前端 菜园前端
2年前
你真的了解的CSS3盒模型和CSS3特性知识吗
原文链接:什么是CSS3?CSS3是CSS一个新的标准,直接理解为是CSS的升级版,里面新增了很多样式(特性)。CSS3盒子模型:::warningCSS3盒子模型必须要掌握,否则你在实际开发中遇到样式错乱很难排查问题。:::旧版的IE浏览器与其它浏览器解
徐小夕 徐小夕
4年前
如何使用css3实现一个类在线直播的队列动画
之前在群里有个朋友问了这样一个问题,就是如何在小程序中实现类似直播平台的用户上线时的队列动画?作为一名前端工程师,解决方案无非以下2种:1.使用javascript根据条件来控制元素的样式实现队列动画2.用纯css3配合数据驱动模型来实现.大家都知道在现代的Web开发中,我们能使用Css实现的效果尽量不要用Js,所以我们应该优先考虑用C
Chase620 Chase620
4年前
CSS3动画之逐帧动画
CSS3动画开发指南第二弹,剥丝抽茧为你解析逐帧动画,同时放送从实战经验中总结出来的逐帧动画使用技巧。什么是逐帧动画要了解CSS3逐帧动画,首先要明确什么是逐帧动画。看一下维基百科中的定义:定格动画,又名逐帧动画,是一种动画技术,其原理即将每帧不同的图像连续播放,从而产生动画效果。简而言之,实现逐帧动画需要两个条件:(1)相关联
徐小夕 徐小夕
4年前
css3实战汇总(附源码)
本文是继上一篇文章用css3实现惊艳面试官的背景即背景动画(高级附源码)(https://juejin.im/post/6844903950123188237)的续篇也是本人最后一篇介绍css3技巧的文章,因为css这块知识难点不是很多,更多的在于去熟悉css3的新特性和基础理论知识。所以写这篇文章的目的一方面是对自己工作中一些css高级技巧的总结,另一
Wesley13 Wesley13
3年前
CSS实现背景色渐变
一、使用CSS3属性/ for firefox /backgroundimage: mozlineargradient(top,fefefe,ebebeb);/ for webkit core /backgroundimage: webkitgradient(linear,0 0,0 100
Wesley13 Wesley13
3年前
CSS3 文本效果
CSS3文本效果CSS3中包含几个新的文本特征。在本章中您将了解以下文本属性:textshadowwordwrap浏览器支持!(http://static.oschina.net/uploads/space/2016/0123/124344_Ps
Wesley13 Wesley13
3年前
CSS3实现各种表情
 CSS3实现各种表情 效果图: !(https://oscimg.oschina.net/oscnet/3e7c1e03814ab2c1df6e3058e39715c9936.jpg) 代码如下,复制即可使用:<!DOCTYPEhtml<html<head<title</title