重拾CSS,前端样式精读-函数(变换-transform)

重拾CSS,前端样式精读-函数(变换-transform)

阿宇的宝库阿宇的宝库

前言

本文收录于CSS 系列文章中[1],欢迎阅读指正

CSS 的变换属性(transform)通过修改视觉格式化模型的坐标空间可以实现给定标签的旋转,缩放,倾斜或平移效果。transform 通常会和动画属性搭配,实现标签的缓动变化效果,本篇文章可能会比之前的文章有意思,感兴趣的话就接着往下看吧。

参照元素

为了观察元素的 3d 效果,我们需要实现一个正方体

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>CSS变换函数</title>
    <style>
        ul {
            list-style: none;
        }

        .box {
            transform-style: preserve-3d;
            margin0px auto 150px;
            height300px;
            width300px;
            perspective1000px;
            transition1s;
        }

        .box li {
            display: block;
            position: absolute;
            width200px;
            height200px;
            border: none;
            line-height200px;
            font-size60px;
            color: white;
            text-align: center;
        }

        .front {
            backgroundrgba(000, .5);
            transformtranslateZ(100px);
        }

        .back {
            backgroundrgba(02550, .5);
            color: black;
            transformrotateY(180degtranslateZ(100px);
        }

        .right {
            backgroundrgba(19600, .5);
            transformrotateY(90degtranslateZ(100px);
        }

        .left {
            backgroundrgba(00196, .5);
            transformrotateY(-90degtranslateZ(100px);
        }

        .top {
            backgroundrgba(1961960, .5);
            transformrotateX(90degtranslateZ(100px);
        }

        .bottom {
            backgroundrgba(1960196, .5);
            transformrotateX(-90degtranslateZ(100px);
        }

        .default {
            perspective1000px;
        }
    
</style>
</head>

<body>
    <ul id="box" class="box default">
        <li class="front">1</li>
        <li class="back">2</li>
        <li class="right">3</li>
        <li class="left">4</li>
        <li class="top">5</li>
        <li class="bottom">6</li>
    </ul>
</body>

</html>

后续将围绕这个正方体进行变换操作

创建 3D 场景及视角

Z 轴的一些操作不会在 2D 屏幕上显示任何变化,添加一个容器更换视角看的更直观

<section class="out-box">
    <ul id="box" class="box default">
        <li class="front">1</li>
        <li class="back">2</li>
        <li class="right">3</li>
        <li class="left">4</li>
        <li class="top">5</li>
        <li class="bottom">6</li>
    </ul>
</section>
.out-box {
    backgroundlinear-gradient(lightblue, lightgreen);
    perspective1200px;
    perspective-origin20% 20%;
    padding-top150px;
}

perspective

定义一个 3D 元素的视角。传入一个参数:perspective([">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/length "">"))其中的 length 定义了视图和 Z 平面之间的距离。它影响 3D 转换元素的视觉深度,仿佛是从用户的视点观察。一般情况下它与 transform 属性一起用。perspective 有两种写法,直接使用 perspective 属性定义距离,和充当 perspective 函数在 transform 中定义,前者不会被 transform 其他属性覆盖,后者一般配合其他 transform 函数一起使用

.perspective {
    /* perspective: 300px; */
    transformperspective(300px);
}

rotate

旋转元素。传入一个参数:rotate([">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">"))其中的 angle 是旋转角度,以度数 (deg)、弧度 (rad) 或圈 (turn) 为单位。一个正值表示顺时针旋转,而一个负值表示逆时针旋转。此旋转仅限于 2d 视角

.rotate {
    transformrotate(90deg);
    /* 相当于rotateZ(90deg) */
}

rotate3d

围绕一个由 3D 坐标定义的轴旋转元素。传入四个参数:rotate3d(rx, ry, rz,[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">")) 其中 rx, ry, rz 定义旋转轴的方向,而[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">")是旋转的角度。

.rotate3d {
    transformrotate3d(11145deg);
}

当 rx, ry, rz 的值不在-1 到 1 区间

说个题外话,关于 rx, ry, rz 规范化转换原理有以下概念:这三个分量通常是介于-1 到 1 之间的数值,如果(rx, ry, rz)不是单位向量,也就是说它们的平方和的平方根不等于 1,那么 CSS 会将其规范化为单位向量。来说说这个规范化操作,标准化操作是一个数学过程:将原向量的每一个分量除以向量的长度(根号下(rx^2+ry^2+rz^2))

transformrotate3d(2, 1, 1, 45deg);

当我们输入上述向量值时,浏览器会先求它的长度(高中向量中的模)这里是根号(2^2+1^2+1^2)

等于根号 6,然后再使用 2,1,1 分别除以根号 6

求向量长度最后可以得到上述代码实际上约等于

transformrotate3d(0.8165, 0.4082, 0.4082, 45deg);

rotateX

围绕 X 轴旋转元素。传入一个参数:rotateX([">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">"))其中的[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">")是围绕 X 轴的旋转角度。rotateX(a)相当于 rotate3d(1, 0, 0, a)

.rotateX {
    transformrotateX(45deg);
}

rotateY

围绕 Y 轴旋转元素。传入一个参数:rotateY([">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">"))其中的[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">")是围绕 Y 轴的旋转角度。rotateY(a) 相当于 rotate3d(0, 1, 0, a)

.rotateY {
    transformrotateY(45deg);
}

rotateZ

围绕 Z 轴旋转元素。传入一个参数:rotateZ([">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">"))其中的[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle "">")是围绕 Z 轴的旋转角度。rotateZ(a)相当于 rotate(a)或者 rotate3d(0, 0, 1, a)

.rotateZ {
    transformrotateZ(45deg);
}

scale

缩放元素。传入一个或两个参数:scale(sx[, sy]);x 和 y 类型是[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/number ", sy]);x 和 y 类型是[">"),其中 sx 定义水平方向的缩放因子,sy 定义垂直方向的缩放因子。如果省略 sy,则 sy 的值默认与 sx 相同。

.scale {
    transformscale(2);
    /* 双倍大小 */
}

scale3d

在 3D 空间中缩放元素。传入三个参数:scale3d(sx, sy, sz),参数类型同 scale,其中 sx、sy、和 sz 分别定义沿着 X 轴、Y 轴和 Z 轴的缩放因子。

.scale3d {
    transformscale3d(0.523);
}

scaleX

只在 X 轴上缩放元素。传入一个参数:scaleX(sx) 其中 sx 是水平方向的缩放因子,参数类型同 scale,scaleX(sx)等同于 scale(sx, 1)或 scale3d(sx, 1, 1)

.scaleX {
    transformscaleX(0.5);
    /* 宽度缩小到原来的一半 */
}

scaleY

只在 Y 轴上缩放元素。传入一个参数:scaleY(sy),其中 sy 是垂直方向的缩放因子。参数类型同 scale,scaleY(sy)等于 scale(1, sy)或 scale3d(1, sy, 1)

.scaleY {
    transformscaleY(2);
    /* 高度放大到原来的两倍 */
}

scaleZ

只在 Z 轴上缩放元素。传入一个参数:scaleZ(sz)其中 sz 是深度方向的缩放因子。参数类型同 scale,scaleZ(sz)相当于 scale3d(1, 1, sz)

.scaleZ {
    transformscaleZ(3);
}

skew

倾斜元素。传入一个或两个参数:skew(ax[, ay]) 其中 ax 是水平方向的倾斜角度,ay 是垂直方向的倾斜角度,参数类型都是[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle ", ay]) 其中 ax 是水平方向的倾斜角度,ay 是垂直方向的倾斜角度,参数类型都是[">")。如果省略 ay,其值默认为 0。

.skew {
    transformskew(30deg20deg);
}

skewX

只在 X 轴方向倾斜元素。传入一个参数:skewX(ax)其中 ax 是水平方向的倾斜角度,参数类型同 skew,skewX(a)相当于 skew(a)

.skewX {
    transformskewX(30deg);
}

skewY

只在 Y 轴方向倾斜元素。传入一个参数:skewY(ay)其中 ay 是垂直方向的倾斜角度,参数类型同 skew。

.skewY {
    transformskewY(20deg);
}

translate

移动元素位置。传入一个或两个参数:translate(tx[, ty])其中 tx 是水平方向的移动值,ty 是垂直方向的移动值,参数类型是[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/length ", ty])其中 tx 是水平方向的移动值,ty 是垂直方向的移动值,参数类型是[">")或者[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/percentage "">")。如果省略 ty,其值默认为 0。

.translate {
    transformtranslate(50px100px);
    /* 向右移动50px,向下移动100px */
}

translate3d

在 3D 空间中移动元素位置。传入三个参数:translate3d(tx, ty, tz),参数类型同 translate,其中 tx、ty、和 tz 分别定义了沿着 X 轴、Y 轴和 Z 轴的移动值。

.translate3d {
    transformtranslate3d(50px, -100px, -200px);
}

translateX

只在 X 轴方向移动元素位置。传入一个参数:translateX(tx)其中 tx 是水平方向的移动值,类型同 translate。translateX(tx)等同于 translate(tx, 0)或者 translate3d(tx, 0, 0)。

.translateX {
    transformtranslateX(100px);
    /* 向右移动100px */
}

translateY

只在 Y 轴方向移动元素位置。传入一个参数:translateY(ty)其中 ty 是垂直方向的移动值,类型同 translate。translateY(ty)对应 translate(0,ty)或 translate3d(0,ty,0)。

.translateY {
    transformtranslateY(150px);
    /* 向下移动150px */
}

translateZ

在 Z 轴方向上移动元素位置。传入一个参数:translateZ(tz),其中 tz 是深度方向的移动值,类型同 translate。translateZ(tz)等于 translate3d(0, 0, tz)

.translateZ {
    transformtranslateZ(300px);
}

matrix

应用 2D 转换矩阵到元素。该转换不透明且可以执行任何线性变换。传入六个参数:matrix(scaleX, skewY, skewX, scaleY, translateX, translateY),参数类型是[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/number "">")。一个 matrix 变换能够组合多个转换效果,如旋转、缩放、倾斜等。下面代码表示:元素在水平和垂直方向上缩小到原来的一半尺寸,并且会稍微倾斜,同时会向左上方都移动 100 像素。

.matrix {
    transformmatrix(.5, .1, .3, .5, -100, -100);
}

matrix3d

matrix3d()以 4x4 齐次矩阵的形式定义一个 3D 转换。传入十六个参数:matrix3d(a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3, a4, b4, c4, d4),类型为[">](https://developer.mozilla.org/zh-CN/docs/Web/CSS/number "">")。其支持执行如旋转、缩放、倾斜、平移等任意的线性变换以及透视变换。每个值可以是长度单位或无单位的数字,这些值通过矩阵乘法作用于元素的每一个顶点(假设此元素为一个 3D 立体),从而实现三维空间内的转换。

下面的代码表示元素无任何变化的参数

transformmatrix3d(1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1);

以下参数实现 perspective、rotateX、rotateY、rotateZ、scaleX、scaleY、scaleZ、translateX、translateY、和 translateZ 的复合变换效果

transformmatrix3d(0.866, 0.5, 0, 0,
        -0.5, 0.866, 0, 0,
        0, 0, 1.5, 0,
        100, 200, 50, 1);

由于 matrix3d()使用门槛较高,需要一定的线代知识,这里不多赘述。参考matrix3d() - CSS:层叠样式表 | MDN[2]

总结

本文详细介绍了 transform 函数的用法及说明,通过 transform 函数可以进行元素变换的属性,它可以包含多个变换函数,按照顺序逐一应用于元素。这些函数包括平移(translate、translateX、translateY、translate3d)、缩放(scale、scaleX、scaleY、scale3d)、旋转(rotate、rotateX、rotateY、rotateZ、rotate3d)、倾斜(skew、skewX、skewY)、以及透视(perspective)等。通过适当组合这些函数,可以实现各种二维和三维的变换效果。

以上就是文章全部内容,感谢你看到了最后,如果觉得本篇文章或者这个系列写的不错,还望三连支持一下,你的支持就是我创作的动力,谢谢!

相关代码

myCode: 基于 js 的一些小案例或者项目 - Gitee.com[3]

参考

transform - CSS:层叠样式表 | MDN[4]

使用 CSS 变换 - CSS:层叠样式表 | MDN[5]

transform-function - CSS:层叠样式表 | MDN[6]

参考资料

[1]

CSS系列文章中: https://blog.csdn.net/time_____/category_12574101.html

[2]

matrix3d() - CSS:层叠样式表 | MDN: https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-function/matrix3d

[3]

myCode: 基于js的一些小案例或者项目 - Gitee.com: https://gitee.com/DieHunter/myCode/tree/master/css%E7%9F%A5%E8%AF%86%E7%82%B9/%E5%87%BD%E6%95%B0/%E5%8F%98%E6%8D%A2

[4]

transform - CSS:层叠样式表 | MDN: https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform

[5]

使用 CSS 变换 - CSS:层叠样式表 | MDN: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_transforms/Using_CSS_transforms

[6]

transform-function - CSS:层叠样式表 | MDN: https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-function



重拾CSS,前端样式精读-函数(变换-transform)
http://website.diehunter1024.work/2024/08/20/重拾CSS,前端样式精读-函数(变换-transform)/
作者
阿宇的宝库
发布于
2024年8月20日
许可协议