文章导航

CSS3 perspective详解

2018-6-1 10:51| 作者: admin| 查看: 4494| 评论: 2|来自: 蚂蚁部落

perspective属性在3D变换(transform)中至关重要,否则可能无法达到预期的效果。

一.现象描述:

它通常要配合rotateX()、rotateY()、rotateZ()和translateZ()一起使用,下面结合图示做一下介绍:

(1).利用rotateX()围绕x轴旋转:

a:3:{s:3:\"pic\";s:43:\"portal/201712/01/003137pjcti4cczvrnnzsv.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上面截图中,红色矩形围绕着虚线轴(x轴)旋转。

可以看到虚线两端的矩形尺寸有所变化,这符合视觉效果,perspective属性的作用得以体现。

(2).利用rotateY()围绕Y轴旋转:

a:3:{s:3:\"pic\";s:43:\"portal/201712/01/003905h7xkbb5hd8ueadbq.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

截图中,红色矩形围绕着虚线轴(Y轴)旋转。

与rotateX()相同,虚线两端的矩形尺寸有所变化,符合视觉效果。

(3).利用rotateZ()围绕z轴旋转:

a:3:{s:3:\"pic\";s:43:\"portal/201712/01/004449cvs4hi9cmnsz9cj3.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

围绕Z轴旋转,并没有和围绕X轴和Y轴旋转类似,矩形没有发生形状上的变化。

根据透视原理,垂直于视线的平面不会发生变形。

二.透视:

1.透视分为以下三种:

(1).单点透视。

(2).两点透视。

(3).三点透视。

单点透视只有一个灭点,两点透视有两个灭点,三点透视则有三个灭点。

2.灭点:

指的是立体图形各条边的延伸线所产生的相交点,透视点的消失点。

a:3:{s:3:\"pic\";s:43:\"portal/201712/01/005428i9i9992gn299a992.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上面内容来自百科,再来看一个比较现实的例子:

a:3:{s:3:\"pic\";s:43:\"portal/201712/01/005618akyzvm8jyccvsnva.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

站在远处,长廊看起来会相交起来,这就是灭点。

再回到文章前半段rotateX()和rotateY(),矩形如果无限延伸的话,也会相交,图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201712/01/010436jdwxjcgxcd1f2zco.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

黄色线相交的地方就是灭点,很容易理解。

总结:perspective可以确定元素透视灭点位置的。

perspective属性值越大,元素的变形就越小,灭点与元素之间的距离越大。

perspective属性值越小,元素的变形就越大,灭点与元素之间的距离越小。

代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!DOCTYPE html>   
<html>   
<head>   
<meta charset=" utf-8">   
<meta name="author" content="http://www.softwhy.com/" />   
<title>蚂蚁部落</title>   
<style> 
#box{ 
  position:relative; 
  height:150px; 
  width:150px; 
  margin-left:450px; 
  margin-top:250px; 
  padding:10px; 
  border:1px solid black; 
  perspective:500px; 
} 
#inner{ 
  width:100px; 
  height:100px; 
  text-align:center; 
  line-height:100px; 
  font-size:12px; 
  position:absolute; 
  border:1px solid black; 
  background-color:yellow; 
  transform:rotateX(30deg);   
} 
table{    
  font-size:12px;    
  width:500px;    
  margin-left:280px;  
  text-align:left;  
}    
.left{ 
  text-align:right; 
  width:150px; 
} 
</style> 
<script type="text/javascript">   
function change(value){   
  var obox=document.getElementById('box');   
  var oshow=document.getElementById('show');   
     
  obox.style.perspective=value+"px";
  oshow.innerHTML=value;   
}  
window.onload=function(){  
  var range=document.getElementById("range");  
  range.onmousemove=function(){  
    change(this.value);  
  }  
}  
</script>  
</head> 
<body> 
<div id="box"> 
  <div id="inner">蚂蚁部落</div> 
</div> 
<table>   
  <tr>   
    <td class="left">perspective值:</td>   
    <td><input type="range" min="100" step="1" max="800" id="range" value="500"/></td>   
  </tr>   
  <tr>   
    <td class="left">perspective:</td>   
    <td>(<span id="show">500</span>)</td>   
  </tr>   
</table>   
</body>   
</html>

拖动下面的滑轴可以演示perspective的作用。

三.translateZ():

最后再介绍一下与translateZ()配合使用,代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!DOCTYPE html>  
<html>  
<head>  
<meta charset=" utf-8">  
<meta name="author" content="http://www.softwhy.com/" />  
<title>蚂蚁部落</title>  
<style>
#box{
  position:relative;
  height:150px;
  width:150px;
  margin-left:450px;
  margin-top:250px;
  padding:10px;
  border:1px solid black;
  perspective:1200px;
}
#ant{
  width:100px;
  height:100px;
  text-align:center;
  line-height:100px;
  font-size:12px;
  border:1px solid black;
  background-color:yellow;
  transform:translate3d(0px,0px,0px);
}
table{   
  font-size:12px;   
  width:500px;   
  margin-left:220px; 
  text-align:left; 
}   
.left{
  text-align:right;
  width:150px;
}
</style>
<script type="text/javascript">  
function change(z){  
  var odiv = document.getElementById("ant");
  var oshow = document.getElementById("show");
  odiv.style.transform = "translate3d(0px, 0px," + z + "px)";
  oshow.innerHTML = z_range.value;
} 
window.onload=function(){ 
  var z_range = document.getElementById("z_range");
  z_range.onmousemove = function () {
    change(z_range.value);
  }
} 
</script> 
</head>
<body>
<div id="box">
  <div id="ant">蚂蚁部落</div>
</div>
<table>   
  <tr>
    <td class="left">z轴位移:</td>
    <td><input type="range" min="-200" step="1" max="200" id="z_range" value="0" /></td>
  </tr>    
  <tr>  
    <td class="left">z:</td>  
    <td>(<span id="show">0</span>)</td>  
  </tr>  
</table>  
</body>  
</html>

拖动下面的滑轴,可以控制元素在z轴上的远近。

translateZ等于0 时候,在Z轴上就是它本来的位置,既没有变大也没有变小,因为网页最终渲染结果都是该元素在Z轴坐标为0的坐标系上的映射,Z轴坐标为0的时候,也就无法产生映射,看到的就是原始大小。

translateZ变大时,元素在视觉上变大,因为它相当于元素距离我们变近了。

perspective值代表眼睛与元素原点的距离,translateZ值越大,越接近perspective值时,元素视觉上会越来越大,当translateZ值大于等于perspective值时,元素就消失,因为此元素跑到假设的眼睛位置后面去了。

需要注意的几点:

(1).此属性要应用于舞台元素,也就是3D转换元素的父元素。

(2).此属性只影响3D转换元素,对于非3D转换无效。 

perspective与perspective()功能一样,使用方式有区别,参阅CSS3 perspective(n)一章节。


鲜花
2

握手

雷人

路过

鸡蛋

刚表态过的朋友 (2 人)

发表评论

最新评论

引用 梅长苏 2018-11-3 23:19
确实很好的文章
引用 老汉 2018-8-13 23:15
网上再没有一篇文章比这个介绍的更加清晰了

查看全部评论(2)

返回顶部