配色: 字号:
【CSS进阶】试试酷炫的 3D 视角
2016-09-08 | 阅:  转:  |  分享 
  
【CSS进阶】试试酷炫的3D视角

运用CSS3完成的3D视角,虽然有一些晕3D,但是使人置身于其中的交互体验感觉非常棒,运用在移动端制作一些H5页面可谓十分博人眼球。

并且掌握原理之后制作起来也并不算废力,好好的研究了一番后将一些学习过程共享给大家。

下面进入正文:(一些Gif图片较大,需要等待一会)

?

3D效果示意

百闻不如一见,先直观感受一下上述我所说的效果:

最好能点进去看看,这里我使用了带背景色的div作为示例,我们的视角处于一个正方体中,正方体的旋转动画让我们有了3D的感觉。

那么原本的图长什么样呢?我们把距离拉远,一探究竟:

是长这样的:



相较于第一种效果,其实所做的只是将我们的视角推进到了正方体当中,有了一种身临其景的感觉。

而合理的运用CSS3所提供的一些3D属性,很容易就能达到上述的效果。

制作这样一个3D图形,我在之前的文章已经很详细的讲述了过程,感兴趣的可以戳进去看看:

【CSS3进阶】酷炫的3D旋转透视

?

transform-style与perspective

再简单复述一下,主要是运用到了两个CSS属性:

transform-style

要利用CSS3实现3D的效果,最主要的就是借助transform-style属性。

transform-style只有两个值可以选择:

1

2

3

4

5 //语法:

transform-style:flat|preserve-3d;

??

transform-style:flat;//默认,子元素将不保留其?3D位置

transform-style:preserve-3d;//子元素将保留其?3D位置。 当父元素设置了transform-style:preserve-3d后,就可以对子元素进行3D变形操作了,3D变形和2D变形一样可以,使用transform属性来设置,或者可以通过制定的函数或者通过三维矩阵来对元素变型操作:当我们指定一个容器的transform-style的属性值为preserve-3d时,容器的后代元素便会具有3D效果,这样说有点抽象,也就是当前父容器设置了preserve-3d值后,它的子元素就可以相对于父元素所在的平面,进行3D变形操作。

使用translateX(length)、translateY(length)、translateZ(length)来进行3D位移操作,与2D操作一样,对元素进行位移操作,也可以合并为translate3d(x,y,z)这种写法;

使用scaleX()、scaleY()、scaleY()来进行3D缩放操作,也可以合并为scale3d(number,www.visa158.com,number,number)这种写法;

使用rotateX(angle)、rotateY(angle)、rotateZ(angle)来进行3D旋转操作,也可以合并为rotate3d(Xangle,Yangle,Zangle)这种写法。

perspective

1

2 //语法

perspective:number|none; 简单来说,当元素没有设置perspective时,也就是当perspective:none/0时所有后代元素被压缩在同一个二维平面上,不存在景深的效果。perspective为一个元素设置三维透视的距离,仅作用于元素的后代,而不是其元素本身。

而如果设置perspective后,将会看到三维的效果。

我们上面之所以能够在正方体外围看到正方体,以及深入正方体内,都是因为?perspective?这个属性。它让我们能够选择推进视角,还是远离视角,因此便有了3D的感觉。

?

3DView页面的布局结构

为了完成这样一个效果,需要一个灵活的布局,去控制整个3D效果的展示。

下面是我觉得比较好的一种方式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16



????

????

????????

????????

????????????

????????????

????????????????

????????????????

????????????????

????????????????

????????????

????????

????

最外层?container?,控制图形的位置及在整个页面上的布局;

stage?层,舞台层,从这里开始设置3D景深效果,添加perspective视距;

control?层,动画的控制层,通过这一层可以添加旋转动画或者在移动端的触摸动画,通过更改translateZ?属性也可以拉近拉远视角;

imgWrap?层,图片层,装入我们要拼接的图片,下文会提及。

?

图片拼接

图片拼接其实才是个技术活,需要许多的计算。

以上述Demo中的正方体为例子,class为?img?的div块的高宽为400px400px。那么要利用4个这样的div拼接成一个正方体,需要分别将4个div绕Y轴旋转[90°,180°,270°,360°],再?translateY(200px)?。

值得注意的是,一定是先旋转角度,再偏移距离,这个顺序很重要。

看看俯视图,也就是这个意思:



?

这是最简单的情况了,都是直角。

如果是一张图需要分割成八份,假设每张图分割出来的高宽为400?400,8?张图需要做的操作是依次绕Y轴旋转[45°,90°,135°,180°,225°,270°,315°,360°],偏移的距离为?translateY(482.84px)?,也就是(200+200√2)。

看看俯视图:



效果图:

?

图片分割

上面的示例都是使用的带背景色的div块,现在我们选取一张真正的图片,将其拼接成一个柱体。

下面这张图,大小为?3480px2000px?:



我们把它分割为20份,拼成一个正20边形,当然不用一块一块切图下来,利用?background-position?就可以完成了。而且分割的份数越多,最终做出来的效果越像一个圆柱,效果也更加真实。

正20边形,需要20个div,假设容器是.img-bg1~.img-bg20,那么每块图片的宽度为?174px,依次需要递增的角度为18°,并且我们需要计算出需要偏移的距离为?translateZ(543px)。

可以利用一些CSS预处理器处理这段代码,下面是Sass的写法:

1

2

3

4

5

6

7

8 //Sass的写法

$imgCount:?20?!default;

@for$ifrom?1?through$imgCount{

????.img-bg#{$i}{

????????background-www.hunanwang.netposition:($i?-174px?+?174px)?0;

????????transform:rotateY($i?18deg)translateZ(543px);

????}

}

可以看到,图中近视为一个圆柱形,不过有一些小问题:

选取的图片必须是左右首尾相连的的,不然圆柱结合处会有明显的不协调,这就要求要使用这种方式制作H5页面的时候,美术出的设计图必须左右相连无违和感。

另外一点就是分割的块术,图片分割越多块,越近视为为一个圆柱,效果更佳。

?

控制?control?层,进入到圆柱画面内

做到这一步,只剩下最后一步,就是推进我们的视角,进入到圆柱内部,产生3D视图的感觉。

我们通过class为?control?这个div控制这个效果,不过这里控制我们进入圆柱内部的属性不是调整修改?perspective?属性,而是调整?translateZ?属性。通过控制translateZ得到的画面更加真实,可以自己尝试一下分别控制?perspective?与?translateZ?得到的效果,便会有深刻的感受。

整个效果图太大,只截取了部分制作成GIF:



还有一个小问题,那就是进入到圆柱内部之后,整个图片都反了过来,所以我们可能需要利用PS将原图进行一次左右翻转,这样进入内部之后,看到的就是原图效果。



献花(0)
+1
(本文系白狐一梦首藏)