变形动画

基础知识

坐标系统

要使用元素变形操作需要掌握坐标轴,然后通过改变不同坐标来控制元素的变形。

  1. X轴是水平轴
  2. Y轴是垂直轴
  3. Z轴是纵深轴

变形操作

使用 transform 规则控制元素的变形操作,包括控制移动、旋转、倾斜、3D转换等,下面会详细介绍每一个知识点。

下面是CSS提供的变形动作。

选项说明
none定义不进行转换。
translate(x,y)定义 2D 转换。
translate3d(x,y,z)定义 3D 转换。
translateX(x)定义转换,只是用 X 轴的值。
translateY(y)定义转换,只是用 Y 轴的值。
translateZ(z)定义 3D 转换,只是用 Z 轴的值。
scale(x,y)定义 2D 缩放转换。
scale3d(x,y,z)定义 3D 缩放转换。
scaleX(x)通过设置 X 轴的值来定义缩放转换。
scaleY(y)通过设置 Y 轴的值来定义缩放转换。
scaleZ(z)通过设置 Z 轴的值来定义 3D 缩放转换。
rotate(angle)定义 2D 旋转,在参数中规定角度。
rotate3d(x,y,z,angle)定义 3D 旋转。
rotateX(angle)定义沿着 X 轴的 3D 旋转。
rotateY(angle)定义沿着 Y 轴的 3D 旋转。
rotateZ(angle)定义沿着 Z 轴的 3D 旋转。
skew(x-angle,y-angle)定义沿着 X 和 Y 轴的 2D 倾斜转换。
skewX(angle)定义沿着 X 轴的 2D 倾斜转换。
skewY(angle)定义沿着 Y 轴的 2D 倾斜转换。
perspective(n)为 3D 转换元素定义透视视图。

变形叠加

重复设置变形操作时只在原形态上操作。

默认处理

下面设置了两次移动,并不会移动550px而是只移动50px。

<style>
    div {
        transform: translateX(500px);
        width: 100px;
        height: 100px;
        background: #9b59b6;
    }

    div:nth-child(1) {
        transform: translateX(50px);
    }
</style>

<div></div>

伪类叠加

<style>
    div {
        transition: 2s;
        transform: translateX(200px) translateX(50px);
        width: 100px;
        height: 100px;
        background: #9b59b6;
    }

    div:hover {
        transition: 2s;
        transform: translateX(100px);
    }
</style>

<div></div>

行级元素

行级元素不产生变形效果,将其转为 inline-block 或 block 以及弹性元素时都可以产生变化效果。

伪类状态

:hover

鼠标移动上后发生改变。

article div:nth-child(2):hover {
	transform: rotate(180deg);
}

:target

以下操作变化时间为零秒,通过掌握后面的过渡动画可以控制变化时间。

aside:target {
    display: block;
    transform: translateY(150px);
    box-shadow: 0 0 10px #ddd;
}

移动元素

  • 沿X轴移动时正值向右移动、负值向左移动
  • 沿Y轴移动时正值向下移动、负值向上移动
  • 如果使用百分数将控制元素的原尺寸计算百分比然后移动
  • 可同时设置多个值,解析器会从左向右依次执行
  • 变形是在原基础上更改,即第二次设置值时不是在第一次值上变化
  1. translateX

正值向右移动、负值向左移动。

  1. translateY

正值向下移动、负值向上移动。

  1. translate

使用translate可以控制按X、Y同时移动操作,第一个值控制X移动,第二个值控制Y移动。

  1. 百分比移动

元素宽度为100px设置50%时将移动50px,即百分比是指元素的尺寸的百分比。

  1. 元素居中

居中可以使用多种方式,如弹性布局、定位操作,下面来看使用移动操作居中。

<style>
    body {
        height: 100vh;
    }

    main {
        width: 400px;
        height: 400px;
        border: solid 5px silver;
        position: relative;
    }

    main div {
        width: 100px;
        height: 100px;
        background: blueviolet;
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
    }
</style>

<main>
    <div></div>
</main>
  1. translateZ

控制Z轴移动,正数向外、负数向里移动。因为Z轴是透视轴没有像X/Y一样的固定尺寸,所以不能使用百分数。

<style>
    * {
        padding: 0;
        margin: 0;
        box-sizing: border-box;
        list-style: none;
    }

    body {
        width: 100vw;
        height: 100vh;
        background: #34495e;
    }

    main {
        position: absolute;
        left: 50%;
        top: 50%;
        width: 200px;
        height: 200px;
        transform-style: preserve-3d;
        transition: 2s;
        transform: perspective(900px) rotateY(60deg);
    }

    body:hover main {
        transform: perspective(600px) rotateY(60deg) scaleZ(5);
    }

    div {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: #f1c40f;
    }

    div.b {
        background: #8e44ad;
        transform: translateZ(-100px);
    }
</style>

<main>
    <div class="f"></div>
    <div class="b"></div>
</main>
  1. translate3d

用于同时控制X/Y/Z轴的移动,三个值必须输入如果某个轴不需要移动时设置为零。

  1. 渐变表单
  1. 页面切换

缩放元素

比如数值为2时表示为原尺寸的两倍。

  1. scaleX

transform: scaleX(.5);沿X轴缩放一半。

  1. scaleY

transform: scaleY(.5);沿Y轴缩放一半。

  1. scale

使用scale可同时设置 X/Y 轴的缩放,如果只设置一个值时表示两轴缩放相同。

使用数值定义缩放,如 .5 表示缩小一半,2 表示放大两倍。

  1. scaleZ

沿Z轴缩放元素,需要有3D透视才可以查看到效果。

  1. scale3d

沿X/Y/Z三个轴绽放元素。

  1. 菜单缩放

旋转操作

使用CSS可以控制元素按照不同坐标轴进行旋转。

  1. rotateX

控制元素按照X轴进行旋转操作。

  1. rotateY

按垂直轴旋转,如果旋转90deg 将不可见。

  1. rotateZ

没Z轴旋转元素,效果就是沿X/Y轴的平面旋转。

  1. rotate

在X与Y轴平面旋转,效果与使用 rotateZ 相同。

  1. rotate3d

同时设置X/Y/Z轴的旋转向量值来控制元素的旋转。

需要同时设置如下四个参数

rotate3d(tx,ty,tz,angle)

tx/ty/tz 1 需要 0 不需要转 angle 角度

倾斜操作

  1. skewX

沿X轴倾斜元素

  1. skewY

沿Y轴倾斜元素

  1. skew

同时设置X/Y轴倾斜操作,不指定第二个参数时Y轴倾斜为零。

  1. 按钮特效
  1. 立体按钮

变形基点

  • 使用 transform-origin 设置元素的X/YZ操作的基点,用于控制旋转、倾斜等操作。
    • 旋转默认以元素中心进行旋转,改变基点后可控制旋转点位置
    • 元素移动不受变形基点所影响
    • 基点是元素原始空间位,而不是translate移动后的空间位

语法:

transform-origin: x-axis y-axis z-axis;
描述
x-axis[left | center | right | length | %]
y-axis[left | center | right | length | %]
z-axislength
  1. 新年贺卡
  1. 动态菜单

透视景深

  • 使用 perspective 来控制元素的透视景深
  • perspective 规则为舞台元素控制景深, perspective 属性为控制单个元素
  1. 3D透视
  • 使用 transform-style 用于控制3d透视。
    • 应用于舞台即变形元素的父级元素
    • 设置 overflow:visible 时 preserve-3d 才无效
选项说明
flat2D平面舞台
preserve-3d3D透视舞台

观看视角

  1. perspective-origin

perspective-origin用于控制视线的落点,就像我们眼睛看物体时的聚焦点。可以理解眼镜看物体的位置,比如看一台汽车,是在看车头左边看还是车头右边看。

需要设置 perspective 透视后才可以看到效果。

一般设置在舞台元素上来控制子元素

  1. 参数
取值说明
x-axis[left | center | right | length | %]
y-axis[left | center | right | length | %]

默认值50%

  1. 立方体

隐藏背面

  1. backface-visibility
  • 使用 backface-visibility 用于控制是否可以看到元素的背面。
    • 一般设置在元素上而不是舞台元素上
    • 需要舞台元素(父级元素)设置 transform-style: preserve-3d
选项说明
visible背面可见
hidden背面隐藏
  1. 翻转卡片

常见问题

如果发现元素不能点击,可能是父级设置了 transform-style: preserve-3d 属性,且同级元素设置了3D变化特性,造成对点击元素有遮挡。有以下两种方式解决

  1. 对变形元素设置 pointer-events: none; 使用其不接受点击事件
  2. 删除父级的 transform-style: preserve-3d 属性
贡献者: mankueng