transform: preserve-3d
和 transform: perspective
在 CSS3 中都与 3D 变换有关,但它们的作用不同:
-
transform: preserve-3d
: 这个属性告诉浏览器在应用 3D 变换时,要保留元素的 3D 空间信息。 这意味着元素的子元素会按照其在 3D 空间中的位置进行渲染,而不是被扁平化到一个 2D 平面。 如果没有preserve-3d
,子元素的 3D 变换会相对父元素的初始位置进行计算,而不是它们在 3D 空间中的实际位置。 这对于创建复杂的 3D 场景至关重要,例如旋转的立方体,其中子元素(立方体的面)需要保持其相对位置。 简而言之,它保持了 3D 空间的层次结构。 -
transform: perspective
: 这个属性模拟了透视效果,它创建了一种深度感,使 3D 元素看起来更逼真。 它定义了一个虚拟的“视点”,所有 3D 元素都相对于这个视点进行渲染。 距离视点越近的元素看起来越大,距离视点越远的元素看起来越小。perspective
值通常是一个长度值(例如perspective: 800px
),表示视点到屏幕的距离。 它本身并不直接影响元素的 3D 位置,而是影响它们在屏幕上的投影方式,从而产生透视效果。
总结:
preserve-3d
用于维护元素的 3D 结构和子元素的 3D 位置关系,而 perspective
用于创建透视效果,使 3D 场景看起来更真实。 它们经常一起使用:preserve-3d
保证 3D 场景的正确渲染,perspective
则添加深度感。 perspective
可以应用于父元素,从而影响其所有子元素的透视效果,而 preserve-3d
则需要应用于需要保持 3D 结构的元素本身。
例子:
假设你有一个旋转的立方体,每个面都是一个子元素。
-
没有
preserve-3d
: 当立方体旋转时,所有面可能会互相重叠或以不正确的方式渲染,因为浏览器不会跟踪它们在 3D 空间中的相对位置。 -
有
preserve-3d
: 当立方体旋转时,每个面都会保持其在 3D 空间中的正确位置,从而形成一个完整的旋转立方体。 -
加上
perspective
: 除了保持正确的 3D 结构,立方体还会因为透视效果而显得更立体,远处的面看起来更小。
因此,要创建复杂的 3D 效果,通常需要同时使用 preserve-3d
和 perspective
。 preserve-3d
处理 3D 空间的结构,perspective
处理视觉上的透视效果。