轩辕李的博客 轩辕李的博客
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • JavaScript
  • TypeScript
  • Node.js
  • Vue.js
  • 前端工程化
  • 浏览器与Web API
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

轩辕李

勇猛精进,星辰大海
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • JavaScript
  • TypeScript
  • Node.js
  • Vue.js
  • 前端工程化
  • 浏览器与Web API
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaScript

  • TypeScript

  • Node.js

  • Vue.js

  • 工程化

  • 浏览器与Web API

    • HTML基础-语义化标签与文档结构
    • HTML基础-文本与排版标签
    • HTML基础-列表与表格
    • HTML表单-Input类型详解
    • HTML表单-表单元素与验证
    • HTML交互-多媒体元素
    • HTML工程化-模板与组件化
    • HTML工程化-性能优化
    • CSS基础-选择器与优先级
    • CSS基础-盒模型与布局基础
    • CSS基础-单位与颜色系统
    • CSS基础-文本与字体
    • CSS基础-背景、列表与表格样式
    • CSS布局-Flexbox完全指南
    • CSS布局-Grid网格布局
    • CSS布局-响应式设计实践
    • CSS进阶-动画与过渡
    • CSS进阶-渐变与阴影效果
    • CSS进阶-Transform与3D变换
    • CSS进阶-滤镜与混合模式
      • 一、CSS滤镜(Filter)
        • 1.1 filter属性概述
        • 1.2 blur(模糊)
        • 1.3 brightness(亮度)
        • 1.4 contrast(对比度)
        • 1.5 grayscale(灰度)
        • 1.6 sepia(褐色/复古)
        • 1.7 saturate(饱和度)
        • 1.8 hue-rotate(色相旋转)
        • 1.9 invert(反转)
        • 1.10 opacity(透明度)
        • 1.11 drop-shadow(投影)
        • 1.12 url(SVG滤镜)
        • 1.13 backdrop-filter(背景滤镜)
      • 二、混合模式(Blend Mode)
        • 2.1 mix-blend-mode(元素混合模式)
        • multiply(正片叠底)
        • screen(滤色)
        • overlay(叠加)
        • difference(差值)
        • color(颜色)
        • 2.2 background-blend-mode(背景混合模式)
        • 2.3 isolation(隔离)
      • 三、实战案例
        • 3.1 毛玻璃卡片
        • 3.2 图片滤镜效果
        • 3.3 混合模式文字效果
        • 3.4 双色调图片效果
        • 3.5 动态滤镜切换
      • 四、性能优化与最佳实践
        • 4.1 性能考虑
        • 4.2 浏览器兼容性处理
        • 4.3 可访问性
        • 4.4 实用技巧
        • 4.5 常见错误
      • 五、浏览器兼容性
        • 5.1 filter属性
        • 5.2 混合模式
        • 5.3 前缀处理
      • 六、总结
        • 核心要点
    • 现代CSS-CSS预处理器对比
    • 现代CSS-CSS-in-JS方案
    • 现代CSS-原子化CSS与Tailwind
    • CSS工程化-架构与规范
    • CSS工程化-性能优化
    • CSS工程化-PostCSS实战指南
    • Web API基础-DOM操作完全指南
    • Web API基础-事件处理与委托
    • Web API基础-BOM与浏览器环境
    • Web API存储-客户端存储方案
    • Web API网络-HTTP请求详解
    • Web API网络-实时通信方案
    • Web API交互-用户体验增强
    • HTML&CSS历代版本新特性
  • 前端
  • 浏览器与Web API
轩辕李
2019-03-20
目录

CSS进阶-滤镜与混合模式

CSS滤镜(Filter)和混合模式(Blend Mode)是实现丰富视觉效果的强大工具。它们能让你轻松创建模糊、颜色调整、图层混合等效果,而无需依赖图片编辑软件。

本文将系统介绍CSS滤镜函数、混合模式以及它们在实际项目中的应用技巧。

# 一、CSS滤镜(Filter)

# 1.1 filter属性概述

filter 属性对元素应用图形效果,如模糊、颜色偏移等。

/* 基础语法 */
.element {
  filter: <filter-function>;
}

/* 多个滤镜(按顺序应用) */
.element {
  filter: blur(5px) brightness(1.2) contrast(1.1);
}

/* 移除滤镜 */
.element {
  filter: none; /* 默认值 */
}

# 1.2 blur(模糊)

创建高斯模糊效果。

/* 语法:blur(radius) */

/* 轻微模糊 */
.blur-light {
  filter: blur(2px);
}

/* 中度模糊 */
.blur-medium {
  filter: blur(5px);
}

/* 重度模糊 */
.blur-heavy {
  filter: blur(10px);
}

/* 实战:背景模糊(毛玻璃效果) */
.glass-effect {
  backdrop-filter: blur(10px);
  background: rgba(255, 255, 255, 0.2);
  border: 1px solid rgba(255, 255, 255, 0.3);
}

/* 实战:图片加载时的模糊占位 */
.lazy-image {
  filter: blur(20px);
  transition: filter 0.3s ease;
}

.lazy-image.loaded {
  filter: blur(0);
}
<html>
  <div class="blur-demo-mbb2ev">
    <div class="blur-item-mbb2ev blur-0-mbb2ev">
      <div class="content-mbb2ev">blur(0)</div>
    </div>
    <div class="blur-item-mbb2ev blur-2-mbb2ev">
      <div class="content-mbb2ev">blur(2px)</div>
    </div>
    <div class="blur-item-mbb2ev blur-5-mbb2ev">
      <div class="content-mbb2ev">blur(5px)</div>
    </div>
    <div class="blur-item-mbb2ev blur-10-mbb2ev">
      <div class="content-mbb2ev">blur(10px)</div>
    </div>
  </div>
</html>
<style>
.blur-demo-mbb2ev {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.blur-item-mbb2ev {
  height: 120px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-mbb2ev {
  color: white;
  font-weight: 600;
  font-size: 18px;
  text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
}
.blur-0-mbb2ev { filter: blur(0); }
.blur-2-mbb2ev { filter: blur(2px); }
.blur-5-mbb2ev { filter: blur(5px); }
.blur-10-mbb2ev { filter: blur(10px); }
</style>

# 1.3 brightness(亮度)

调整图像亮度。

/* 语法:brightness(amount) */
/* 0 = 全黑,1 = 原始,>1 = 更亮 */

/* 变暗 */
.darker {
  filter: brightness(0.5); /* 50%亮度 */
}

/* 正常 */
.normal {
  filter: brightness(1); /* 100%亮度 */
}

/* 变亮 */
.brighter {
  filter: brightness(1.5); /* 150%亮度 */
}

/* 实战:悬停时变亮 */
.card {
  filter: brightness(0.9);
  transition: filter 0.3s ease;
}

.card:hover {
  filter: brightness(1.1);
}

/* 实战:夜间模式调暗 */
.night-mode img {
  filter: brightness(0.7);
}
<html>
  <div class="brightness-demo-mbb2ev">
    <div class="brightness-item-mbb2ev brightness-05-mbb2ev">
      <div class="content-mbb2ev">brightness(0.5)</div>
    </div>
    <div class="brightness-item-mbb2ev brightness-1-mbb2ev">
      <div class="content-mbb2ev">brightness(1)</div>
    </div>
    <div class="brightness-item-mbb2ev brightness-15-mbb2ev">
      <div class="content-mbb2ev">brightness(1.5)</div>
    </div>
    <div class="brightness-item-mbb2ev brightness-2-mbb2ev">
      <div class="content-mbb2ev">brightness(2)</div>
    </div>
  </div>
</html>
<style>
.brightness-demo-mbb2ev {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.brightness-item-mbb2ev {
  height: 120px;
  background: linear-gradient(135deg, #ff6b6b 0%, #4ecdc4 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-mbb2ev {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.brightness-05-mbb2ev { filter: brightness(0.5); }
.brightness-1-mbb2ev { filter: brightness(1); }
.brightness-15-mbb2ev { filter: brightness(1.5); }
.brightness-2-mbb2ev { filter: brightness(2); }
</style>

# 1.4 contrast(对比度)

调整图像对比度。

/* 语法:contrast(amount) */
/* 0 = 灰色,1 = 原始,>1 = 更高对比度 */

/* 降低对比度 */
.low-contrast {
  filter: contrast(0.5);
}

/* 正常对比度 */
.normal-contrast {
  filter: contrast(1);
}

/* 增强对比度 */
.high-contrast {
  filter: contrast(1.5);
}

/* 实战:增强文字清晰度 */
.sharp-text {
  filter: contrast(1.2) brightness(1.1);
}

/* 实战:弱化背景图 */
.background-image {
  filter: contrast(0.8) brightness(0.9);
}
<html>
  <div class="contrast-demo-kx8m4p">
    <div class="contrast-item-kx8m4p contrast-05-kx8m4p">
      <div class="content-kx8m4p">contrast(0.5)</div>
    </div>
    <div class="contrast-item-kx8m4p contrast-1-kx8m4p">
      <div class="content-kx8m4p">contrast(1)</div>
    </div>
    <div class="contrast-item-kx8m4p contrast-15-kx8m4p">
      <div class="content-kx8m4p">contrast(1.5)</div>
    </div>
    <div class="contrast-item-kx8m4p contrast-2-kx8m4p">
      <div class="content-kx8m4p">contrast(2)</div>
    </div>
  </div>
</html>
<style>
.contrast-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.contrast-item-kx8m4p {
  height: 120px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.contrast-05-kx8m4p { filter: contrast(0.5); }
.contrast-1-kx8m4p { filter: contrast(1); }
.contrast-15-kx8m4p { filter: contrast(1.5); }
.contrast-2-kx8m4p { filter: contrast(2); }
</style>

# 1.5 grayscale(灰度)

将图像转换为灰度。

/* 语法:grayscale(amount) */
/* 0 = 彩色,1 = 完全灰度 */

/* 彩色 */
.color {
  filter: grayscale(0);
}

/* 部分灰度 */
.semi-gray {
  filter: grayscale(0.5);
}

/* 完全灰度 */
.full-gray {
  filter: grayscale(1);
}

/* 实战:图片悬停时彩色 */
.image-gray {
  filter: grayscale(1);
  transition: filter 0.3s ease;
}

.image-gray:hover {
  filter: grayscale(0);
}

/* 实战:禁用状态 */
button:disabled {
  filter: grayscale(1);
  opacity: 0.6;
  cursor: not-allowed;
}
<html>
  <div class="grayscale-demo-mbb2ev">
    <div class="gray-item-mbb2ev gray-0-mbb2ev">
      <div class="content-mbb2ev">grayscale(0)</div>
    </div>
    <div class="gray-item-mbb2ev gray-03-mbb2ev">
      <div class="content-mbb2ev">grayscale(0.3)</div>
    </div>
    <div class="gray-item-mbb2ev gray-07-mbb2ev">
      <div class="content-mbb2ev">grayscale(0.7)</div>
    </div>
    <div class="gray-item-mbb2ev gray-1-mbb2ev">
      <div class="content-mbb2ev">grayscale(1)</div>
    </div>
  </div>
</html>
<style>
.grayscale-demo-mbb2ev {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.gray-item-mbb2ev {
  height: 120px;
  background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-mbb2ev {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.gray-0-mbb2ev { filter: grayscale(0); }
.gray-03-mbb2ev { filter: grayscale(0.3); }
.gray-07-mbb2ev { filter: grayscale(0.7); }
.gray-1-mbb2ev { filter: grayscale(1); }
</style>

# 1.6 sepia(褐色/复古)

给图像添加褐色调,产生复古照片效果。

/* 语法:sepia(amount) */
/* 0 = 无效果,1 = 完全褐色 */

/* 轻微复古 */
.vintage-light {
  filter: sepia(0.3);
}

/* 中度复古 */
.vintage-medium {
  filter: sepia(0.6);
}

/* 完全复古 */
.vintage-full {
  filter: sepia(1);
}

/* 实战:老照片效果 */
.old-photo {
  filter: sepia(0.8) contrast(1.2) brightness(0.9);
}
<html>
  <div class="sepia-demo-kx8m4p">
    <div class="sepia-item-kx8m4p sepia-0-kx8m4p">
      <div class="content-kx8m4p">sepia(0)</div>
    </div>
    <div class="sepia-item-kx8m4p sepia-03-kx8m4p">
      <div class="content-kx8m4p">sepia(0.3)</div>
    </div>
    <div class="sepia-item-kx8m4p sepia-07-kx8m4p">
      <div class="content-kx8m4p">sepia(0.7)</div>
    </div>
    <div class="sepia-item-kx8m4p sepia-1-kx8m4p">
      <div class="content-kx8m4p">sepia(1)</div>
    </div>
  </div>
</html>
<style>
.sepia-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.sepia-item-kx8m4p {
  height: 120px;
  background: linear-gradient(135deg, #00c6ff 0%, #0072ff 50%, #00d2ff 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.sepia-0-kx8m4p { filter: sepia(0); }
.sepia-03-kx8m4p { filter: sepia(0.3); }
.sepia-07-kx8m4p { filter: sepia(0.7); }
.sepia-1-kx8m4p { filter: sepia(1); }
</style>

# 1.7 saturate(饱和度)

调整图像颜色饱和度。

/* 语法:saturate(amount) */
/* 0 = 完全不饱和(灰度),1 = 原始,>1 = 过饱和 */

/* 降低饱和度 */
.desaturate {
  filter: saturate(0.5);
}

/* 正常饱和度 */
.normal-saturate {
  filter: saturate(1);
}

/* 增强饱和度 */
.over-saturate {
  filter: saturate(2);
}

/* 实战:鲜艳的图片 */
.vibrant {
  filter: saturate(1.5) contrast(1.1);
}

/* 实战:柔和的配色 */
.soft-colors {
  filter: saturate(0.7);
}
<html>
  <div class="saturate-demo-kx8m4p">
    <div class="saturate-item-kx8m4p saturate-0-kx8m4p">
      <div class="content-kx8m4p">saturate(0)</div>
    </div>
    <div class="saturate-item-kx8m4p saturate-05-kx8m4p">
      <div class="content-kx8m4p">saturate(0.5)</div>
    </div>
    <div class="saturate-item-kx8m4p saturate-1-kx8m4p">
      <div class="content-kx8m4p">saturate(1)</div>
    </div>
    <div class="saturate-item-kx8m4p saturate-2-kx8m4p">
      <div class="content-kx8m4p">saturate(2)</div>
    </div>
  </div>
</html>
<style>
.saturate-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.saturate-item-kx8m4p {
  height: 120px;
  background: linear-gradient(135deg, #fa709a 0%, #fee140 50%, #30cfd0 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.saturate-0-kx8m4p { filter: saturate(0); }
.saturate-05-kx8m4p { filter: saturate(0.5); }
.saturate-1-kx8m4p { filter: saturate(1); }
.saturate-2-kx8m4p { filter: saturate(2); }
</style>

# 1.8 hue-rotate(色相旋转)

旋转图像色相环。

/* 语法:hue-rotate(angle) */
/* 0deg = 原始,360deg = 旋转一圈回到原始 */

/* 旋转90度 */
.hue-90 {
  filter: hue-rotate(90deg);
}

/* 旋转180度(反色效果) */
.hue-180 {
  filter: hue-rotate(180deg);
}

/* 完整一圈 */
.hue-360 {
  filter: hue-rotate(360deg); /* 回到原始 */
}

/* 实战:动态色相变化 */
.color-shift {
  animation: hue-shift 3s linear infinite;
}

@keyframes hue-shift {
  from {
    filter: hue-rotate(0deg);
  }
  to {
    filter: hue-rotate(360deg);
  }
}

/* 实战:主题变色 */
.theme-blue {
  filter: hue-rotate(0deg);
}

.theme-green {
  filter: hue-rotate(60deg);
}

.theme-purple {
  filter: hue-rotate(-60deg);
}
<html>
  <div class="hue-rotate-demo-mbb2ev">
    <div class="hue-item-mbb2ev hue-0-mbb2ev">
      <div class="content-mbb2ev">0deg</div>
    </div>
    <div class="hue-item-mbb2ev hue-90-mbb2ev">
      <div class="content-mbb2ev">90deg</div>
    </div>
    <div class="hue-item-mbb2ev hue-180-mbb2ev">
      <div class="content-mbb2ev">180deg</div>
    </div>
    <div class="hue-item-mbb2ev hue-270-mbb2ev">
      <div class="content-mbb2ev">270deg</div>
    </div>
  </div>
</html>
<style>
.hue-rotate-demo-mbb2ev {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.hue-item-mbb2ev {
  height: 120px;
  background: linear-gradient(135deg, #ff6b6b 0%, #4ecdc4 50%, #ffd93d 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-mbb2ev {
  color: white;
  font-weight: 600;
  font-size: 18px;
  text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
}
.hue-0-mbb2ev { filter: hue-rotate(0deg); }
.hue-90-mbb2ev { filter: hue-rotate(90deg); }
.hue-180-mbb2ev { filter: hue-rotate(180deg); }
.hue-270-mbb2ev { filter: hue-rotate(270deg); }
</style>

# 1.9 invert(反转)

反转图像颜色。

/* 语法:invert(amount) */
/* 0 = 原始,1 = 完全反转 */

/* 原始 */
.normal {
  filter: invert(0);
}

/* 部分反转 */
.semi-invert {
  filter: invert(0.5);
}

/* 完全反转 */
.full-invert {
  filter: invert(1);
}

/* 实战:暗黑模式图标 */
.dark-mode .icon {
  filter: invert(1);
}

/* 实战:负片效果 */
.negative {
  filter: invert(1) hue-rotate(180deg);
}
<html>
  <div class="invert-demo-kx8m4p">
    <div class="invert-item-kx8m4p invert-0-kx8m4p">
      <div class="content-kx8m4p">invert(0)</div>
    </div>
    <div class="invert-item-kx8m4p invert-03-kx8m4p">
      <div class="content-kx8m4p">invert(0.3)</div>
    </div>
    <div class="invert-item-kx8m4p invert-07-kx8m4p">
      <div class="content-kx8m4p">invert(0.7)</div>
    </div>
    <div class="invert-item-kx8m4p invert-1-kx8m4p">
      <div class="content-kx8m4p">invert(1)</div>
    </div>
  </div>
</html>
<style>
.invert-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.invert-item-kx8m4p {
  height: 120px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.invert-0-kx8m4p { filter: invert(0); }
.invert-03-kx8m4p { filter: invert(0.3); }
.invert-07-kx8m4p { filter: invert(0.7); }
.invert-1-kx8m4p { filter: invert(1); }
</style>

# 1.10 opacity(透明度)

调整图像透明度(与 opacity 属性类似,但在滤镜中可组合)。

/* 语法:opacity(amount) */
/* 0 = 完全透明,1 = 完全不透明 */

/* 半透明 */
.semi-transparent {
  filter: opacity(0.5);
}

/* 实战:组合滤镜 */
.faded-image {
  filter: opacity(0.8) grayscale(0.3) blur(1px);
}

/* vs 普通opacity属性 */
.element {
  opacity: 0.5; /* 包括子元素都会半透明 */
}

.element {
  filter: opacity(0.5); /* 仅元素本身,可与其他滤镜组合 */
}
<html>
  <div class="opacity-demo-kx8m4p">
    <div class="opacity-item-kx8m4p opacity-1-kx8m4p">
      <div class="content-kx8m4p">opacity(1)</div>
    </div>
    <div class="opacity-item-kx8m4p opacity-07-kx8m4p">
      <div class="content-kx8m4p">opacity(0.7)</div>
    </div>
    <div class="opacity-item-kx8m4p opacity-04-kx8m4p">
      <div class="content-kx8m4p">opacity(0.4)</div>
    </div>
    <div class="opacity-item-kx8m4p opacity-01-kx8m4p">
      <div class="content-kx8m4p">opacity(0.1)</div>
    </div>
  </div>
</html>
<style>
.opacity-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
  background: linear-gradient(135deg, #e0e0e0 25%, transparent 25%, transparent 75%, #e0e0e0 75%, #e0e0e0), linear-gradient(135deg, #e0e0e0 25%, white 25%, white 75%, #e0e0e0 75%, #e0e0e0);
  background-size: 20px 20px;
  background-position: 0 0, 10px 10px;
  padding: 15px;
  border-radius: 8px;
}
.opacity-item-kx8m4p {
  height: 120px;
  background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.content-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.opacity-1-kx8m4p { filter: opacity(1); }
.opacity-07-kx8m4p { filter: opacity(0.7); }
.opacity-04-kx8m4p { filter: opacity(0.4); }
.opacity-01-kx8m4p { filter: opacity(0.1); }
</style>

# 1.11 drop-shadow(投影)

为元素添加投影,类似 box-shadow 但遵循元素形状(包括透明区域)。

/* 语法:drop-shadow(offset-x offset-y blur-radius color) */

/* 基础投影 */
.shadow {
  filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.3));
}

/* 多重投影 */
.multi-shadow {
  filter: 
    drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.3))
    drop-shadow(-2px -2px 4px rgba(255, 255, 255, 0.5));
}

/* drop-shadow vs box-shadow */
.box-shadow-demo {
  box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
  /* 投影是矩形,不考虑透明区域 */
}

.drop-shadow-demo {
  filter: drop-shadow(5px 5px 10px rgba(0, 0, 0, 0.5));
  /* 投影跟随PNG图片的实际形状 */
}

/* 实战:图标投影 */
.icon {
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
}

/* 实战:发光效果 */
.glow {
  filter: 
    drop-shadow(0 0 10px currentColor)
    drop-shadow(0 0 20px currentColor);
}
<html>
  <div class="drop-shadow-demo-kx8m4p">
    <div class="drop-shadow-item-kx8m4p">
      <div class="star-kx8m4p no-shadow-kx8m4p">★</div>
      <div class="label-kx8m4p">无投影</div>
    </div>
    <div class="drop-shadow-item-kx8m4p">
      <div class="star-kx8m4p small-shadow-kx8m4p">★</div>
      <div class="label-kx8m4p">轻微投影</div>
    </div>
    <div class="drop-shadow-item-kx8m4p">
      <div class="star-kx8m4p medium-shadow-kx8m4p">★</div>
      <div class="label-kx8m4p">中度投影</div>
    </div>
    <div class="drop-shadow-item-kx8m4p">
      <div class="star-kx8m4p glow-shadow-kx8m4p">★</div>
      <div class="label-kx8m4p">发光效果</div>
    </div>
  </div>
</html>
<style>
.drop-shadow-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 20px;
  background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);
  padding: 30px 15px;
  border-radius: 8px;
}
.drop-shadow-item-kx8m4p {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}
.star-kx8m4p {
  font-size: 60px;
  color: #ffd93d;
}
.label-kx8m4p {
  color: white;
  font-size: 14px;
  font-weight: 500;
}
.no-shadow-kx8m4p { 
  filter: none;
}
.small-shadow-kx8m4p { 
  filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.5));
}
.medium-shadow-kx8m4p { 
  filter: drop-shadow(4px 4px 8px rgba(0, 0, 0, 0.7));
}
.glow-shadow-kx8m4p { 
  filter: drop-shadow(0 0 10px #ffd93d) drop-shadow(0 0 20px #ffd93d);
}
</style>

# 1.12 url(SVG滤镜)

引用SVG滤镜进行更复杂的效果。

<!-- SVG滤镜定义 -->
<svg style="display: none;">
  <defs>
    <filter id="turbulence">
      <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2" result="turbulence"/>
      <feDisplacementMap in2="turbulence" in="SourceGraphic" scale="20" xChannelSelector="R" yChannelSelector="G"/>
    </filter>
  </defs>
</svg>
/* 使用SVG滤镜 */
.distorted {
  filter: url(#turbulence);
}

/* 组合SVG滤镜和CSS滤镜 */
.combined {
  filter: url(#turbulence) blur(2px);
}
<html>
  <svg style="display: none;">
    <defs>
      <filter id="turbulence-demo-x3r7k5">
        <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2" result="turbulence"/>
        <feDisplacementMap in2="turbulence" in="SourceGraphic" scale="20" xChannelSelector="R" yChannelSelector="G"/>
      </filter>
      <filter id="goo-demo-x3r7k5">
        <feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur"/>
        <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 19 -9" result="goo"/>
        <feComposite in="SourceGraphic" in2="goo" operator="atop"/>
      </filter>
      <filter id="wave-demo-x3r7k5">
        <feTurbulence baseFrequency="0.01 0.03" numOctaves="2" seed="2"/>
        <feDisplacementMap in="SourceGraphic" scale="10"/>
      </filter>
    </defs>
  </svg>
  <div class="svg-filter-demo-x3r7k5">
    <div class="box-x3r7k5">
      <div class="label-x3r7k5">无滤镜</div>
      <div class="card-x3r7k5 no-filter-x3r7k5">SVG Filter</div>
    </div>
    <div class="box-x3r7k5">
      <div class="label-x3r7k5">湍流扭曲</div>
      <div class="card-x3r7k5 turbulence-x3r7k5">SVG Filter</div>
    </div>
    <div class="box-x3r7k5">
      <div class="label-x3r7k5">融合效果</div>
      <div class="card-x3r7k5 goo-x3r7k5">
        <span class="dot-x3r7k5"></span>
        <span class="dot-x3r7k5"></span>
        <span class="dot-x3r7k5"></span>
      </div>
    </div>
    <div class="box-x3r7k5">
      <div class="label-x3r7k5">波浪效果</div>
      <div class="card-x3r7k5 wave-x3r7k5">SVG Filter</div>
    </div>
  </div>
</html>
<style>
.svg-filter-demo-x3r7k5 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 20px;
  padding: 20px;
  background: #f5f5f5;
  border-radius: 8px;
}
.box-x3r7k5 {
  text-align: center;
}
.label-x3r7k5 {
  font-size: 12px;
  color: #667eea;
  margin-bottom: 10px;
  font-weight: 600;
}
.card-x3r7k5 {
  width: 150px;
  height: 100px;
  margin: 0 auto;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
  font-weight: bold;
  border-radius: 12px;
  position: relative;
}
.turbulence-x3r7k5 {
  filter: url(#turbulence-demo-x3r7k5);
}
.goo-x3r7k5 {
  filter: url(#goo-demo-x3r7k5);
  background: transparent;
  overflow: hidden;
}
.dot-x3r7k5 {
  width: 40px;
  height: 40px;
  background: #667eea;
  border-radius: 50%;
  position: absolute;
  animation: move-x3r7k5 3s infinite ease-in-out;
}
.dot-x3r7k5:nth-child(1) {
  left: 30px;
  animation-delay: 0s;
}
.dot-x3r7k5:nth-child(2) {
  left: 55px;
  animation-delay: 0.3s;
}
.dot-x3r7k5:nth-child(3) {
  left: 80px;
  animation-delay: 0.6s;
}
@keyframes move-x3r7k5 {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-20px); }
}
.wave-x3r7k5 {
  filter: url(#wave-demo-x3r7k5);
}
</style>

# 1.13 backdrop-filter(背景滤镜)

对元素背景区域应用滤镜(毛玻璃效果)。

/* 毛玻璃效果 */
.glass {
  backdrop-filter: blur(10px);
  background: rgba(255, 255, 255, 0.2);
  border: 1px solid rgba(255, 255, 255, 0.3);
}

/* iOS风格毛玻璃 */
.ios-glass {
  backdrop-filter: blur(20px) saturate(180%);
  background: rgba(255, 255, 255, 0.7);
}

/* 实战:模态框背景 */
.modal-backdrop {
  backdrop-filter: blur(5px) brightness(0.7);
  background: rgba(0, 0, 0, 0.3);
}

/* 实战:导航栏 */
.navbar {
  backdrop-filter: blur(10px);
  background: rgba(255, 255, 255, 0.8);
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
<html>
  <div class="backdrop-filter-demo-kx8m4p">
    <div class="backdrop-scene-kx8m4p">
      <div class="backdrop-card-kx8m4p blur-5-kx8m4p">
        <div class="card-title-kx8m4p">blur(5px)</div>
        <div class="card-text-kx8m4p">轻微模糊</div>
      </div>
      <div class="backdrop-card-kx8m4p blur-10-kx8m4p">
        <div class="card-title-kx8m4p">blur(10px)</div>
        <div class="card-text-kx8m4p">中度模糊</div>
      </div>
      <div class="backdrop-card-kx8m4p blur-20-kx8m4p">
        <div class="card-title-kx8m4p">blur(20px)</div>
        <div class="card-text-kx8m4p">强烈模糊</div>
      </div>
      <div class="backdrop-card-kx8m4p combined-kx8m4p">
        <div class="card-title-kx8m4p">组合效果</div>
        <div class="card-text-kx8m4p">blur + saturate</div>
      </div>
    </div>
  </div>
</html>
<style>
.backdrop-filter-demo-kx8m4p {
  min-height: 350px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  border-radius: 8px;
  padding: 20px;
}
.backdrop-scene-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><circle cx="50" cy="50" r="40" fill="rgba(255,255,255,0.3)"/><circle cx="150" cy="50" r="30" fill="rgba(255,255,255,0.2)"/><circle cx="50" cy="150" r="35" fill="rgba(255,255,255,0.25)"/><circle cx="150" cy="150" r="45" fill="rgba(255,255,255,0.15)"/></svg>');
  background-size: 200px;
  padding: 20px;
  border-radius: 8px;
}
.backdrop-card-kx8m4p {
  padding: 20px;
  background: rgba(255, 255, 255, 0.15);
  border: 1px solid rgba(255, 255, 255, 0.3);
  border-radius: 8px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
}
.card-title-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.3);
}
.card-text-kx8m4p {
  color: rgba(255, 255, 255, 0.9);
  font-size: 14px;
}
.blur-5-kx8m4p {
  backdrop-filter: blur(5px);
}
.blur-10-kx8m4p {
  backdrop-filter: blur(10px);
}
.blur-20-kx8m4p {
  backdrop-filter: blur(20px);
}
.combined-kx8m4p {
  backdrop-filter: blur(15px) saturate(180%);
}
</style>

# 二、混合模式(Blend Mode)

# 2.1 mix-blend-mode(元素混合模式)

定义元素内容如何与其背景混合。

/* 语法 */
.element {
  mix-blend-mode: <blend-mode>;
}

/* 混合模式值 */
.normal      { mix-blend-mode: normal; }      /* 正常(默认) */
.multiply    { mix-blend-mode: multiply; }    /* 正片叠底 */
.screen      { mix-blend-mode: screen; }      /* 滤色 */
.overlay     { mix-blend-mode: overlay; }     /* 叠加 */
.darken      { mix-blend-mode: darken; }      /* 变暗 */
.lighten     { mix-blend-mode: lighten; }     /* 变亮 */
.color-dodge { mix-blend-mode: color-dodge; } /* 颜色减淡 */
.color-burn  { mix-blend-mode: color-burn; }  /* 颜色加深 */
.hard-light  { mix-blend-mode: hard-light; }  /* 强光 */
.soft-light  { mix-blend-mode: soft-light; }  /* 柔光 */
.difference  { mix-blend-mode: difference; }  /* 差值 */
.exclusion   { mix-blend-mode: exclusion; }   /* 排除 */
.hue         { mix-blend-mode: hue; }         /* 色相 */
.saturation  { mix-blend-mode: saturation; }  /* 饱和度 */
.color       { mix-blend-mode: color; }       /* 颜色 */
.luminosity  { mix-blend-mode: luminosity; }  /* 明度 */

# multiply(正片叠底)

/* 让颜色变暗,白色变为透明 */
.multiply-text {
  mix-blend-mode: multiply;
  color: #333;
}

/* 实战:文字与图片融合 */
.text-overlay {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 3rem;
  font-weight: bold;
  color: white;
  mix-blend-mode: multiply;
}
<html>
  <div class="multiply-demo-t8w3k6">
    <div class="example-t8w3k6">
      <div class="bg-gradient-t8w3k6"></div>
      <div class="text-t8w3k6 multiply-t8w3k6">MULTIPLY</div>
    </div>
    <div class="example-t8w3k6">
      <div class="bg-image-t8w3k6"></div>
      <div class="shape-t8w3k6 multiply-t8w3k6"></div>
    </div>
  </div>
</html>
<style>
.multiply-demo-t8w3k6 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.example-t8w3k6 {
  height: 150px;
  position: relative;
  border-radius: 8px;
  overflow: hidden;
  border: 2px solid #e0e0e0;
}
.bg-gradient-t8w3k6 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.bg-image-t8w3k6 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(45deg, #f093fb 0%, #f5576c 100%);
}
.text-t8w3k6 {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 32px;
  font-weight: bold;
  color: white;
}
.shape-t8w3k6 {
  position: absolute;
  width: 80px;
  height: 80px;
  background: yellow;
  top: 35px;
  left: 50%;
  transform: translateX(-50%);
  border-radius: 50%;
}
.multiply-t8w3k6 {
  mix-blend-mode: multiply;
}
</style>
<html>
  <div class="blend-mode-demo-mbb2ev">
    <div class="blend-item-mbb2ev">
      <div class="bg-mbb2ev"></div>
      <div class="overlay-mbb2ev normal-mbb2ev">normal</div>
    </div>
    <div class="blend-item-mbb2ev">
      <div class="bg-mbb2ev"></div>
      <div class="overlay-mbb2ev multiply-mbb2ev">multiply</div>
    </div>
    <div class="blend-item-mbb2ev">
      <div class="bg-mbb2ev"></div>
      <div class="overlay-mbb2ev screen-mbb2ev">screen</div>
    </div>
    <div class="blend-item-mbb2ev">
      <div class="bg-mbb2ev"></div>
      <div class="overlay-mbb2ev overlay-mode-mbb2ev">overlay</div>
    </div>
    <div class="blend-item-mbb2ev">
      <div class="bg-mbb2ev"></div>
      <div class="overlay-mbb2ev difference-mbb2ev">difference</div>
    </div>
    <div class="blend-item-mbb2ev">
      <div class="bg-mbb2ev"></div>
      <div class="overlay-mbb2ev color-mbb2ev">color</div>
    </div>
  </div>
</html>
<style>
.blend-mode-demo-mbb2ev {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 15px;
}
.blend-item-mbb2ev {
  position: relative;
  height: 120px;
  border-radius: 8px;
  overflow: hidden;
}
.bg-mbb2ev {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.overlay-mbb2ev {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(45deg, #ff6b6b 0%, #ffd93d 100%);
  color: white;
  font-weight: 600;
  font-size: 16px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.3);
}
.normal-mbb2ev { mix-blend-mode: normal; }
.multiply-mbb2ev { mix-blend-mode: multiply; }
.screen-mbb2ev { mix-blend-mode: screen; }
.overlay-mode-mbb2ev { mix-blend-mode: overlay; }
.difference-mbb2ev { mix-blend-mode: difference; }
.color-mbb2ev { mix-blend-mode: color; }
</style>
<html>
  <div class="blend-mode-extra-kx8m4p">
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p darken-kx8m4p">darken</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p lighten-kx8m4p">lighten</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p color-dodge-kx8m4p">color-dodge</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p color-burn-kx8m4p">color-burn</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p hard-light-kx8m4p">hard-light</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p soft-light-kx8m4p">soft-light</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p exclusion-kx8m4p">exclusion</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p hue-kx8m4p">hue</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p saturation-kx8m4p">saturation</div>
    </div>
    <div class="blend-item-kx8m4p">
      <div class="bg-kx8m4p"></div>
      <div class="overlay-kx8m4p luminosity-kx8m4p">luminosity</div>
    </div>
  </div>
</html>
<style>
.blend-mode-extra-kx8m4p {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 15px;
}
.blend-item-kx8m4p {
  position: relative;
  height: 120px;
  border-radius: 8px;
  overflow: hidden;
}
.bg-kx8m4p {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.overlay-kx8m4p {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(45deg, #ff6b6b 0%, #ffd93d 100%);
  color: white;
  font-weight: 600;
  font-size: 14px;
  text-shadow: 1px 1px 2px rgba(0,0,0,0.3);
}
.darken-kx8m4p { mix-blend-mode: darken; }
.lighten-kx8m4p { mix-blend-mode: lighten; }
.color-dodge-kx8m4p { mix-blend-mode: color-dodge; }
.color-burn-kx8m4p { mix-blend-mode: color-burn; }
.hard-light-kx8m4p { mix-blend-mode: hard-light; }
.soft-light-kx8m4p { mix-blend-mode: soft-light; }
.exclusion-kx8m4p { mix-blend-mode: exclusion; }
.hue-kx8m4p { mix-blend-mode: hue; }
.saturation-kx8m4p { mix-blend-mode: saturation; }
.luminosity-kx8m4p { mix-blend-mode: luminosity; }
</style>

# screen(滤色)

/* 让颜色变亮,黑色变为透明 */
.screen-effect {
  mix-blend-mode: screen;
}

/* 实战:光效叠加 */
.light-overlay {
  position: absolute;
  width: 100%;
  height: 100%;
  background: radial-gradient(circle, rgba(255,255,255,0.5) 0%, transparent 70%);
  mix-blend-mode: screen;
  pointer-events: none;
}
<html>
  <div class="screen-demo-r5h8n3">
    <div class="example-r5h8n3">
      <div class="dark-bg-r5h8n3"></div>
      <div class="light-circle-r5h8n3 screen-r5h8n3"></div>
    </div>
    <div class="example-r5h8n3">
      <div class="image-bg-r5h8n3"></div>
      <div class="glow-r5h8n3 screen-r5h8n3"></div>
    </div>
  </div>
</html>
<style>
.screen-demo-r5h8n3 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.example-r5h8n3 {
  height: 150px;
  position: relative;
  border-radius: 8px;
  overflow: hidden;
  border: 2px solid #e0e0e0;
}
.dark-bg-r5h8n3 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);
}
.light-circle-r5h8n3 {
  position: absolute;
  width: 100px;
  height: 100px;
  background: radial-gradient(circle, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.3) 70%, transparent 100%);
  top: 25px;
  left: 50%;
  transform: translateX(-50%);
  border-radius: 50%;
}
.image-bg-r5h8n3 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.glow-r5h8n3 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: radial-gradient(circle at 30% 40%, rgba(255,255,255,0.6) 0%, transparent 50%);
}
.screen-r5h8n3 {
  mix-blend-mode: screen;
}
</style>

# overlay(叠加)

/* 结合multiply和screen,增强对比度 */
.overlay-effect {
  mix-blend-mode: overlay;
}

/* 实战:图片滤镜 */
.photo-filter {
  position: relative;
}

.photo-filter::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
  mix-blend-mode: overlay;
  opacity: 0.6;
}
<html>
  <div class="overlay-demo-m9k2p7">
    <div class="example-m9k2p7">
      <div class="bg-m9k2p7"></div>
      <div class="filter-m9k2p7 overlay-m9k2p7"></div>
      <div class="label-m9k2p7">图片滤镜效果</div>
    </div>
    <div class="example-m9k2p7">
      <div class="texture-bg-m9k2p7"></div>
      <div class="color-layer-m9k2p7 overlay-m9k2p7"></div>
      <div class="label-m9k2p7">颜色叠加</div>
    </div>
  </div>
</html>
<style>
.overlay-demo-m9k2p7 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.example-m9k2p7 {
  height: 150px;
  position: relative;
  border-radius: 8px;
  overflow: hidden;
  border: 2px solid #e0e0e0;
}
.bg-m9k2p7 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(45deg, #f093fb 0%, #f5576c 50%, #4facfe 100%);
}
.filter-m9k2p7 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #ff6b6b, #4ecdc4);
}
.texture-bg-m9k2p7 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: repeating-linear-gradient(45deg, #667eea 0px, #667eea 10px, #764ba2 10px, #764ba2 20px);
}
.color-layer-m9k2p7 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: radial-gradient(circle, #ffd93d 0%, #f5576c 100%);
}
.overlay-m9k2p7 {
  mix-blend-mode: overlay;
}
.label-m9k2p7 {
  position: absolute;
  bottom: 10px;
  left: 10px;
  background: rgba(255,255,255,0.9);
  padding: 4px 8px;
  border-radius: 4px;
  font-size: 12px;
  font-weight: 600;
  color: #333;
  z-index: 1;
}
</style>

# difference(差值)

/* 创建反差效果 */
.difference-effect {
  mix-blend-mode: difference;
  color: white;
}

/* 实战:动态文字效果 */
.dynamic-text {
  position: relative;
  font-size: 4rem;
  font-weight: bold;
  color: white;
  mix-blend-mode: difference;
}
<html>
  <div class="difference-demo-v3n7k2">
    <div class="example-v3n7k2">
      <div class="colorful-bg-v3n7k2"></div>
      <div class="text-v3n7k2 difference-v3n7k2">DIFF</div>
    </div>
    <div class="example-v3n7k2 interactive-v3n7k2">
      <div class="gradient-bg-v3n7k2"></div>
      <div class="moving-shape-v3n7k2 difference-v3n7k2"></div>
    </div>
  </div>
</html>
<style>
.difference-demo-v3n7k2 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.example-v3n7k2 {
  height: 150px;
  position: relative;
  border-radius: 8px;
  overflow: hidden;
  border: 2px solid #e0e0e0;
}
.colorful-bg-v3n7k2 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(45deg, #ff6b6b 0%, #4ecdc4 50%, #ffd93d 100%);
}
.text-v3n7k2 {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 48px;
  font-weight: bold;
  color: white;
}
.gradient-bg-v3n7k2 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.moving-shape-v3n7k2 {
  position: absolute;
  width: 60px;
  height: 60px;
  background: white;
  top: 45px;
  left: 50%;
  transform: translateX(-50%);
  border-radius: 50%;
  animation: move-shape-v3n7k2 3s infinite ease-in-out;
}
@keyframes move-shape-v3n7k2 {
  0%, 100% { left: 30%; }
  50% { left: 70%; }
}
.difference-v3n7k2 {
  mix-blend-mode: difference;
}
</style>

# color(颜色)

/* 保留底层的明度,应用上层的色相和饱和度 */
.color-blend {
  mix-blend-mode: color;
}

/* 实战:图片着色 */
.colorize {
  position: relative;
}

.colorize::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #ff6b6b;
  mix-blend-mode: color;
}
<html>
  <div class="color-demo-j8p4m1">
    <div class="example-j8p4m1">
      <div class="grayscale-bg-j8p4m1"></div>
      <div class="red-tint-j8p4m1 color-j8p4m1"></div>
      <div class="label-j8p4m1">红色着色</div>
    </div>
    <div class="example-j8p4m1">
      <div class="grayscale-bg-j8p4m1"></div>
      <div class="blue-tint-j8p4m1 color-j8p4m1"></div>
      <div class="label-j8p4m1">蓝色着色</div>
    </div>
  </div>
</html>
<style>
.color-demo-j8p4m1 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.example-j8p4m1 {
  height: 150px;
  position: relative;
  border-radius: 8px;
  overflow: hidden;
  border: 2px solid #e0e0e0;
}
.grayscale-bg-j8p4m1 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #1a1a1a 0%, #4a4a4a 50%, #8a8a8a 100%);
}
.red-tint-j8p4m1 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: #ff6b6b;
}
.blue-tint-j8p4m1 {
  position: absolute;
  width: 100%;
  height: 100%;
  background: #4ecdc4;
}
.color-j8p4m1 {
  mix-blend-mode: color;
}
.label-j8p4m1 {
  position: absolute;
  bottom: 10px;
  left: 10px;
  background: rgba(255,255,255,0.9);
  padding: 4px 8px;
  border-radius: 4px;
  font-size: 12px;
  font-weight: 600;
  color: #333;
  z-index: 1;
}
</style>

# 2.2 background-blend-mode(背景混合模式)

定义元素的背景图片与背景颜色如何混合。

/* 基础语法 */
.element {
  background-image: url('image.jpg');
  background-color: #ff6b6b;
  background-blend-mode: multiply;
}

/* 多重背景混合 */
.multi-bg {
  background-image: 
    url('overlay.png'),
    url('background.jpg');
  background-blend-mode: screen, normal;
  /* 第一张图片用screen,第二张用normal */
}

/* 实战:双色调效果 */
.duotone {
  background-image: 
    linear-gradient(#ff6b6b, #4ecdc4),
    url('photo.jpg');
  background-blend-mode: multiply;
  background-size: cover;
}

/* 实战:纹理叠加 */
.texture-overlay {
  background-image: 
    url('texture.png'),
    linear-gradient(to bottom, #667eea, #764ba2);
  background-blend-mode: overlay;
}

/* 实战:彩色渐变遮罩 */
.gradient-mask {
  background-image: 
    linear-gradient(45deg, rgba(255,107,107,0.8), rgba(78,205,196,0.8)),
    url('image.jpg');
  background-blend-mode: color;
  background-size: cover;
  background-position: center;
}
<html>
  <div class="bg-blend-demo-kx8m4p">
    <div class="bg-blend-item-kx8m4p multiply-bg-kx8m4p">
      <div class="label-kx8m4p">multiply</div>
    </div>
    <div class="bg-blend-item-kx8m4p screen-bg-kx8m4p">
      <div class="label-kx8m4p">screen</div>
    </div>
    <div class="bg-blend-item-kx8m4p overlay-bg-kx8m4p">
      <div class="label-kx8m4p">overlay</div>
    </div>
    <div class="bg-blend-item-kx8m4p color-bg-kx8m4p">
      <div class="label-kx8m4p">color</div>
    </div>
  </div>
</html>
<style>
.bg-blend-demo-kx8m4p {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
}
.bg-blend-item-kx8m4p {
  height: 150px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  background-size: cover;
  background-position: center;
  position: relative;
}
.label-kx8m4p {
  color: white;
  font-weight: 600;
  font-size: 18px;
  text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
  background: rgba(0, 0, 0, 0.3);
  padding: 8px 16px;
  border-radius: 4px;
}
.multiply-bg-kx8m4p {
  background-image: 
    linear-gradient(135deg, rgba(255,107,107,0.8), rgba(78,205,196,0.8)),
    linear-gradient(45deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  background-blend-mode: multiply;
}
.screen-bg-kx8m4p {
  background-image: 
    linear-gradient(135deg, rgba(255,107,107,0.6), rgba(78,205,196,0.6)),
    linear-gradient(45deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  background-blend-mode: screen;
}
.overlay-bg-kx8m4p {
  background-image: 
    linear-gradient(135deg, rgba(255,107,107,0.7), rgba(78,205,196,0.7)),
    linear-gradient(45deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  background-blend-mode: overlay;
}
.color-bg-kx8m4p {
  background-image: 
    linear-gradient(135deg, #ff6b6b, #4ecdc4),
    linear-gradient(45deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
  background-blend-mode: color;
}
</style>

# 2.3 isolation(隔离)

创建新的堆叠上下文,阻止混合模式影响外部元素。

/* 默认:不隔离 */
.no-isolation {
  isolation: auto;
}

/* 隔离混合 */
.isolated {
  isolation: isolate;
}

/* 实战:控制混合范围 */
.blend-container {
  isolation: isolate; /* 内部的混合模式不影响外部 */
}

.blend-container .blend-element {
  mix-blend-mode: multiply;
  /* 仅与容器内的元素混合 */
}
<html>
  <div class="isolation-demo-y5p9n7">
    <!-- 外层有彩色背景 -->
    <div class="outer-bg-y5p9n7">
      <div class="container-y5p9n7">
        <h4>无隔离(isolation: auto)</h4>
        <div class="box-y5p9n7 no-isolate-y5p9n7">
          <div class="shape-y5p9n7"></div>
          <div class="label-y5p9n7">图形穿透容器与外层渐变背景混合</div>
        </div>
      </div>
      <div class="container-y5p9n7">
        <h4>有隔离(isolation: isolate)</h4>
        <div class="box-y5p9n7 isolate-y5p9n7">
          <div class="shape-y5p9n7"></div>
          <div class="label-y5p9n7">图形仅与容器内部背景混合</div>
        </div>
      </div>
    </div>
  </div>
</html>
<style>
.isolation-demo-y5p9n7 {
  padding: 20px;
  background: #f5f5f5;
  border-radius: 8px;
}
.outer-bg-y5p9n7 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 20px;
  padding: 30px;
  background: linear-gradient(135deg, #ff6b6b 0%, #4ecdc4 100%); /* 更鲜艳的渐变背景 */
  border-radius: 8px;
}
.container-y5p9n7 h4 {
  margin: 0 0 10px 0;
  font-size: 14px;
  color: white;
  font-weight: 600;
  text-align: center;
}
.box-y5p9n7 {
  height: 180px;
  background: rgba(255, 255, 255, 0.1); /* 半透明白色背景,让底层渐变可见 */
  border-radius: 8px;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  border: 2px solid rgba(255, 255, 255, 0.3); /* 半透明白色边框 */
}
.no-isolate-y5p9n7 {
  isolation: auto;
}
.isolate-y5p9n7 {
  isolation: isolate; /* 隔离:创建新的堆叠上下文 */
  background: rgba(255, 255, 255, 0.9); /* 有隔离时使用更不透明的背景 */
}
.shape-y5p9n7 {
  width: 120px;
  height: 120px;
  background: #ffff00; /* 亮黄色,混合效果更明显 */
  border-radius: 50%;
  mix-blend-mode: difference; /* 使用difference混合模式,效果更强烈 */
  /* difference模式下:
     - 亮黄色与彩色渐变混合 = 对比色
     - 亮黄色与白色混合 = 深灰色 */
}
.shape-y5p9n7::after {
  content: '';
  position: absolute;
  inset: -10px;
  background: inherit;
  filter: blur(20px);
  opacity: 0.5;
  z-index: -1;
}

.label-y5p9n7 {
  position: absolute;
  bottom: 15px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 12px;
  color: white;
  background: rgba(0, 0, 0, 0.7);
  padding: 8px 12px;
  border-radius: 6px;
  white-space: nowrap;
  font-weight: 500;
}
</style>

# 三、实战案例

# 3.1 毛玻璃卡片

<html>
  <div class="glass-background">
    <div class="glass-card">
      <h2>毛玻璃效果</h2>
      <p>使用 backdrop-filter 实现的现代化卡片设计</p>
      <button class="glass-button">了解更多</button>
    </div>
  </div>
</html>
<style>
  .glass-background {
    min-height: 300px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: 
      linear-gradient(135deg, #667eea 0%, #764ba2 100%),
      url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="25" cy="25" r="20" fill="rgba(255,255,255,0.1)"/><circle cx="75" cy="75" r="30" fill="rgba(255,255,255,0.05)"/></svg>');
    background-size: cover, 200px;
    border-radius: 12px;
    padding: 20px;
  }
  
  .glass-card {
    backdrop-filter: blur(10px) saturate(180%);
    background: rgba(255, 255, 255, 0.2);
    border: 1px solid rgba(255, 255, 255, 0.3);
    border-radius: 16px;
    padding: 30px;
    max-width: 400px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
  }
  
  .glass-card h2 {
    margin: 0 0 10px 0;
    color: white;
    font-size: 1.5rem;
  }
  
  .glass-card p {
    margin: 0 0 20px 0;
    color: rgba(255, 255, 255, 0.9);
    line-height: 1.6;
  }
  
  .glass-button {
    backdrop-filter: blur(5px);
    background: rgba(255, 255, 255, 0.3);
    border: 1px solid rgba(255, 255, 255, 0.5);
    color: white;
    padding: 10px 20px;
    border-radius: 8px;
    cursor: pointer;
    font-weight: 600;
    transition: all 0.3s ease;
  }
  
  .glass-button:hover {
    background: rgba(255, 255, 255, 0.4);
    transform: translateY(-2px);
  }
</style>

# 3.2 图片滤镜效果

<html>
  <div class="filter-gallery">
    <div class="filter-item">
      <div class="filter-box filter-original"></div>
      <span>原图</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-grayscale"></div>
      <span>灰度</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-sepia"></div>
      <span>复古</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-blur"></div>
      <span>模糊</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-bright"></div>
      <span>明亮</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-saturate"></div>
      <span>饱和</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-hue"></div>
      <span>色相</span>
    </div>
    <div class="filter-item">
      <div class="filter-box filter-invert"></div>
      <span>反转</span>
    </div>
  </div>
</html>
<style>
  .filter-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
    gap: 15px;
    padding: 10px;
  }
  
  .filter-item {
    text-align: center;
  }
  
  .filter-box {
    width: 100%;
    height: 100px;
    background: 
      linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
    border-radius: 8px;
    margin-bottom: 8px;
    transition: transform 0.3s ease;
  }
  
  .filter-box:hover {
    transform: scale(1.05);
  }
  
  .filter-item span {
    display: block;
    font-size: 0.85rem;
    color: #666;
  }
  
  .filter-original {
    filter: none;
  }
  
  .filter-grayscale {
    filter: grayscale(1);
  }
  
  .filter-sepia {
    filter: sepia(1);
  }
  
  .filter-blur {
    filter: blur(3px);
  }
  
  .filter-bright {
    filter: brightness(1.5);
  }
  
  .filter-saturate {
    filter: saturate(2);
  }
  
  .filter-hue {
    filter: hue-rotate(90deg);
  }
  
  .filter-invert {
    filter: invert(1);
  }
</style>

# 3.3 混合模式文字效果

<html>
  <div class="blend-demo">
    <div class="blend-text-container">
      <h1 class="blend-text">BLEND MODE</h1>
    </div>
  </div>
</html>
<style>
  .blend-demo {
    min-height: 250px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: 
      linear-gradient(45deg, #ff6b6b 0%, #ffd93d 25%, #6bcf7f 50%, #4d96ff 75%, #a78bfa 100%);
    border-radius: 12px;
  }
  
  .blend-text-container {
    position: relative;
    padding: 20px;
  }
  
  .blend-text {
    font-size: 4rem;
    font-weight: 900;
    margin: 0;
    color: white;
    mix-blend-mode: multiply;
    text-align: center;
    letter-spacing: 0.05em;
    animation: blend-shift 5s ease-in-out infinite;
  }
  
  @keyframes blend-shift {
    0%, 100% {
      mix-blend-mode: multiply;
    }
    25% {
      mix-blend-mode: screen;
    }
    50% {
      mix-blend-mode: overlay;
    }
    75% {
      mix-blend-mode: difference;
    }
  }
  
  @media (max-width: 600px) {
    .blend-text {
      font-size: 2.5rem;
    }
  }
</style>

# 3.4 双色调图片效果

<html>
  <div class="duotone-gallery">
    <div class="duotone-item duotone-red">
      <div class="duotone-label">红色调</div>
    </div>
    <div class="duotone-item duotone-blue">
      <div class="duotone-label">蓝色调</div>
    </div>
    <div class="duotone-item duotone-green">
      <div class="duotone-label">绿色调</div>
    </div>
  </div>
</html>
<style>
  .duotone-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 15px;
  }
  
  .duotone-item {
    position: relative;
    height: 200px;
    border-radius: 12px;
    overflow: hidden;
    cursor: pointer;
    transition: transform 0.3s ease;
  }
  
  .duotone-item:hover {
    transform: scale(1.05);
  }
  
  .duotone-item::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: 
      radial-gradient(circle at 30% 40%, rgba(255,255,255,0.8) 0%, transparent 50%),
      linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  }
  
  .duotone-label {
    position: absolute;
    bottom: 15px;
    left: 15px;
    color: white;
    font-weight: 600;
    font-size: 1rem;
    z-index: 1;
    text-shadow: 0 2px 4px rgba(0,0,0,0.3);
  }
  
  .duotone-red::before {
    background: 
      radial-gradient(circle at 30% 40%, rgba(255,255,255,0.8) 0%, transparent 50%),
      linear-gradient(135deg, #ff6b6b 0%, #ee5a6f 100%);
  }
  
  .duotone-red::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: linear-gradient(to bottom, #ff0000, #cc0000);
    mix-blend-mode: multiply;
  }
  
  .duotone-blue::before {
    background: 
      radial-gradient(circle at 30% 40%, rgba(255,255,255,0.8) 0%, transparent 50%),
      linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
  }
  
  .duotone-blue::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: linear-gradient(to bottom, #0066ff, #0044cc);
    mix-blend-mode: multiply;
  }
  
  .duotone-green::before {
    background: 
      radial-gradient(circle at 30% 40%, rgba(255,255,255,0.8) 0%, transparent 50%),
      linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
  }
  
  .duotone-green::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: linear-gradient(to bottom, #00cc66, #009944);
    mix-blend-mode: multiply;
  }
</style>

# 3.5 动态滤镜切换

<html>
  <div class="filter-switch-demo">
    <div class="filter-preview" id="filterPreview">
      <div class="filter-content"></div>
    </div>
    <div class="filter-controls">
      <button class="filter-btn" data-filter="none">原始</button>
      <button class="filter-btn" data-filter="vintage">复古</button>
      <button class="filter-btn" data-filter="cool">冷色</button>
      <button class="filter-btn" data-filter="warm">暖色</button>
      <button class="filter-btn" data-filter="dramatic">戏剧</button>
    </div>
  </div>
</html>
<style>
  .filter-switch-demo {
    text-align: center;
  }
  
  .filter-preview {
    width: 100%;
    height: 250px;
    border-radius: 12px;
    overflow: hidden;
    margin-bottom: 20px;
    position: relative;
  }
  
  .filter-content {
    width: 100%;
    height: 100%;
    background: 
      linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
    transition: filter 0.5s ease;
  }
  
  .filter-content[data-active="vintage"] {
    filter: sepia(0.8) contrast(1.2) brightness(0.9);
  }
  
  .filter-content[data-active="cool"] {
    filter: saturate(1.5) hue-rotate(180deg) brightness(1.1);
  }
  
  .filter-content[data-active="warm"] {
    filter: saturate(1.3) hue-rotate(-20deg) brightness(1.05);
  }
  
  .filter-content[data-active="dramatic"] {
    filter: contrast(1.5) saturate(0.5) brightness(0.8);
  }
  
  .filter-controls {
    display: flex;
    gap: 10px;
    justify-content: center;
    flex-wrap: wrap;
  }
  
  .filter-btn {
    padding: 10px 20px;
    border: 2px solid #667eea;
    background: white;
    color: #667eea;
    border-radius: 8px;
    cursor: pointer;
    font-weight: 600;
    transition: all 0.3s ease;
  }
  
  .filter-btn:hover {
    background: #667eea;
    color: white;
    transform: translateY(-2px);
  }
  
  .filter-btn.active {
    background: #667eea;
    color: white;
  }
</style>
<script>
  const filterPreview = document.getElementById('filterPreview');
  const filterContent = filterPreview.querySelector('.filter-content');
  const filterBtns = document.querySelectorAll('.filter-btn');
  
  filterBtns.forEach(btn => {
    btn.addEventListener('click', () => {
      const filterType = btn.dataset.filter;
      
      // 移除所有active类
      filterBtns.forEach(b => b.classList.remove('active'));
      
      // 添加active类到当前按钮
      btn.classList.add('active');
      
      // 应用滤镜
      if (filterType === 'none') {
        filterContent.removeAttribute('data-active');
      } else {
        filterContent.setAttribute('data-active', filterType);
      }
    });
  });
  
  // 默认选中第一个
  filterBtns[0].classList.add('active');
</script>

# 四、性能优化与最佳实践

# 4.1 性能考虑

/* ✅ 推荐:使用GPU加速的滤镜 */
.optimized {
  filter: blur(5px) brightness(1.2);
  /* blur、opacity等会触发GPU加速 */
}

/* ✅ 推荐:使用will-change提示浏览器 */
.animated-filter {
  will-change: filter;
  filter: blur(0);
  transition: filter 0.3s ease;
}

.animated-filter:hover {
  filter: blur(5px);
}

/* ❌ 避免:过度使用复杂滤镜 */
.too-many-filters {
  filter: 
    blur(5px) 
    brightness(1.2) 
    contrast(1.1) 
    saturate(1.5) 
    hue-rotate(30deg)
    drop-shadow(0 0 10px red)
    drop-shadow(0 0 20px blue);
  /* 过多滤镜会影响性能 */
}

/* ✅ 推荐:适度组合 */
.reasonable-filters {
  filter: blur(3px) brightness(1.1);
}

/* ❌ 避免:在大面积元素上使用backdrop-filter */
.bad-backdrop {
  backdrop-filter: blur(20px);
  width: 100vw;
  height: 100vh;
  /* 在整个视口使用会非常耗性能 */
}

/* ✅ 推荐:限制使用范围 */
.good-backdrop {
  backdrop-filter: blur(10px);
  width: 400px;
  height: 300px;
}

# 4.2 浏览器兼容性处理

/* 提供降级方案 */
.glass-card {
  background: rgba(255, 255, 255, 0.8); /* 不支持时的备用 */
  backdrop-filter: blur(10px);
}

/* 使用@supports检测 */
@supports (backdrop-filter: blur(10px)) {
  .glass-card {
    background: rgba(255, 255, 255, 0.2);
    backdrop-filter: blur(10px);
  }
}

@supports not (backdrop-filter: blur(10px)) {
  .glass-card {
    background: rgba(255, 255, 255, 0.9);
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
  }
}

/* 检测混合模式支持 */
@supports (mix-blend-mode: multiply) {
  .blend-text {
    mix-blend-mode: multiply;
  }
}

# 4.3 可访问性

/* 尊重用户的减少动画偏好 */
@media (prefers-reduced-motion: reduce) {
  .animated-filter {
    transition: none;
  }
  
  .color-shift {
    animation: none;
  }
}

/* 确保文本可读性 */
.text-with-filter {
  filter: brightness(1.2);
}

/* 如果滤镜影响可读性,提供备用方案 */
@media (prefers-contrast: high) {
  .text-with-filter {
    filter: none;
    color: #000;
    background: #fff;
  }
}

/* 避免过度使用可能导致眩晕的效果 */
.safe-animation {
  /* 避免快速闪烁、旋转的滤镜效果 */
  animation: subtle-shift 3s ease-in-out infinite;
}

@keyframes subtle-shift {
  0%, 100% { filter: hue-rotate(0deg); }
  50% { filter: hue-rotate(10deg); }
}

# 4.4 实用技巧

/* 1. 组合滤镜创建效果 */
.instagram-filter {
  filter: contrast(1.1) brightness(1.1) saturate(1.3);
}

/* 2. 使用CSS变量动态控制 */
:root {
  --blur-amount: 0px;
  --brightness: 1;
}

.dynamic-filter {
  filter: blur(var(--blur-amount)) brightness(var(--brightness));
  transition: filter 0.3s ease;
}

/* JavaScript: element.style.setProperty('--blur-amount', '5px') */

/* 3. 创建可重用的滤镜类 */
.filter-vintage {
  filter: sepia(0.5) contrast(1.2) brightness(0.9);
}

.filter-cool {
  filter: saturate(1.3) hue-rotate(20deg) brightness(1.05);
}

.filter-warm {
  filter: saturate(1.2) hue-rotate(-20deg) brightness(1.1);
}

/* 4. 响应式滤镜 */
@media (max-width: 768px) {
  .mobile-optimized {
    filter: none; /* 移动端禁用滤镜以提升性能 */
  }
}

@media (min-width: 769px) {
  .mobile-optimized {
    filter: blur(5px) brightness(1.2);
  }
}

/* 5. 打印样式 */
@media print {
  .no-print-filter {
    filter: none !important;
    /* 打印时移除滤镜,确保清晰度 */
  }
}

# 4.5 常见错误

❌ 错误做法:

/* 1. 过度模糊导致不可读 */
.bad-blur {
  filter: blur(20px);
  /* 文字完全不可读 */
}

/* 2. 滤镜影响性能 */
* {
  filter: brightness(1.1);
  /* 对所有元素应用滤镜 */
}

/* 3. 忘记transition */
.no-transition {
  filter: grayscale(0);
}

.no-transition:hover {
  filter: grayscale(1);
  /* 变化太突兀 */
}

/* 4. mix-blend-mode在白色背景失效 */
.white-bg-blend {
  background: white;
  color: white;
  mix-blend-mode: multiply;
  /* 白色multiply白色还是白色,看不见 */
}

✅ 正确做法:

/* 1. 适度模糊 */
.good-blur {
  filter: blur(3px);
  /* 保持可读性 */
}

/* 2. 限制滤镜范围 */
.image-container img {
  filter: brightness(1.1);
  /* 仅对图片应用 */
}

/* 3. 添加过渡效果 */
.smooth-transition {
  filter: grayscale(0);
  transition: filter 0.3s ease;
}

.smooth-transition:hover {
  filter: grayscale(1);
}

/* 4. 使用对比色 */
.good-blend {
  background: linear-gradient(45deg, #667eea, #764ba2);
  color: white;
  mix-blend-mode: multiply;
}

# 五、浏览器兼容性

# 5.1 filter属性

特性 Chrome Firefox Safari Edge
filter 基础 ✅ 53+ ✅ 35+ ✅ 9.1+ ✅ 79+
-webkit-filter ✅ 18-52 ❌ ✅ 6-9 ❌
backdrop-filter ✅ 76+ ✅ 103+ ✅ 9+ (-webkit-) ✅ 79+
drop-shadow() ✅ 53+ ✅ 35+ ✅ 9.1+ ✅ 79+

# 5.2 混合模式

特性 Chrome Firefox Safari Edge
mix-blend-mode ✅ 41+ ✅ 32+ ✅ 8+ ✅ 79+
background-blend-mode ✅ 35+ ✅ 30+ ✅ 8+ ✅ 79+
isolation ✅ 41+ ✅ 36+ ✅ 8+ ✅ 79+

# 5.3 前缀处理

/* backdrop-filter需要-webkit-前缀(Safari) */
.glass {
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* 旧版Chrome需要-webkit-前缀的filter */
.legacy-filter {
  -webkit-filter: blur(5px);
  filter: blur(5px);
}

# 六、总结

# 核心要点

  1. CSS滤镜:

    • 11种滤镜函数:blur、brightness、contrast、grayscale、sepia、saturate、hue-rotate、invert、opacity、drop-shadow、url
    • backdrop-filter 实现毛玻璃效果
    • 可组合使用多个滤镜
    • 支持动画和过渡
  2. 混合模式:

    • mix-blend-mode:元素与背景混合
    • background-blend-mode:背景图层混合
    • 16种混合模式,模拟Photoshop效果
    • isolation 控制混合范围
  3. 性能优化:

    • 适度使用滤镜,避免过度叠加
    • 大面积元素慎用 backdrop-filter
    • 使用 will-change 提示GPU加速
    • 移动端考虑禁用复杂滤镜
  4. 最佳实践:

    • 提供降级方案(@supports)
    • 尊重用户偏好(prefers-reduced-motion)
    • 确保可访问性(对比度、可读性)
    • 使用CSS变量实现动态控制
  5. 常见应用:

    • 毛玻璃效果(backdrop-filter)
    • 图片滤镜(Instagram风格)
    • 双色调效果(background-blend-mode)
    • 文字混合(mix-blend-mode)

掌握CSS滤镜和混合模式,能够让你的网页视觉效果更加丰富多彩,创造出专业级的设计效果。

祝你变得更强!

编辑 (opens new window)
#CSS
上次更新: 2025/11/21
CSS进阶-Transform与3D变换
现代CSS-CSS预处理器对比

← CSS进阶-Transform与3D变换 现代CSS-CSS预处理器对比→

最近更新
01
AI编程时代的一些心得
09-11
02
Claude Code与Codex的协同工作
09-01
03
Claude Code 最佳实践(个人版)
08-01
更多文章>
Theme by Vdoing | Copyright © 2018-2025 京ICP备2021021832号-2 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式