网站首页 > 基础教程 正文
上一篇写遗留下来几个问题:
1、如果是正多面体怎么办?
正四面体,我们可以轻松确定translateZ 的值为元素的宽的一半。那如果是正五面体呢,正N面体呢?先不急,哥先画个图,分析一下。
以一个正五边形为例:我们最终的目的是求到AO的距离,这个距离就是我们要进行平移(translateZ)的值 , 会涉及到简单的数学知识,正N边形的外角边之和永远是360度。
那么我们可以算出来角度b = 360 / N 度 ,求出b 再来算a就简单了 角度a = (180-b) / 2,求出角度a了,AB为元素宽的一半,要求出AO的距离,就容易了。AO = Math.tan(Math.PI/180*a) * AB ,一个简单的三角正切就能实现了。
再来计算下每个面的旋转的角度应该为 360 / N * index 度。
好了,接下来直接上代码了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=750px, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style lang="">
*{margin:0;padding: 0;}
html,body{
width: 100%;
height: 100%;
font-size:30px;
}
.zmiti-box{
width: 300px;
height: 300px;
position: absolute;
left: 0;
top:200px;
perspective:1800px;
left: 50%;;
margin-left: -150px;
}
.zmiti-box section{
transform-style: preserve-3d;
position:relative;
width: 100%;
height: 100%;
left: 0;
transition:5s;
}
.zmiti-box .zmiti-box-item{
position: absolute;
left: 0;
top:0;
width: 100%;
height: 100%;
line-height: 300px;
color:#fff;
font-size:80px;
text-align:center;
}
</style>
</head>
<body>
<div class='zmiti-box'>
<section>
</section>
</div>
<script>
var zmitiUtil = {
length:10,//我要创建正10面体
init(){
this.createElement();
this.bindEvent();
},
createElement(){
this.box = document.querySelector('.zmiti-box section');
var html = '';
var elWidth = 300;//元素的宽度,也可以通过获取元素的clientWidth,我这就硬编码写死了。
var angle = 360 / this.length;
var translateZ = Math.tan(Math.PI / 180 * (180 - angle) / 2) * elWidth / 2;
for(var i = 0 ;i < this.length ;i++){
html+= `<div class='zmiti-box-item' style="transform:rotateY(${i * 360 / this.length}deg) translateZ(${translateZ}px);background:rgb(${Math.random()*255|0},${Math.random() * 255 | 0},${Math.random() * 255 | 0})">${i+1}</div>`;
};
this.box.innerHTML = html;
},
bindEvent(){
document.body.addEventListener('touchstart',()=>{
this.box.style.transform = 'rotateY(360deg) rotateX(60deg)';
});
}
};
zmitiUtil.init();
</script>
</body>
</html>
效果如下:
但是这个好像没什么卵用啊,造物节那个感觉人站在圆柱中间看的,应该是这样的效果
我们改造下,我们把每个元素的translateZ取反为负值,然后再设置背面隐藏就ok了。
.zmiti-box .zmiti-box-item{
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
记得在移动端要加上webkit前缀。否则无效哦。
最后的就是把每个面用一张张的图片拼起来的了,原理是用一张长图,平均切成N份,然后填充成背景就搞定了哦。
移动端的适配问题:可以动态设置最外层父级的景深值来做下控制。这里就不再做赘述了。大家可以自己研究下。
猜你喜欢
- 2024-10-10 让交互更加生动!有意思的鼠标跟随 3D 旋转动效
- 2024-10-10 「抖音最火」的3D旋转透视酷炫相册,如何用CSS3去实现
- 2024-10-10 纯CSS3实现旋转流星旋转光环效果 css旋转动画效果
- 2024-10-10 CSS3旋转实例学习(附3D旋转实例) css3实现360度旋转
- 2024-10-10 CSS3之日记翻页效果详解 日记翻页视频的模板
- 2024-10-10 如何使用纯CSS技术实现3D书本动态展示效果?
- 2024-10-10 CSS3之3D魔方鼠标控制酷炫效果 3d魔方代码
- 2024-10-10 CSS3专题(五)—实力宠粉,来了,来了,你们要的3D幻灯片来了
- 2024-10-10 css之3D效果——正方体 css正方体照片墙源码
- 2024-10-10 26.HTML 2D和3D变换 html2d旋转
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)