3d变换

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>

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值