Open anjia opened 5 years ago
支持一下
Name: transform-style Value: auto | flat | preserve-3d Initial: auto
来自 CSS Transforms Module Level 2(在大多数浏览器里,就两个值 flat | preserve-3d
,无 auto
)
transform-style
的flat
值会创建堆叠上下文,并建立 3D 渲染上下文。在进行 3D 渲染计算时,会忽略值是auto
的元素,而值是preserve-3d
的元素会把这个 3D 渲染上下文扩展到它们所属的 3D 上下文里(即使 transform
和 perspective
属性的值会导致 2D 平面化)。值preserve-3d
会创建堆叠上下文,并为所有后代元素创建一个包含块。
两个概念:
- 3D 渲染上下文:即有共同祖先的一组元素,它们会共享相同的三维坐标系
- 另外,
transform
属性,只要它的值不是none
,它就会触发元素为所有的后代建立一个包含块,元素的 padding box 将用于布局所有的绝对定位、fix 定位的后代元素,和后代的 fixed background attachments。
今天和大家分享两个和 CSS 3D 相关的属性/值:
perspective
transform-style: preserve-3d;
为什么要分享它们两个呢?最近在 100dayscss 上做 CSS 题的时候,被下面这个效果给难住了。
当时鬼使神差地就是不知道如何把图 1.1 变成图 1.2。
后来偷偷作弊了下,才知道是漏了
transform-style: preserve-3d
。和 3D 密切相关的还有一个perspective
属性,故本文重点介绍下这两个。perspective
perspective
属性决定了z=0
平面和用户眼睛之间的距离,当绘制 3D 的时候会用到。先来看个例子:立方体,宽 100px 高 100px,其中心点在坐标系的原点
(0,0,0)
处。下表是不同
perspective
下的效果(在线预览):perspective:0px
perspective:50px
perspective:51px
perspective:100px
说明:
perspective:0px
时,纯平面,没有 3D 效果perspective:50px
时,刚好是立方体的中心位置perspective:51px
时,粉红色的“1号”面刚漏出1px,故相比之前的图,方位变化不大,但是颜色偏红perspective:100px
时,立方体整个都视线之内注意:
perspective-origin
属性来设置transform-style
transform-style
属性决定了元素的子元素是在 3D 空间中展开,还是在 2D 平面中展开。transform-style: flat
元素的子元素们是放置在元素本身的平面中的transform-style: preserve-3d
元素的子元素们是放置在 3D 空间中的注意:
flat
,则元素的子元素们将不会在它们自己的 3D 空间中存在transform-style
是不能被继承的,这就意味着如果元素的非叶子后代需要在 3D 中展开,则必须给子元素自己也设置下这个概念比较好理解。我们直接以开头的例子为例:
rotateX(-24deg)
transform-style:preserve-3d
说明:
目前伞整体是往里扣着的,现在,我们把它再转过来。即给伞的父容器设置:
最终的效果就实现了:
完整代码,可点击在线预览。
主要参考
https://drafts.csswg.org/css-transforms-2/#propdef-perspective https://drafts.csswg.org/css-transforms-2/#transform-style-property