今天做有意思的3d旋转爱心,借此来复习一下css中的相关内容,先上一张成品照片
中间是一个正方体,你可以将正方体的各个面上加上照片
要做这个3d旋转爱心,首先要解决的就是如何画出外边的线条,这里用到了css中的border-radius,我们都知道border-radius是用来设置四个角的,写过border的人都知道border可以带四个参数分别设置四个边框(上左下右的顺序),同样的,border-radius也可以带四个参数,并且以顺时针的方向解析,上左,上右,下右,下左。
border的参数:border-radius: 参数1 参数2 参数3 参数4 / 参数5 参数6 参数7 参数8。没错,border有8个参数前面4个参数为四个圆角的水平半径,后面四个值是四个圆角的垂直半径如图:
但是平常我们都不写 / 后面的垂直半径,这时就默认垂直半径和水平半径对应相等
当border-radius只有2个参数时 :第一个参数就是左上和右下角的,第二个参数就是右上和左下角的,
当border-radius有3个参数时:第一个参数就是左上,第二个参数就是右上和左下的,第三个参数就是右下的。
总之,它是从左上开始,按顺时针分配数值,若有些角没有赋值,则和赋其对角相同值。
<body> <div class="left"></div> <div class="right"></div> </body>
<style> body { background-color: orange; } .left { position: absolute; left:548px; top: 200px; width: 100px; height: 200px; margin: auto; border: 4px solid red; border-radius:50% 50% 0 0 / 50% 40% 0 0; border-right: 0; border-bottom: 0; transform: rotate(-40deg); } .right { position: absolute; left:600px; top: 200px; width: 100px; height: 200px; margin: auto; border: 4px solid red; border-radius: 50% 50% 0/ 40% 50% 0; border-left: 0; border-bottom: 0; transform: rotate(40deg); } </style>
上面这段代码画出的是下图
这个图是通过对两个div的边框border,和圆角border-raidus的设置,然后旋转一定角度,通过定位拼接到一起。
接下来就是3d旋转爱心了
HTML代码:
<div class="box"> <div class="cube"> <div>第一面</div> <div>第二面</div> <div>第三面</div> <div>第四面</div> <div>第五面</div> <div>第六面</div> </div> </div>
css代码:
<style> body { background-color: #000; } /*给装载爱心的盒子设计样式让其能居中显示*/ .box { position: absolute; left:0; top: 0; bottom: 0; right: 0; margin: auto; width: 300px; height: 300px; transform-style: preserve-3d; /*添加3d效果*/ animation: 10s rot linear infinite; /*添加动画*/ } /*为遵循子绝父向给heart套一个相对定位的div*/ heart3d { position: relative; } /*设置 心 线条*/ .heart { position: absolute; left:90px; top: 0; width: 100px; height: 200px; border: 2px solid red; border-radius: 50% 50% 0/ 40% 50% 0; border-left: 0; border-bottom: 0; } /*设定关键帧*/ @keyframes rot { 0% { transform: rotateX(360deg) rotateY(360deg); } } /*设计正六边形的样式*/ .cube { transform-style: preserve-3d; position: relative; width: 50px; height: 50px; transform: translate(115px) translateY(100px) translateZ(20px); } .cube div { position: absolute; width: 50px; height: 50px; text-align: center; line-height: 50px; opacity: 0.7; } .cube div:nth-child(1) { background-color: red; } .cube div:nth-child(2) { left: 0; top: -50px; background-color: orange; transform-origin: bottom; transform: rotateX(90deg); } .cube div:nth-child(3) { left: 0; top: 50px; background-color: blue; transform-origin: top; transform: rotateX(-90deg); } .cube div:nth-child(4) { left: -50px; top: 0; background-color: green; transform-origin: right; transform: rotateY(-90deg); } .cube div:nth-child(5) { left: 50px; top: 0; background-color: pink; transform-origin: left; transform: rotateY(90deg); } .cube div:nth-child(6) { left: 0; top: 0; background-color: yellow; transform: translateZ(-50px); } </style>
js代码:
<script> var heart3d = document.getElementsByClassName('heart3d')[0]; //找到承载这些心形线条的div for(var i=0; i<36; i+=1){ //循环生成36个线条,并且每次都旋转一下,然后添加到heart3d中。 var heart = document.createElement("div"); heart.className = 'heart'; heart.style.transform = "rotateY("+i*10+"deg) rotateZ(45deg) translateX(50px)" heart3d.appendChild(heart); } </script>
这样我们就成功做出了一个旋转的3d爱心。
我们知道在标准文档流中,我们想要让一个元素居中,可以通过设置宽度,然后通过margin:0 auto;(前面的0可以设置) 来实现。但是在定位中绝对定位和固定定位都脱离标准文档流了,这时居中有个办法就是,将left top right bottom 都设为0 ,然后margin:auto.就可以了,这时无论浏览器宽高怎么变都会自动居中。