【问题标题】:How to create an inset shadow on an svg circle stroke?如何在 svg 圆形笔划上创建嵌入阴影?
【发布时间】:2016-07-16 05:11:41
【问题描述】:

如何在 SVG 中创建以下小部件?

我对形状本身很好,但我正在努力解决后圆上的嵌入阴影。

我尝试了一个径向渐变,它“有效”,但它看起来不太好,我必须摆弄大约千分之一的停止值才能让它完全正确,感觉完全正确哈克。

有没有更好的办法?

生成 SVG 的代码:

<svg width="180" height="180" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <circle cx="90" cy="90" r="72" fill="none" stroke="#ddd" stroke-width="18"></circle>
  <path class="main-arc" d="M 90 18 A 72 72 0 1 1 85.47908259388944 18.142075553164446" fill="transparent" stroke-width="18" stroke="black" stroke-linecap="round" style="stroke-dasharray: 452.389; stroke-dashoffset: 366.435;">
  </path>
</svg>

【问题讨论】:

标签: css svg svg-filters


【解决方案1】:

嗯,你可以用嵌入阴影轻松做到这一点:

<svg width="180" height="180">
<defs>
<filter id="inset-shadow">
  <feFlood flood-color="black"/>
  <feComposite operator="out" in2="SourceGraphic"/>
  <feGaussianBlur stdDeviation="2"/>
  <feComposite operator="atop" in2="SourceGraphic"/>

</filter>
</defs>

  <circle filter="url(#inset-shadow)" cx="90" cy="90" r="72" fill="none" stroke="#ddd" stroke-width="18"></circle>
  <path class="main-arc" d="M 90 18 A 72 72 0 1 1 85.47908259388944 18.142075553164446" fill="transparent" stroke-width="18" stroke="black" stroke-linecap="round" style="stroke-dasharray: 452.389; stroke-dashoffset: 366.435;">
  </path>
</svg>

但如果你真的想要一个 3D 效果,那么你就需要一个灯光效果:

<svg width="180" height="180" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="inset-shadow">
  <feFlood flood-color="black"/>
  <feComposite operator="xor" in2="SourceGraphic"/>
  <feGaussianBlur stdDeviation="1"/>
  <feComposite operator="in" in2="SourceGraphic" result="map"/>
  <feDiffuseLighting lighting-color="white" surfaceScale="2" diffuseConstant="1">
  <feSpotLight x="-30" y="-30" z="230"/>
</feDiffuseLighting>
  <feBlend mode="multiply" in="SourceGraphic" />
  <feComposite operator="in" in2="SourceGraphic"/>

</filter>
</defs>

  <circle filter="url(#inset-shadow)" cx="90" cy="90" r="72" fill="none" stroke="#ddd" stroke-width="18"></circle>
  <path class="main-arc" d="M 90 18 A 72 72 0 1 1 85.47908259388944 18.142075553164446" fill="transparent" stroke-width="18" stroke="black" stroke-linecap="round" style="stroke-dasharray: 452.389; stroke-dashoffset: 366.435;">
  </path>
</svg>

【讨论】:

    【解决方案2】:

    在深灰色背景上画一个浅灰色的描边圆,应用高斯模糊滤镜,并使用 clipPath 剪辑结果:

    <svg width="360" height="360" viewBox="0 0 180 180">
      <defs>
        
        <!-- Gaussian blur filter used to soften the shadow edges -->
        <filter id="blur" filterUnits="userSpaceOnUse" x="-90" y="-90"
                width="180" height="180">
          <feGaussianBlur in="SourceGraphic" stdDeviation="1" />
        </filter>
        
        <!-- Annular clip path for the progress meter background -->
        <clipPath id="ring" clip-rule="evenodd">
          <path d="M0-81A81 81 0 0 1 0 81A81 81 0 0 1 0-81z
                   M0-63A63 63 0 0 1 0 63A63 63 0 0 1 0-63z" />
        </clipPath>
        
      </defs>
      
      <!-- Set orgin to centre of drawing -->
      <g transform="translate(90,90)">
      
        <!-- Start with pale yellow background -->
        <rect x="-90" y="-90" width="180" height="180" fill="#e8e0ce"
              stroke="none" />
        
        <!-- Draw the progress ring on top, and clip using the above clip path -->
        <g clip-path="url(#ring)">
    
          <!-- Dark grey background -->
          <rect x="-85" y="-85" width="170" height="170" fill="#433"
                stroke="none" />
    
          <!-- Lighter grey circle with blur filter applied -->
          <circle cx="0" cy="2.5" r="72" stroke="#655" stroke-width="18"
                  stroke="#655" fill="none" filter="url(#blur)"/>
          
        </g>
        
        <!-- Progress bar and text -->
        <path class="main-arc" d="M 0 -72 A 72 72 0 1 1 -4.52 -71.86"
              style="stroke-dasharray: 452.389; stroke-dashoffset: 366.435;"
              fill="transparent" stroke-width="18" stroke="#b65"
              stroke-linecap="round" />
        <text x="0" y="0" font-size="40" font-family="'Trebuchet MS', sans-serif"
              fill="#655" text-anchor="middle" dominant-baseline="central">
          20%
        </text>
        
      </g>
    </svg>

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 2013-04-30
      • 2019-04-29
      • 1970-01-01
      • 2013-08-14
      • 2013-02-12
      • 2016-08-19
      • 2012-12-13
      • 2023-01-31
      相关资源
      最近更新 更多