一、CSS Transforms(变形,转换)

  • 用途: transform 属性用于对元素进行旋转、缩放、倾斜或平移等变换。

  • 功能: 它可以改变元素的形状、大小和位置,但不会影响文档流中的其他元素。

  • 示例: transform: rotate(45deg); 会使元素旋转45度。

简单说,CSS Transforms 允许你修改元素的形状、大小和位置,而不需要使用 JavaScript。

1.1 主要的 transform 函数

translate() - 移动元素

 transform: translate(50px, 100px);  /* X轴移动50px,Y轴移动100px */
 transform: translateX(50px);       /* 仅X轴移动 */
 transform: translateY(100px);      /* 仅Y轴移动 */
 transform: translateZ(20px);       /* 3D变换,Z轴移动 */

scale() - 缩放元素

 transform: scale(2);        /* 宽高都缩放为原来的2倍 */
 transform: scaleX(1.5);     /* 仅宽度缩放为原来的1.5倍 */
 transform: scaleY(0.8);     /* 仅高度缩放为原来的0.8倍 */

rotate() - 旋转元素

transform: rotate(45deg);   /* 顺时针旋转45度 */
transform: rotateX(180deg); /* 3D变换,绕X轴旋转 */
transform: rotateY(90deg);  /* 3D变换,绕Y轴旋转 */

skew() - 倾斜元素

transform: skew(30deg, 20deg); /* X轴倾斜30度,Y轴倾斜20度 */
transform: skewX(30deg);      /* 仅X轴倾斜 */
transform: skewY(20deg);      /* 仅Y轴倾斜 */

matrix() - 结合多个变换

transform: matrix(a, b, c, d, e, f);

这个 6 值矩阵对应以下数学变换:
[ a c e ]
[ b d f ]
[ 0 0 1 ]

参数含义
a - 水平缩放
b - 水平倾斜
c - 垂直倾斜
d - 垂直缩放
e - 水平移动
f - 垂直移动

示例:

/* 等比例放大 1.5 倍 */
.matrix-scale {
  transform: matrix(1.5, 0, 0, 1.5, 0, 0);
}

/* 等同于 */
.transform-scale {
  transform: scale(1.5);
}
1.2 重要特性
  • transform 不会改变文档流,其他元素不会因为某个元素的 transform 而重新排列

  • 可以组合多个 transform 函数

transform: rotate(45deg) translate(50px, 50px) scale(1.5);
  • transform-origin 属性可以改变变换的原点

 transform-origin: center;  /* 从中心开始变换 */
 transform-origin: 0 0;     /* 从左上角开始变换 */

二、CSS Transitions(过渡)

  • 用途: transition 属性用于在一定时间内平滑地改变元素的某些样式属性。

  • 功能: 它允许你定义当样式属性发生变化时的过渡效果,如持续时间、延迟、缓动函数等。

  • 示例: transition: background-color 0.5s ease; 会在背景颜色改变时,使用0.5秒的持续时间和“ease”缓动函数来平滑过渡。

简单说:CSS Transitions 允许你控制元素状态变化时的过渡效果,让变化更加平滑。

2.1 transition属性

 transition-property - 指定要过渡的CSS属性,简单说,就是指定哪些CSS属性应该有过渡效果。

transition-property: width;        /* 仅宽度变化时有过渡效果 */
transition-property: all;          /* 所有可过渡属性都有过渡效果 */

transition-duration - 指定过渡效果的持续时间

transition-duration: 1s;           /* 过渡效果持续1秒 */
transition-duration: 200ms;        /* 过渡效果持续200毫秒 */

transition-timing-function - 指定过渡的时间曲线,简单说,就是指定过渡效果的加速或减速方式。

transition-timing-function: ease;          /* 慢快慢 */
transition-timing-function: linear;        /* 匀速 */
transition-timing-function: ease-in;       /* 慢入 */
transition-timing-function: ease-out;      /* 慢出 */
transition-timing-function: ease-in-out;   /* 慢入慢出 */
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1); /* 自定义曲线 */

transition-delay - 指定过渡效果开始前的延迟时间

 transition-delay: 0s;            /* 无延迟 */
 transition-delay: 500ms;         /* 延迟500毫秒 */

transition - 简写属性

记忆技巧:pdf-d

将transition想象为一个句子,其中property是谁,duration是做什么,timing-function是怎么做,delay是什么时候做。

可以把它们想象成一个过渡的“剧本”,其中property是剧本的主题,duration是剧本的长度,timing-function是剧本的节奏,delay是剧本开始前的准备时间。

示例一:

transition: property duration timing-function delay;
transition: width 1s ease 0.5s; /* 宽度变化,1秒,慢快慢,延迟0.5秒 */
transition: all 0.3s ease;      /* 所有变化,0.3秒,慢快慢 */

示例二:

.longhand {
  transition-property: transform;
  transition-duration: 300ms;
  transition-timing-function: ease-in-out;
  transition-delay: 0s;
}

.shorthand {
  transition: transform 300ms ease-in-out 0s;
}
2.2 转换触发器:Transition triggers

CSS 必须包含状态更改和触发该状态更改的事件,才能使 CSS 转换生效。

  • :hover:如果光标位于相应元素上方,则匹配。

  • :focus:如果元素获得焦点,则匹配。

  • :focus-within:如果元素或其任何后代获得焦点,则匹配。

  • :target:如果当前网址的片段与元素的 ID 匹配,则匹配。

  • :active:在元素激活时(通常是在鼠标上按下时)匹配。

class 与 JavaScript 之间的变化:当元素的 CSS class 通过 JavaScript 发生更改时,CSS 会转换已更改的符合条件的属性。

示例:

.element {
  width: 100px;
  height: 100px;
  background-color: blue;
  transition: width 1s ease, height 1s ease, background-color 1s ease;
}

.element:hover {
  width: 200px;
  height: 200px;
  background-color: red;
}
2.3 Transitions 和 Transforms 的结合使用

两个属性结合使用可以创建丰富的动画效果:

.box {
  width: 100px;
  height: 100px;
  background-color: green;
  transition: transform 0.5s ease;
}

.box:hover {
  transform: rotate(45deg) scale(1.5) translateX(50px);
}

三、关键区别

3.1 功能不同

  • Transform:改变元素的形状、位置、大小。

  • Transition:控制这些改变发生的方式(持续时间、缓动函数等)。

3.2 触发方式

  • Transform 本身不会产生动画效果,它只是定义最终状态。

  • Transition 需要有状态变化(如hover、focus等)才能触发。

3.3 性能考量

  • 使用 transform 和 opacity 进行过渡动画性能更好,因为它们可以利用 GPU 加速。

  • 避免使用 width、height、margin 等属性的过渡,因为它们会触发重排(reflow)。

3.4 3D变换

  • 两者都支持3D变换,但需要设置 perspective 属性来创建3D效果。

 .container {
     perspective: 1000px;
   }
   .element {
     transform: rotateY(45deg);
     transition: transform 1s;
   }

四、浏览器兼容性

现代浏览器都支持这两个属性,但在一些旧版本浏览器中可能需要添加前缀:

.element {
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
  
  -webkit-transition: transform 1s;
  -moz-transition: transform 1s;
  -ms-transition: transform 1s;
  transition: transform 1s;
}

总结

Transform负责“变身”,Transition负责“优雅变身”;通过合理使用 Transitions 和 Transforms,你可以创建流畅、高效的动画效果,提升用户体验。