详解CSS3的perspective属性设置3D变换距离的方法


Posted in HTML / CSS onMay 23, 2016

perspective属性对于3D变形来说至关重要。该属性会设置查看者的位置,并将可视内容映射到一个视锥上,继而投到一个2D视平面上。如果不指定透视,则Z轴空间中的所有点将平铺到同一个2D视平面中,并且变换结果中将不存在景深概念。

上面的描述可能让人难以理解一些,其实对于perspective属性,我们可以简单的理解为视距,用来设置用户和元素3D空间Z平面之间的距离。而其效应由他的值来决定,值越小,用户与3D空间Z平面距离越近,视觉效果更令人印象深刻;反之,值越大,用户与3D空间Z平面距离越远,视觉效果就很小。

在3D变形中,对于某些变形,例如下面的示例演示的沿Z轴的变形,perspective属性对于查看变形的效果来说必不可少。

我们先来看一个简单的实例,制作一个扑克牌3D旋转效果,并且一个在扑克牌的父元素添加了视距perspective,而另一个却没有设置:

HTML

XML/HTML Code复制内容到剪贴板
  1. <div>  
  2.     <img src="images/cardKingClub.png" alt="" width="142" height="200" />  
  3.     <img src="images/cardKingClub.png" alt="" width="142" height="200" />  
  4. </div>  
  5. <div>  
  6.     <img src="images/cardKingClub.png" alt="" width="142" height="200" />  
  7.     <img src="images/cardKingClub.png" alt="" width="142" height="200" />  
  8. </div>  

CSS

CSS Code复制内容到剪贴板
  1. div {   
  2.     width500px;   
  3.     height300px;   
  4.     margin30px auto;   
  5.     positionrelative;   
  6.     backgroundurl(images/bg-grid.jpg) no-repeat center center;   
  7.     background-size: 100% 100%;   
  8. }   
  9. div img {   
  10.     positionabsolute;   
  11.     top: 50%;   
  12.     left: 50%;   
  13.     margin-left: -71px;   
  14.     margin-top: -100px;    
  15.     transform-origin: bottombottom;   
  16. }   
  17. div img:nth-child(1){   
  18.     opacity: .5;   
  19.     z-index: 1;   
  20. }   
  21. div img:nth-child(2){   
  22.     z-index: 2;   
  23.     transform: rotateX(45deg);   
  24. }   
  25. div:nth-of-type(2){   
  26.     perspective: 500px;   
  27. }  

其效果如下:
详解CSS3的perspective属性设置3D变换距离的方法

上图的效果完全说明了一切。父节点没有设置perspective的情况下,梅花King的3D旋转效果不明显,而在父节点设置perspective后,梅花King才像个3D旋转。

上例简单的演示了perspective的使用方法,我们回过头来,看看perspective的使用语法:

CSS Code复制内容到剪贴板
  1. perspective:none | <length>  

perspective属性包括两个属性:none和具有单位的长度值。其中perspective属性的默认值为none,表示无限的角度来看3D物体,但看上去是平的。另一个值<length>接受一个长度单位大于0的值。而且其单位不能为百分比值。<length>值越大,角度出现的越远,从而创建一个相当低的强度和非常小的3D空间变化。反之,此值越小,角度出现的越近,从而创建一个高强度的角度和一个大型3D变化。

比如你站在10英尺和1000英尺的地方看一个10英尺的立方体。在10英尺的地方,你距离立方体是一样的尺寸。因此视角转变远远大于站在1000英尺处的,立体尺寸是你距离立方体距离的百分之一。同样的思维适用于perspective的<length>值。我们一起来看一个实例,来加强这方面的理解:

HTML

XML/HTML Code复制内容到剪贴板
  1. <div class="wrapper w2">  
  2.     <div class="cube">  
  3.         <div class="side  front">1</div>  
  4.         <div class="side   back">6</div>  
  5.         <div class="side  right">4</div>  
  6.         <div class="side   left">3</div>  
  7.         <div class="side    top">5</div>  
  8.         <div class="side bottom">2</div>  
  9.     </div>  
  10. </div>  
  11. <div class="wrapper w1">  
  12.     <div class="cube">  
  13.         <div class="side  front">1</div>  
  14.         <div class="side   back">6</div>  
  15.         <div class="side  right">4</div>  
  16.         <div class="side   left">3</div>  
  17.         <div class="side    top">5</div>  
  18.         <div class="side bottom">2</div>  
  19.     </div>  
  20. </div>  

CSS

CSS Code复制内容到剪贴板
  1. .wrapper {   
  2.     width: 50%;   
  3.     floatleft;   
  4. }   
  5. .cube {   
  6.     font-size: 4em;   
  7.     width: 2em;   
  8.     margin: 1.5em auto;   
  9.     transform-style: preserve-3d;   
  10.     transform: rotateX(-40deg) rotateY(32deg);   
  11. }   
  12. .side {   
  13.     positionabsolute;   
  14.     width: 2em;   
  15.     height: 2em;   
  16.     background: rgba(255, 99, 71, 0.6);   
  17.     border1px solid rgba(0, 0, 0, 0.5);   
  18.     colorwhite;   
  19.     text-aligncenter;   
  20.     line-height: 2em;   
  21. }   
  22. .front {   
  23.     transform: translateZ(1em);   
  24. }   
  25. .top {   
  26.     transform: rotateX(90deg) translateZ(1em);   
  27. }   
  28. .rightright {   
  29.     transform: rotateY(90deg) translateZ(1em);   
  30. }   
  31. .left {   
  32.     transform: rotateY(-90deg) translateZ(1em);   
  33. }   
  34. .bottombottom {   
  35.     transform: rotateX(-90deg) translateZ(1em);   
  36. }   
  37.   
  38. .back {   
  39.     transform: rotateY(-180deg) translateZ(1em);   
  40. }   
  41. .w1 {   
  42.     perspective: 100px;   
  43. }   
  44. .w2{   
  45.     perspective: 1000px;   
  46. }  

效果如下图所示:
详解CSS3的perspective属性设置3D变换距离的方法

依据上面的介绍,我们可对perspective取值做一个简单的结论:

 1.perspective取值为none或不设置,就没有真3D空间。
 2.perspective取值越小,3D效果就越明显,也就是你的眼睛越靠近真3D。
 3.perspective的值无穷大,或值为0时与取值为none效果一样。
为了更好的理解perspective属性,我们很有必要把他和translateZ的关系结合起来。其实也可以把perspective的值简单的理解为人的眼睛到显示器的距离,而translate就是3D物体距离源点的距离,下面引用W3C的一张图来解说perspective和translateZ的关系。
详解CSS3的perspective属性设置3D变换距离的方法

上图显示了perspective属性和translateZ的位置比例。要顶部的图,Z是半个d,为了使用原始圆(轮廓)看起来出现在Z轴上(虚线圆),画布上的实体圆将扩大两部,如浅蓝色的圆。在底部图中显示,圆按比例缩小,致使虚线圆出现在画布后面,并且z的大小是距原始位置三分之一。

在3D变形中,除了perspective属性可以激活一个3D空间之外,在3D变形的函数中的perspective()也可以激活3D空间。他们不同的地方是:perspective用在舞台元素上(变形元素们的共同父元素);perspective()就是用在当前变形元素上,并且可以与其他的transform函数一起使用。例如,我们可以把:

CSS Code复制内容到剪贴板
  1. .stage {   
  2.     perspective: 600px  
  3. }  

写成:

CSS Code复制内容到剪贴板
  1. .stage .box {   
  2.     transform: perspective(600px);   
  3. }  

来看一个简单示例:

HTML

XML/HTML Code复制内容到剪贴板
  1. <div class="stage">  
  2.     <div class="container">  
  3.         <img src="images/cardKingClub.png" alt="" width="142" height="200" />  
  4.     </div>  
  5. </div>  
  6. <div class="stage">  
  7.     <div class="container">  
  8.         <img src="images/cardKingClub.png" alt="" width="142" height="200" />  
  9.     </div>  
  10. </div>  

CSS

CSS Code复制内容到剪贴板
  1. .stage {   
  2.     width500px;   
  3.     height300px;   
  4.     margin30px auto;   
  5.     positionrelative;   
  6.     backgroundurl(images/bg-grid.jpg) no-repeat center center;   
  7.     background-size: 100% 100%;   
  8. }   
  9. .container {   
  10.     positionabsolute;   
  11.     top: 50%;   
  12.     left: 50%;   
  13.     width142px;   
  14.     height200px;   
  15.     border1px dotted orange;   
  16.     margin-left: -71px;   
  17.     margin-top: -100px;    
  18. }   
  19. .container img{   
  20.     transform: rotateY(45deg);   
  21. }   
  22. .stage:nth-child(1) .container{   
  23.     perspective: 600px;   
  24. }   
  25. .stage:nth-child(2) img {   
  26.     transform:perspective(600px) rotateY(45deg);   
  27. }  

效果如下所示:
详解CSS3的perspective属性设置3D变换距离的方法

上图效果可以看出,虽然书写的形式,属性名称不一致,但是效果却一样。

虽然perspective属性和perspective()函数所起的功能是一样的,但其取值以及以运用的对像有所不同:

1. perspective属性可以取值为none或长度值;而perspective()函数取值只能大于0,如果取值为0或比0小的值,将无法激活3D空间;
2.perspective属性用于变形对像父元素;而perspective()函数用于变形对像自身,并和transform其他函数一起使用。
 

perspective-origin属性

perspective-origin属性是3D变形中另一个重要属性,主要用来决定perspective属性的源点角度。它实际上设置了X轴和Y轴位置,在该位置观看者好像在观看该元素的子元素。

perspective-origin属性的使用语法也很简单:

复制代码
代码如下:
perspective-origin:[<percentage> | <length> | left | center | right | top | bottom] | [[<percentage> | <length> | left | center | right] && [<percentage> | <length> | top | center | bottom]]

该属性的默认值为“50% 50%”(也就是center),其也可以设置为一个值,也可以设置为两个长度值:

 第一个长度值指定相对于元素的包含框的X轴上的位置。它可以是长度值(以受支持的长度单位表示)、百分比或以下三个关键词之一:left(表示在包含框的X轴方向长度的0%),center(表示中间点),或right(表示长度的100%)。
 第二个长度值指定相对于元素的包含框的Y轴上的位置。它可以是长度值、百分比或以下三个关键词之一:top(表示在包含框的Y轴方向长度的0%),center(表示中间点),或bottom(表示长度的100%)。
注意,为了指转换子元素变形的深度,perspective-origin属性必须定义父元素上。通常perspective-origin属性本身不做任何事情,它必须被定义在设置了perspective属性的元素上。换句话说,perspective-origin属性需要与perspective属性结合起来使用,以便将视点移至元素的中心以外位置,如下图所示:
详解CSS3的perspective属性设置3D变换距离的方法

往往我们看一样东西不可能一直都在中心位置看,想换个角度,换个位置一看究竟,这个时候就离不开perspective-origin这个属性,下面来自于W3C官网的图可以简单阐述这一观点:
详解CSS3的perspective属性设置3D变换距离的方法

HTML / CSS 相关文章推荐
利用CSS3的checked伪类实现OL的隐藏显示的方法
Dec 18 HTML / CSS
收集的22款给力的HTML5和CSS3帮助工具
Sep 14 HTML / CSS
浅析rem和em和px vh vw和% 移动端长度单位
Apr 28 HTML / CSS
纯CSS3实现运行时钟的示例代码
Jan 25 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
Jul 12 HTML / CSS
canvas像素画板的实现代码
Nov 21 HTML / CSS
你可能不熟练的十个前端HTML5经典面试题
Jul 03 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
Apr 24 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
May 15 HTML / CSS
Canvas图片分割效果的实现
Jul 29 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
Feb 05 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
Jun 11 HTML / CSS
CSS3中设置3D变形的transform-style属性详解
May 23 #HTML / CSS
css 元素选择器的简单实例
May 23 #HTML / CSS
css sprite简单实例
May 23 #HTML / CSS
CSS3中的Transition过度与Animation动画属性使用要点
May 20 #HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
May 17 #HTML / CSS
CSS3中各种颜色属性的使用教程
May 17 #HTML / CSS
使用CSS3美化HTML表单的技巧演示
May 17 #HTML / CSS
You might like
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python操作CouchDB数据库简单示例
2015/03/10 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Python 绘制可视化折线图
2020/07/22 Python
Flask处理Web表单的实现方法
2021/01/31 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
物业工作计划书
2014/01/10 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
幸福终点站观后感
2015/06/04 职场文书
学生会任命书范本
2015/09/21 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
MySQL的索引你了解吗
2022/03/13 MySQL