CSS: 过渡与滤镜

1. 过渡(Transition)

过渡让元素的属性变化不再是"瞬间跳变",而是在一定时间内平滑过渡,形成动画效果。

(1) transition 属性

CSS
.box {
  width: 100px;
  height: 100px;
  background: blue;
  transition: all 0.3s ease;  /* 所有属性变化,0.3秒过渡 */
}

.box:hover {
  background: red;
  transform: scale(1.2);
}

当鼠标悬停时,盒子不是瞬间变成红色和放大,而是在 0.3 秒内平滑变化。

(2) transition 的四个子属性

transition-property: 指定哪些属性参与过渡

CSS
.box {
  transition-property: background;  /* 只有背景色有过渡 */
  transition-property: all;         /* 所有可过渡属性 */
}

transition-duration: 过渡持续时间

CSS
.box {
  transition-duration: 0.5s;   /* 500毫秒 */
  transition-duration: 300ms;  /* 300毫秒 */
}

transition-timing-function: 速度曲线

CSS
.box {
  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: 延迟时间

CSS
.box {
  transition-delay: 0.2s;  /* 鼠标悬停后0.2秒才开始过渡 */
}

(3) transition 简写

CSS
.box {
  transition: all 0.3s ease 0.1s;
  /* property duration timing-function delay */
}

(4) 多个属性不同设置

CSS
.box {
  transition: background 0.3s ease,
              transform 0.5s ease-out,
              opacity 0.2s linear;
}

(5) 可过渡的属性

并非所有属性都能过渡。常见的可过渡属性包括:

(6) 触发过渡的方式

过渡需要属性的值发生变化才会触发,常见的触发方式:

  1. 伪类:hover:focus:active:checked
  2. JavaScript:动态添加/删除类或修改样式
  3. 媒体查询变化:改变窗口大小时属性变化

2. 滤镜(Filter)

CSS 滤镜可以在不修改原始资源的情况下,改变元素的视觉效果。

(1) 基本语法

CSS
.element {
  filter: blur(5px);
  /* 多个滤镜用空格分隔 */
  filter: brightness(1.5) contrast(1.2);
}

(2) 常用滤镜函数

blur(): 模糊

CSS
img {
  filter: blur(2px);     /* 2像素模糊 */
}

brightness(): 亮度

CSS
img {
  filter: brightness(1.5);  /* 变亮50% */
  filter: brightness(0.5);  /* 变暗50% */
}

contrast(): 对比度

CSS
img {
  filter: contrast(1.5);  /* 增加对比度 */
}

saturate(): 饱和度

CSS
img {
  filter: saturate(2);  /* 饱和度翻倍 */
}

grayscale(): 灰度

CSS
img {
  filter: grayscale(100%);  /* 完全黑白 */
  filter: grayscale(50%);   /* 部分灰度 */
}

sepia(): 复古色调

CSS
img {
  filter: sepia(100%);  /* 复古效果 */
}

invert(): 反转颜色

CSS
img {
  filter: invert(100%);  /* 负片效果 */
}

hue-rotate(): 色相旋转

CSS
img {
  filter: hue-rotate(90deg);  /* 色相旋转90度 */
}

drop-shadow(): 投影阴影

CSS
img {
  filter: drop-shadow(2px 4px 6px rgba(0,0,0,0.5));
  /* 与 box-shadow 不同,drop-shadow 会跟随图像的非矩形轮廓 */
}

(3) 滤镜与过渡结合

CSS
img {
  filter: grayscale(100%);
  transition: filter 0.5s ease;
}

img:hover {
  filter: grayscale(0%);  /* 悬停时从黑白变为彩色 */
}

▶ 示例

一个带过渡和滤镜的按钮:

HTML
<!DOCTYPE html>
<html>
<head>
  <style>
    .btn {
      padding: 10px 20px;
      background: navy;
      color: white;
      border: none;
      transition: all 0.3s ease;
      filter: brightness(100%);
    }
    .btn:hover {
      background: orange;
      transform: scale(1.1);
      filter: brightness(120%) drop-shadow(2px 2px 4px rgba(0,0,0,0.3));
    }
  </style>
</head>
<body>
  <button class="btn">悬停我</button>
</body>
</html>
▶ 试一试

鼠标悬停时,按钮平滑过渡到橙色 + 放大 10% + 变亮 + 投影。整个动画在 0.3 秒内完成。


❓ 常见问题

Q transition 和 animation 有什么区别?
A transition 需要触发条件(如 hover)才能执行,是从 A 状态到 B 状态的过渡,不能循环。animation 不需要触发,可以自动运行,支持多关键帧、循环、反向播放等更复杂的功能。简单说:transition 适合单次交互反馈,animation 适合独立动画。
Q filter: drop-shadow() 和 box-shadow 有什么不同?
A box-shadow 是给元素的盒子边缘加阴影,不关心内容形状。drop-shadow() 会跟随元素的实际轮廓——比如给一个透明 PNG 图片加阴影,box-shadow 会阴影出矩形框,drop-shadow() 会沿着图片中物体的边缘投射。两者用在不同场景。
Q 为什么有时候 transition 不起作用?
A 常见原因有三个:1)属性本身不支持过渡(如 display、float);2)初始值或结束值没写全,浏览器不知道从哪里变到哪里;3)元素默认 display: none,从无到有时过渡不生效,可以用 animation 代替,或者用 visibility + opacity 配合。

📖 小节

过渡是 CSS 动画最简单的方式——指定哪些属性变化时要平滑过渡、过渡多久、用什么节奏。滤镜则提供了强大的图像处理能力,可以轻松实现模糊、灰度、色彩调整等效果。两者结合(比如鼠标悬停时渐进应用滤镜效果)能创造出非常丰富的交互反馈。

📝 作业

  1. 创建一个按钮,鼠标悬停时背景色在 0.3 秒内渐变变化,同时按钮略微放大。
  2. 创建一个图片画廊,默认图片显示为灰度,鼠标悬停时平滑变为彩色。
  3. 制作一个"导航下划线动画"——鼠标悬停在导航项上时,底部横线从中间向两侧展开(使用 transition)。
  4. 使用滤镜 + 过渡,实现鼠标悬停时图片变亮且略有模糊的效果。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏