Skip to content

SVG 模糊效果

模糊效果是 SVG 滤镜中最常用的效果之一,使用 <feGaussianBlur> 元素实现。

基本语法

html
<svg width="200" height="100">
  <defs>
    <filter id="blur">
      <feGaussianBlur stdDeviation="5"/>
    </filter>
  </defs>
  
  <rect filter="url(#blur)" x="20" y="20" width="60" height="60" fill="#3b82f6"/>
</svg>

主要属性

属性描述
stdDeviation模糊程度(数值越大越模糊)
in输入源
result输出结果名称

不同模糊程度

html
<svg width="500" height="120">
  <defs>
    <filter id="blur0"><feGaussianBlur stdDeviation="0"/></filter>
    <filter id="blur2"><feGaussianBlur stdDeviation="2"/></filter>
    <filter id="blur5"><feGaussianBlur stdDeviation="5"/></filter>
    <filter id="blur10"><feGaussianBlur stdDeviation="10"/></filter>
  </defs>
  
  <g>
    <rect x="20" y="20" width="60" height="60" fill="#3b82f6" filter="url(#blur0)"/>
    <text x="50" y="100" text-anchor="middle" font-size="11">0</text>
  </g>
  
  <g>
    <rect x="120" y="20" width="60" height="60" fill="#3b82f6" filter="url(#blur2)"/>
    <text x="150" y="100" text-anchor="middle" font-size="11">2</text>
  </g>
  
  <g>
    <rect x="220" y="20" width="60" height="60" fill="#3b82f6" filter="url(#blur5)"/>
    <text x="250" y="100" text-anchor="middle" font-size="11">5</text>
  </g>
  
  <g>
    <rect x="320" y="20" width="60" height="60" fill="#3b82f6" filter="url(#blur10)"/>
    <text x="350" y="100" text-anchor="middle" font-size="11">10</text>
  </g>
</svg>

X/Y 方向独立模糊

可以分别设置 X 和 Y 方向的模糊程度:

html
<svg width="400" height="150">
  <defs>
    <!-- 水平模糊 -->
    <filter id="blurX" x="-20%" width="140%">
      <feGaussianBlur stdDeviation="10,0"/>
    </filter>
    <!-- 垂直模糊 -->
    <filter id="blurY" y="-20%" height="140%">
      <feGaussianBlur stdDeviation="0,10"/>
    </filter>
    <!-- 双向模糊 -->
    <filter id="blurXY" x="-20%" y="-20%" width="140%" height="140%">
      <feGaussianBlur stdDeviation="10,10"/>
    </filter>
  </defs>
  
  <rect x="30" y="30" width="80" height="80" fill="#3b82f6" filter="url(#blurX)"/>
  <text x="70" y="130" text-anchor="middle" font-size="11">水平模糊</text>
  
  <rect x="160" y="30" width="80" height="80" fill="#22c55e" filter="url(#blurY)"/>
  <text x="200" y="130" text-anchor="middle" font-size="11">垂直模糊</text>
  
  <rect x="290" y="30" width="80" height="80" fill="#ef4444" filter="url(#blurXY)"/>
  <text x="330" y="130" text-anchor="middle" font-size="11">双向模糊</text>
</svg>

模糊与原图结合

模糊背景

html
<svg width="250" height="150">
  <defs>
    <filter id="bgBlur">
      <feGaussianBlur stdDeviation="3"/>
    </filter>
  </defs>
  
  <!-- 模糊背景 -->
  <rect x="20" y="20" width="210" height="110" rx="10" fill="#3b82f6" filter="url(#bgBlur)"/>
  
  <!-- 清晰前景 -->
  <rect x="40" y="40" width="170" height="70" rx="8" fill="white" opacity="0.9"/>
  <text x="125" y="80" text-anchor="middle" font-size="16" fill="#1f2937">清晰内容</text>
</svg>

毛玻璃效果

html
<svg width="300" height="200">
  <defs>
    <filter id="frosted" x="0" y="0" width="100%" height="100%">
      <feGaussianBlur in="SourceGraphic" stdDeviation="8"/>
    </filter>
  </defs>
  
  <!-- 背景图案 -->
  <rect x="0" y="0" width="300" height="200" fill="#3b82f6"/>
  <circle cx="50" cy="50" r="40" fill="#22c55e"/>
  <circle cx="150" cy="150" r="50" fill="#f59e0b"/>
  <circle cx="250" cy="80" r="35" fill="#ef4444"/>
  
  <!-- 毛玻璃遮罩 -->
  <rect x="50" y="50" width="200" height="100" rx="10" 
        fill="white" fill-opacity="0.3" filter="url(#frosted)"/>
  <rect x="50" y="50" width="200" height="100" rx="10" 
        fill="white" fill-opacity="0.5"/>
  <text x="150" y="105" text-anchor="middle" font-size="18" fill="#1f2937">Frosted Glass</text>
</svg>

动态模糊效果

悬停模糊

html
<style>
  .blur-hover {
    transition: filter 0.3s ease;
  }
  .blur-hover:hover {
    filter: url(#hoverBlur);
  }
</style>

<svg width="200" height="100">
  <defs>
    <filter id="hoverBlur">
      <feGaussianBlur stdDeviation="3"/>
    </filter>
  </defs>
  
  <rect class="blur-hover" x="20" y="20" width="160" height="60" rx="8" fill="#3b82f6"/>
</svg>

模糊动画

html
<svg width="200" height="100">
  <defs>
    <filter id="animatedBlur">
      <feGaussianBlur stdDeviation="0">
        <animate attributeName="stdDeviation" values="0;5;0" dur="2s" repeatCount="indefinite"/>
      </feGaussianBlur>
    </filter>
  </defs>
  
  <circle cx="100" cy="50" r="35" fill="#3b82f6" filter="url(#animatedBlur)"/>
</svg>

实际应用示例

聚焦效果

html
<svg width="300" height="200">
  <defs>
    <filter id="focusBlur" x="-10%" y="-10%" width="120%" height="120%">
      <feGaussianBlur stdDeviation="4"/>
    </filter>
  </defs>
  
  <!-- 模糊的背景元素 -->
  <circle cx="60" cy="60" r="40" fill="#e5e7eb" filter="url(#focusBlur)"/>
  <circle cx="240" cy="60" r="35" fill="#e5e7eb" filter="url(#focusBlur)"/>
  <rect x="30" y="130" width="60" height="50" fill="#e5e7eb" filter="url(#focusBlur)"/>
  <rect x="210" y="120" width="70" height="60" fill="#e5e7eb" filter="url(#focusBlur)"/>
  
  <!-- 清晰的焦点元素 -->
  <circle cx="150" cy="100" r="50" fill="#3b82f6"/>
  <text x="150" y="107" text-anchor="middle" fill="white" font-size="16" font-weight="bold">焦点</text>
</svg>

加载状态

html
<svg width="200" height="80">
  <defs>
    <filter id="loadingBlur">
      <feGaussianBlur stdDeviation="2"/>
    </filter>
  </defs>
  
  <!-- 模糊的占位内容 -->
  <rect x="20" y="15" width="160" height="20" rx="4" fill="#e5e7eb" filter="url(#loadingBlur)"/>
  <rect x="20" y="45" width="120" height="20" rx="4" fill="#e5e7eb" filter="url(#loadingBlur)"/>
</svg>

深度效果(景深)

html
<svg width="350" height="150">
  <defs>
    <filter id="farBlur"><feGaussianBlur stdDeviation="4"/></filter>
    <filter id="midBlur"><feGaussianBlur stdDeviation="1"/></filter>
  </defs>
  
  <!-- 远处(最模糊) -->
  <circle cx="280" cy="75" r="50" fill="#94a3b8" filter="url(#farBlur)"/>
  
  <!-- 中间(轻微模糊) -->
  <circle cx="180" cy="75" r="45" fill="#64748b" filter="url(#midBlur)"/>
  
  <!-- 近处(清晰) -->
  <circle cx="80" cy="75" r="55" fill="#3b82f6"/>
</svg>

遮罩模糊区域

html
<svg width="300" height="150">
  <defs>
    <filter id="blurMask" x="0" y="0" width="100%" height="100%">
      <feGaussianBlur stdDeviation="5"/>
    </filter>
    <clipPath id="blurClip">
      <rect x="100" y="30" width="100" height="90"/>
    </clipPath>
  </defs>
  
  <!-- 背景 -->
  <rect x="20" y="20" width="260" height="110" rx="10" fill="#3b82f6"/>
  <text x="150" y="85" text-anchor="middle" fill="white" font-size="24">敏感内容</text>
  
  <!-- 局部模糊 -->
  <g clip-path="url(#blurClip)">
    <rect x="20" y="20" width="260" height="110" rx="10" fill="#3b82f6" filter="url(#blurMask)"/>
  </g>
</svg>

文字阴影效果

html
<svg width="300" height="80">
  <defs>
    <filter id="textBlur" x="-20%" y="-20%" width="140%" height="140%">
      <feGaussianBlur in="SourceGraphic" stdDeviation="2" result="blur"/>
      <feOffset in="blur" dx="3" dy="3" result="shadow"/>
      <feMerge>
        <feMergeNode in="shadow"/>
        <feMergeNode in="SourceGraphic"/>
      </feMerge>
    </filter>
  </defs>
  
  <text x="150" y="50" text-anchor="middle" font-size="36" font-weight="bold" 
        fill="#1f2937" filter="url(#textBlur)">
    Shadow Text
  </text>
</svg>

霓虹发光

html
<svg width="300" height="100">
  <defs>
    <filter id="neonGlow" x="-50%" y="-50%" width="200%" height="200%">
      <feGaussianBlur stdDeviation="4" result="blur1"/>
      <feGaussianBlur stdDeviation="8" result="blur2"/>
      <feMerge>
        <feMergeNode in="blur2"/>
        <feMergeNode in="blur1"/>
        <feMergeNode in="SourceGraphic"/>
      </feMerge>
    </filter>
  </defs>
  
  <rect x="0" y="0" width="300" height="100" fill="#1f2937"/>
  <text x="150" y="60" text-anchor="middle" font-size="32" font-weight="bold" 
        fill="#22d3ee" filter="url(#neonGlow)">
    NEON
  </text>
</svg>

下一步

掌握了模糊效果后,接下来学习 SVG 阴影 效果!

本站内容仅供学习和研究使用。