CSS 属性 perspective指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果。 z>0 的三维元素比正常大,而 z<0 时则比正常小,大小程度由该属性的值决定。
三维元素在观察者后面的部分不会绘制出来,即 z 轴坐标值大于 perspective 属性值的部分。
默认情况下,消失点位于元素的中心,但是可以通过设置 perspective-origin 属性来改变其位置。
perspective-origin:50% 50%; /*默认值*/
perspective-origin:left top; /*景深基点在左上角*/
当该属性值不为 0 和 none 时,会创建新的 层叠上下文。在这种情况下,容器内元素的层叠关系像是使用了 position: fixed 一样。
景深作用:让3d场景有近大远小的效果,肉眼距离显示器的距离,景深越大,元素离我们越远,效果就不好。在css3中,perspective用于激活一个3d空间。
景深不可继承,他作用于后代元素,
perspective:100px; //这个属性必须在包裹器上
transform:perspective(100px) //这样写是作用于元素本身,要用这个函数必须放在首位(所以一般不hi用这个函数)
景深原理:控制灭点的位置。景深越大,灭点越远,元素变形越小。
灭点:指的是立体图形各条便的延伸线所产生的相交点
景深叠加:尽量避免景深叠加
- 3d旋转:
transform:rotate3d(1,0,0,angle) /*绕X轴旋转*/
transform:rotate3d(1,1,0,angle) /*绕Y=X轴旋转*/
......
- 3d平移:
transform: translateZ(100px) //z轴不能使用百分比
transform: translate3d(10px,10px,10px)
- 3d缩放:
scaleZ(2) //单独使用时没作用
transform:translateZ(30px) scaleZ(2); /*往前走了30px,*/
transform: scaleZ(2) translateZ(30px); /*往前走了60px,*/
- CSS 属性 transform-style 设置元素的子元素是位于 3D 空间中还是平面中。
transform-style: preserve-3d; /*营造有层级的舞台,不可继承,作用于子元素*/
-
backface-visibility: hidden; /*隐藏背面*/
- 3d坐标轴
立方体:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>立方体</title>
<!--
把盒子摆在上下左右前后几个位置,再想办法进行3d转换
-->
<style type="text/css">
#wrap{
width: 300px;
height: 300px;
border: 1px solid black;
background: url(bg.png) no-repeat;
background-size: 100% 100%;
perspective: 200px;/*景深*/
}
#wrap > .box{
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
width: 100px;
height: 100px;
transition: 3s;
transform-style: preserve-3d;/*3d舞台,给div层级*/
transform-origin: center center -50px;
}
#wrap > .box > div{
position: absolute;
width: 100px;
height: 100px;
font: 50px/100px "微软雅黑";
text-align: center;
background-color: rgba(123,234,123,.3);
backface-visibility: hidden; /*隐藏背面*/
}
/*上*/
#wrap > .box >div:nth-child(5){
top: -100px; /*正值往里,负值往外*/
transform: rotateX(90deg);
transform-origin: bottom;
}
/*下*/
#wrap > .box >div:nth-child(6){
bottom: -100px;
transform: rotateX(-90deg);
transform-origin: top;
}
/*左*/
#wrap > .box >div:nth-child(3){
left: -100px;
transform: rotateY(-90deg);
transform-origin: right;
}
/*右*/
#wrap > .box >div:nth-child(4){
right: -100px;
transform: rotateY(90deg);
transform-origin: left;
}
/*后*/
#wrap > .box >div:nth-child(2){
transform: translateZ(-100px) rotateX(180deg);
}
/*前*/
#wrap >.box >div:nth-child(1){
z-index: 1;
}
#wrap:hover .box{
transform: rotate3d(1,2,3,360deg);
}
</style>
</head>
<body>
<div id="wrap">
<div class="box">
<div>前</div>
<div>后</div>
<div>左</div>
<div>右</div>
<div>上</div>
<div>下</div>
</div>
</div>
</body>
</html>
立方体2:(设置统一的基点,通过旋转构造立方体)(关键:找中心点)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>立方体</title>
<!--
-->
<style type="text/css">
#wrap{
width: 300px;
height: 300px;
border: 1px solid black;
perspective: 200px;/*景深*/
}
#wrap > .box{
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
width: 100px;
height: 100px;
transition: 3s;
transform-style: preserve-3d;/*3d舞台,给div层级*/
transform-origin: center center -50px;
}
#wrap > .box > div{
position: absolute;
width: 100px;
height: 100px;
font: 50px/100px "微软雅黑";
text-align: center;
background-color: rgba(123,233,123,.3);
transform-origin: center center -50px;
}
/*上*/
#wrap > .box >div:nth-child(5){
transform: rotateX(90deg);
}
/*下*/
#wrap > .box >div:nth-child(6){
transform: rotateX(-90deg);
}
/*左*/
#wrap > .box >div:nth-child(3){
transform: rotateY(-90deg);
}
/*右*/
#wrap > .box >div:nth-child(4){
transform: rotateY(90deg);
}
/*后*/
#wrap > .box >div:nth-child(2){
transform: rotateX(180deg);
}
/*前*/
#wrap >.box >div:nth-child(1){
z-index: 1;
}
#wrap:hover .box{
transform: rotateX(360deg);
}
</style>
</head>
<body>
<div id="wrap">
<div class="box">
<div>前</div>
<div>后</div>
<div>左</div>
<div>右</div>
<div>上</div>
<div>下</div>
</div>
</div>
</body>
</html>
(如果要隐藏背面设置backface-visibility:hidden)
三棱柱:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>三棱柱</title>
<style type="text/css">
#wrap{
width: 300px;
height: 300px;
border: 1px solid black;
perspective: 200px;/*景深*/
}
#wrap > .box{
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
width: 100px;
height: 100px;
transition: 3s;
transform-style: preserve-3d;/*3d舞台,给div层级*/
}
#wrap > .box > div{
position: absolute;
width: 100px;
height: 100px;
font: 50px/100px "微软雅黑";
text-align: center;
background-color: rgba(123,233,123,.3);
transform-origin: center center -28.867513459481287px;/*计算中心点的位置*/
}
/*左*/
#wrap > .box >div:nth-child(2){
transform: rotateY(-120deg);
}
/*右*/
#wrap > .box >div:nth-child(3){
transform: rotateY(120deg);
}
/*前*/
#wrap >.box >div:nth-child(1){
z-index: 1;
background-color: pink;
}
#wrap:hover .box{
transform: rotateY(180deg);
}
</style>
</head>
<body>
<div id="wrap">
<div class="box">
<div>前</div>
<div>左</div>
<div>右</div>
</div>
</div>
</body>
</html>
多棱柱画法:
关键:
1.第n个面旋转度数:外角度数*n
2.找到内角度数,棱长,通过三角函数求中心点
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>多棱柱</title>
<style type="text/css">
#wrap{
width: 300px;
height: 300px;
border: 1px solid black;
perspective: 10000px;/*景深*/
}
#wrap > .box{
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
width: 100px;
height: 100px;
transition: 3s;
transform-style: preserve-3d;/*3d舞台,给div层级*/
}
#wrap > .box > div{
position: absolute;
width: 100px;
height: 100px;
font: 50px/100px "微软雅黑";
text-align: center;
background-color: rgba(123,233,123,.3);
}
#wrap:hover .box{
transform: rotateX(360deg);
}
</style>
</head>
<body>
<div id="wrap">
<div class="box">
</div>
</div>
<script type="text/javascript">
window.onload = function(){
createLZ(6)
function createLZ(n){//n棱柱
var boxNode = document.querySelector("#wrap > .box")
var styleNode = document.createElement("style")
var text = ""
var cssText = ""
var degIn = 180 - 360/n //n棱柱内角
var degOut = 360/n //n棱柱外角
for (var i = 0;i<n ;i++) {
text += "<div>"+(i+1)+"</div>"
cssText += "#wrap>.box>div:nth-child("+(i+1)+"){transform:rotateY("+(degOut*i)+"deg);}"
}
boxNode.innerHTML = text
var divNode = document.querySelector("#wrap > .box>div")
var length =divNode.offsetWidth //棱长
cssText+="#wrap>.box{transform-origin:center center -"+(length/2*Math.tan(degIn/2*Math.PI/180))+"px;}"
cssText+="#wrap>.box>div{transform-origin:center center -"+(length/2*Math.tan(degIn/2*Math.PI/180))+"px;}"
styleNode.innerHTML = cssText
document.head.appendChild(styleNode)
}
}
</script>
</body>
</html>