css3D 不管用不用,先看看? (1)

54 阅读2分钟

一个简单的3d场景

3d空间

要想元素位于3d空间,需要设置元素的transform-style

transform-style: preserve-3d;

设置元素的直接子元素是位于 3D 空间中 ,这个属性不会被继承,因此必须为元素的所有非叶子子元素设置它

有了3d空间,我们就可以设置transform相关的属性的3d值了

transform: translateX(100px); //x轴平移
transform: translateY(100px);//y轴平移
transform: translateZ(100px);//z轴平移

transform: rotateX(45deg); //绕x轴旋转
transform: rotateY(45deg); //绕y轴旋转
transform: rotateZ(45deg); //绕z轴旋转

transform: scaleX(2); //x轴缩放
transform: scaleY(2); //y轴缩放
transform: scaleZ(2); //z轴缩放

需要注意的是

旋转是有顺序的,就是 先旋转x轴再旋转y轴 和 先旋转y轴再旋转x轴 结果不一样 平移,缩放操作,如果是先选择 ,再平移,那么 坐标轴是按旋转后来算的,而不是初始时的面向屏幕为z轴

透视

perspective: 800px;

指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果。z>0 的三维元素比正常大,而 z<0 时则比正常小,大小程度由该属性的值决定。

看看下面的示例:一个box 沿z轴平移,可以看到有近大远小的效果,z越大,box越大

可以把这句去掉,运行,可以看到没有近大远小的效果

.scene{
    perspective:600px;
}

另外可以搜一下“鸽子为什么这么大” 关键词,看看什么是透视

image.png

坐标系

3d空间需要清楚坐标系,上面的示例也可以看到我们画了3个箭头,就是3d空间坐标系

x,y不用说了,z轴是数值越大,越靠屏幕外

绕x轴旋转的效果

先绕Y轴旋转,再平移Z轴的效果,可以看到Z轴并不是刚开始默认的方向,而是旋转后的方向

transform:rotateY(30deg) translateZ(-800px)

效果1

安卓桌面3d翻转

可以看到整体是围绕红色的线旋转,实际上就是画一个盒子,按照盒子的中心点旋转

.box{
    transform:translateZ(-150px) rotateY(0deg)  translateZ(150px);
}

外面的盒子先往里面平移,再旋转,再平移回来,看起来就是以盒子的中心点旋转

总结

3d下面,最复杂的就是旋转,纯css3d 没有世界坐标的概念,所有的旋转是按照自身来操作的,有一套相关辅助工具来操作会简单很多

第三方实现:

github.com/shrekshrek/…

threejs.org/examples/?q…