如何使用 CSS3 变换属性创建 3D 设计

已发表: 2017-04-07

CSS3 变换属性有两个维度,2D 和 3D。 制作动画时,变换用于使元素从一种状态变为另一种状态。 本教程作为本指南关于 2D 动画的扩展。 我将提供一些关于 3D 设计的见解,以及如何通过结合这些基本概念来创建出色的动画。

3D 变换可以非常详细,如果有很多不同的部分组合起来会变得复杂,所以从基本的构建块开始是有帮助的。 其中一些概念看起来很熟悉,但“z”在 3D 中工作时看起来很新。 3D 变换扩展了 2D CSS 变换以包括 z 轴,允许对 DOM 元素进行 3D 变换。

z轴是什么?

z轴会有很多参考。 很容易将其视为某物朝向或远离您的测量距离。 如果它是一个正值,它更接近你。 如果它是负值,它离你更远。

3d 设计轴图

3D 变换示例

3D 变换的基本属性是translate3dscale3drotateXrotateYrotateZperspectivematrix3dtranslate3dscale3dmatrix3d包含更多参数,因为它们接受 x、y 和 z 的参数。 scale 属性采用角度值,perspective 也采用单个值。

翻译

翻译Z()

这仅通过使用 z 轴值来定义 3D 平移。 您可能还记得从 2D 翻译中翻译 x 和 y。 这个想法与translateX()translateY()translateZ()是相同的,因为每个都采用一个长度值,该长度值将元素沿正确的轴移动指定的距离。

3d-设计-翻译-z

在此示例中, translateZ(-20px)会将元素移离查看器 20 像素。

以下是创建此示例的代码片段:

-webkit-transform: translateZ(-20px);
-ms-transform: translateZ(-20px);
transform: translateZ(-20px);

翻译3d()

translate3d()函数用于移动元素在 3D 空间中的位置。 这种变换是通过指定坐标来创建的,该坐标定义了它在每个方向上的移动量。

函数transform: translate3d(20px, -15px, 70px); 沿正 x 轴移动图像 20 个像素,在负 y 轴上移动 15 个像素,然后沿正 z 轴移动 70 个像素。

3d-设计-翻译-3d

这是translate3d的示例:

-webkit-transform: translate3d(20px, -15px, 70px);
-ms-transform: translate3d(20px, -15px, 70px);
transform: translate3d(20px, -15px, 70px);

很明显,第二个正方形发生了一些重叠。 它可能看起来不像预期的那么戏剧化,但添加透视属性(本教程后面的内容)会有所帮助。

3d 设计翻译 3d 透视图 透视属性已添加到此示例中。

旋转

rotate3d()函数将 3D 空间中的元素围绕轴旋转指定的角度。 这可以写成rotate(x, y, z, angle)

旋转X()

像素值在这里不起作用,它需要以度为单位。 rotateX()方法以给定的角度围绕其 x 轴旋转元素。 看看矩形是如何变短的? 它沿 x 轴旋转。 此示例显示了 55 度的旋转。

3d-设计-旋转-x

-ms-transform: rotateX(55deg); /* IE 9 */
    -webkit-transform: rotateX(55deg); /* Safari */
    transform: rotateX(55deg);

旋转Y()

rotateY()方法围绕其 y 轴旋转元素。 请注意底部矩形没有顶部那么宽? 它被旋转了,所以它看起来不像上面的矩形那么宽,因为它被旋转了 60 度。

3d-设计-旋转-y

-ms-transform: rotateY(60deg); /* IE 9 */
    -webkit-transform: rotateY(60deg); /* Safari */
    transform: rotateY(60deg);

旋转Z()

rotateZ()方法将元素围绕其 z 轴旋转指定的度数。 在这种情况下,该值为 120 度。

3d-设计-旋转-z

-ms-transform: rotateZ(120deg); /* IE 9 */
    -webkit-transform: rotateZ(120deg); /* Safari */
    transform: rotateZ(120deg);

旋转3d()

函数rotate3d(1, -1, 1, 45deg)将图像沿 y 轴旋转 45 度角。 重要的是要注意,您可以使用负值以相反方向旋转元素。

3d 设计旋转 3d

由于这比单轴规格更复杂, rotate3d可以这样分解: rotate3d(x,y,z,angle)其中 x=1, y=-1, z=1, 旋转角度 = 45 度.

设置样式的代码如下所示:

-ms-transform: rotate3d(1, -1, 1, 45deg); /* IE 9 */
    -webkit-transform: rotate3d(1, -1, 1, 45deg); /* Safari */
    transform: rotate3d(1, -1, 1, 45deg);

测试基础

沿 x 轴顺时针旋转 45 度。

旋转 3d 顺时针 x 轴 45 度

transform: rotate3d(1, 0, 0, 45deg);

沿 y 轴顺时针旋转 45 度。

沿 y 轴 45 度顺时针旋转

transform: rotate3d(0, 1, 0, 45deg);

沿 z 轴顺时针旋转 45 度。

3d 设计-顺时针-z 轴-45 度

transform: rotate3d(0, 0, 1, 45deg);

值得一提的是,根据指定的值,有时旋转不会很明显; 例如,这不会引起注意: transform: rotate3d(0, 0, 0, 50deg);

看法

这可能是最“维度”的转变。 这是你真正获得视角的地方。 如果在未设置透视的情况下对元素应用 3D 变换,则生成的效果将不会显示为 3D。 这也可以添加到上面的属性中。

如何使用 CSS3 过渡和变换来创建动画

有趣的动画可以使用 CSS3 通过使用变换和过渡来创建。 变换用于使元素从一种状态更改为另一种状态。 例如旋转、移动、倾斜……

要激活 3D 空间,元素需要透视。 这可以通过两种方式应用:使用transform属性或perspective属性。

transform属性如下所示: transform: perspective(600px); 透视属性看起来像这样: perspective: 600px; .

以下示例将在两者之间进行更改,因此请务必仔细查看代码。

perspective的价值决定了 3D 效果的强度。 将低值视为非常明显,例如当您查看大型物体时的感觉。 值越大,效果越不强烈。

消失点的位置也可以自定义。 值得一提,并进行大量实验,因为它与 CSS 透视图相关。 默认情况下,3D 空间的消失点位于中心。 使用 perspective-origin 属性来改变消失点的位置。 它看起来像: perspective-origin: 15% 55%

3d 设计视角 左侧的示例设置为大约 800 像素。 右侧的透视图更加剧烈,设置为 200 像素。

规模

比例Z()

这通过为 z 轴指定一个值来定义 3D 比例变换。 因为它只沿 z 轴缩放,所以需要其他函数来演示缩放效果。 看看矩形是如何朝向观察者的,以及它是如何真正显示透视的?

要完全理解 scale(Z),请尝试使用该值,您会看到视角随着值的增大而变得“更清晰”。

3d 设计比例-z 左侧示例的值为 2,右侧示例的值为 8。

scale3d(x,y,z)

scale3d()函数改变元素的大小,写成scale(x, y, z) 。 与scaleZ一样,除非与perspective一起使用,否则透视的完整外观并不明显。

3d 设计比例 3d

这个例子使用这个:

-ms-transform: perspective(500px) scale3d(0.8, 2, 0.2); /* IE 9 */
-webkit-transform: perspective(500px) scale3d(0.8, 2, 0.2); /* Safari */
transform: perspective(500px) scale3d(0.8, 2, 0.2);

快速说明:如果向量的所有三个坐标都相等,则缩放是一致的,不会有明显的差异。

transform: scale3d(1, 1, 1); /* unchanged */

transform: scale3d(2, 2, 2); /* twice the original size */

矩阵3d()

2D 矩阵可以取 6 个值,而 3D 矩阵需要 16 个(4×4 矩阵)! 如果涵盖了所有细节,这将是一个很长的帖子,所以如果你想更多地探索这个概念,我强烈推荐 Codepen 上的这个交互式 matrix3d 实验。

3d矩阵

这是 matrix3d 的基本轮廓: matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1)

如何使用 3D 变换创建动画

现在已经涵盖了基础知识,下一步是创建交互式动画。 使用 CSS3 变换和过渡,元素通过旋转、缩放或添加透视从一种状态变为另一种状态。

如果您是 CSS 动画的新手,重要的是要知道,如果没有转换,被转换的元素会突然从一种状态变为另一种状态。 为了防止这种情况,可以添加一个过渡,以便您可以控制更改,使其看起来更平滑。

如何创建卡片翻转

谁不喜欢打牌? 此示例具有双面卡片,您可以通过转换翻转它来查看双面卡片。 如果你看一下body标签,很多效果来自perspective属性。 它设置为500px。 像 100px 这样的较低值看起来非常“倾斜”。

这是起始 HTML:

<div class="wrapper">
	div class="side-one"></div>
	<div class="side-two"></div>
</div>

CSS是使它发生的原因:

body {
  -webkit-perspective: 500px;
  perspective: 500px;
}

.wrapper {
  -webkit-transition: all 1s ease-in;
  transition: all 1s ease-in;
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
  position: relative;
  margin: 100px auto;
  width: 250px;
  height: 250px;
  cursor: pointer;
}

.wrapper div {
    position: absolute;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    width: 100%;
    height: 100%;
    border-radius: 10px;
    background-position: 50% 50%;
    background-size: 150px;
    background-repeat: no-repeat;
    box-shadow: inset 0 0 45px rgba(255,255,255,.3), 0 12px 20px -10px rgba(0,0,0,.4);
    color: #FFF;
    text-align: center;
    text-shadow: 0 1px rgba(0,0,0,.3);
}

.side-one {
  z-index: 400;
  background: #50c6db  url(image.png);
}

.side-two {
  -webkit-transform: rotateY(-180deg);
  transform: rotateY(-180deg);
   background: #ef4e65   url(image.png);
}

.wrapper:hover {
  -webkit-transform: rotateY(-1turn);
  transform: rotateY(-1turn);
}


3d 设计动画一个示例

这可以在 Codepen 上找到。

如果您不熟悉变换,您可能会觉得这很有趣: transform: rotate(1turn); 这个单位非常适合我们的卡片,因为“转”单位正是它听起来的样子,即一整圈。

我还使用了一些缓动来制作自定义的旋转方式。 这是通过transition: all 1s ease-in; .

片段中的另一个 3D 属性是transform-style: preserve-3d; . 通过包含这一点,它允许元素在 3D 空间中“摆动”,而不是停留在父元素上。

如何创建具有 3D 效果的文本

这个例子的灵感来自一张老电影海报。 有很多不同的字体可以利用出色的 CSS 样式,因此绝对可以实现独特的字体效果。 这段文字使用rotate3dtransform3d给它一个独特的变换。

3d 文字效果

HTML 非常简单:

<div class="container">
  <div class="text-wrapper">
    <div class="text">New York City</div>
  </div>
</div>

这是基本的CSS:

.container{
  -webkit-perspective: 600;
}

.text {
  transform: rotate3d(2, 2, .5, 22deg)translate3d(100px, 0px, 0px);
 }

更详细的 CSS 和示例可以在 Codepen 上找到。

希望 CSS 3D 转换为您的设计带来新的维度。 利用透视是使元素看起来更具立体感的好方法。 结合转场,在创建动画时有很多可能性。