前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS transform 多函数顺序与矩阵乘法
CSS动画与视觉

transform 里同时写 translate、rotate、scale,顺序不同结果为什么不一样?

transform 里的函数从左到右依次作用在元素的本地坐标系上。每个函数都会改变坐标系,后面的函数是在已经改变的坐标系里执行的。所以先 rotate 再 translate 会沿着旋转后的方向平移,和先 translate 再 rotate 的结果完全不同。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#动画与视觉#动画
先看核心答案读代码示例
理解线索

理解变换顺序的三个关键

  1. 本地坐标系每个元素有自己的坐标系,变换函数作用在这个坐标系上
  2. 从左到右执行书写顺序就是执行顺序,每一步都改变坐标系的方向和比例
  3. 矩阵右乘数学上等价于矩阵从右往左相乘,但记住「从左到右作用于坐标系」更直观

新的独立变换属性(translate、rotate、scale)有固定的执行顺序:先 translate 再 rotate 最后 scale,不受书写顺序影响。只有 transform 属性里才看书写顺序。

核心回答

先记住这个答案

transform 属性里可以写多个函数,比如 transform: rotate(45deg) translateX(100px)。浏览器从左到右依次执行这些函数,每个函数都会改变元素的本地坐标系。先 rotate(45deg) 会让坐标系旋转 45 度,然后 translateX(100px) 就是沿着旋转后的 X 轴方向移动,元素最终会向右下方移动。如果把顺序反过来写成 translateX(100px) rotate(45deg),元素先水平右移 100px,再在那个位置原地旋转 45 度,落点完全不同。

  • 函数从左到右依次作用,每个都改变后续函数的坐标系
  • 先旋转再位移,会沿旋转轴移动
  • 调换变换函数顺序会改变最终位置
  • scale 的位置会影响位移效果

一个对比实验看清区别

想象一个蓝色方块放在页面左上角,坐标原点在元素中心。

两种顺序的不同结果CSS
/* 先旋转再平移:沿 45 度方向飞出去 */
.box-a {
  transform: rotate(45deg) translateX(100px);
}

/* 先平移再旋转:水平移动后原地转 */
.box-b {
  transform: translateX(100px) rotate(45deg);
}

.box-a 先把坐标系转了 45 度,这时候 X 轴指向右下方,再沿 X 轴走 100px,元素就到了右下方。.box-b 先沿水平方向走 100px,到了右边,然后在那个位置绕中心转 45 度,元素还是在正右边,只是歪了。 记忆口诀:左边的函数先改坐标系,右边的函数在改过的坐标系里执行。

scale 对位移距离的影响

scale 会缩放坐标系的单位长度。如果 scale(2) 写在 translateX(50px) 前面,坐标系的 1px 变成了 2px,实际移动距离就变成 100px。

反过来,translateX(50px) 写在前面,先移动 50px(坐标系还没缩放),再 scale(2) 让元素放大两倍,移动距离不受影响。

这是最容易踩坑的地方。布局时发现元素位置偏了,往往就是 scale 放在了 translate 前面。

独立变换属性的固定顺序

CSS 新增了 translate、rotate、scale 三个独立属性,可以分开写。它们的执行顺序是规范固定的:先 translate,再 rotate,最后 scale,和你在样式表里的书写顺序无关。

这意味着 translate: 100px 0; rotate: 45deg; 和 rotate: 45deg; translate: 100px 0; 的效果一模一样,都是先平移再旋转。如果你需要先旋转再平移的效果,就只能用 transform 属性把它们写在一个值里。

回答前,多想一步

容易答错的地方

以为矩阵从右往左执行就意味着「右边的先算」
数学上确实是右乘,但理解方式应该是「从左到右依次作用在坐标系上」。面试时用坐标系的思路解释更清楚:左边的函数先改坐标系,右边的函数在改过的坐标系里操作。
把独立属性和 transform 属性的顺序规则搞混
transform: rotate() translate() 的顺序你自己定。rotate: 45deg; translate: 100px; 的顺序是规范定死的(translate 先执行)。混用时两者会叠加,独立属性先于 transform 执行。
试着用自己的话回答

面试官还会怎么问?

transform-origin 会影响函数的执行顺序吗?

不会影响执行顺序,但会影响旋转和缩放的参考点。默认是元素中心,改成 top left 后 rotate 就绕左上角转。执行顺序仍然是从左到右,只是每个函数的参考点变了。

怎么在动画里分别控制平移和旋转的时长?

用独立属性。translate 和 rotate 是两个属性,可以各自设不同的 transition-duration。用 transform 属性的话整个值是一体的,没法分开设时长。

多个 transform 声明会合并还是覆盖?

和其他 CSS 属性一样,后声明的覆盖前声明的。transform: rotate(45deg); 后面再写 transform: scale(2);,最终只有 scale(2) 生效,rotate 被覆盖了。想同时生效必须写在一个声明里:transform: rotate(45deg) scale(2);。

从一道题,走向一组知识

把知识连起来

动画与视觉

怎么用 CSS 让文字显示渐变色?

background-clip: text 会受容器的 transform 影响坐标系,理解变换顺序有助于定位渐变文字的偏移问题。

动画与视觉

用 prefers-reduced-motion 覆盖动画时,为什么不该直接删除 transition?

减弱动效时通常要把 transform 动画替换为无动画状态,了解变换顺序才能正确设置 none 的回退值。

参考资料

  • CSS:动画与视觉参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 一个对比实验看清区别
  3. scale 对位移距离的影响
  4. 独立变换属性的固定顺序
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑