使用 CSS 慢慢地用颜色填充 SVG 图像(如进度条)

Posted

技术标签:

【中文标题】使用 CSS 慢慢地用颜色填充 SVG 图像(如进度条)【英文标题】:Slowly fill SVG image with color (like progress bar) using CSS 【发布时间】:2015-01-11 10:37:26 【问题描述】:

我想用颜色而不是进度条填充 svg 图像。我将使用它来制作动画信息图。

Fill the image below slowly with green colour to show it's 30% "full".<br>
<img src="https://cdn.mediacru.sh/P-WOGKdNDiGT.svg" >

在这里提琴:http://jsfiddle.net/47ayquwq/4/

【问题讨论】:

【参考方案1】:

您可以通过为蒙版或过滤器设置动画,并使用fakeSMIL library 为 IE 进行 polyfill 来做到这一点。以下是过滤器版本。

<svg  >
  <defs>
    <filter id="green-fill" x="0%" y="0%">
      <feFlood flood-color="green"/>
      <feOffset dy="210">
        <animate attributeName="dy" from="300" to="210" dur="2s"/>
        </feOffset>
      <feComposite operator="in" in2="SourceGraphic"/>
      <feComposite operator="over" in2="SourceGraphic"/>
      </filter>
    </defs>
  
     <image filter="url(#green-fill)" xlink:href="https://cdn.mediacru.sh/P-WOGKdNDiGT.svg"   />
  
  </svg>

【讨论】:

太棒了!谢谢!这正是我所指的。 有什么办法可以水平地做这个动画吗? 用 dx 代替 dy【参考方案2】:

您可以通过实现一个矩形进度条然后用 SVG 对其进行遮罩来实现此效果。见下文。然而,这不是一个通用的解决方案。它不能在 IE 上运行,因为 IE 不支持 CSS Masks。

您也可以使用与以下相同的方法,但可以使用 SVG &lt;mask&gt;&lt;clipPath&gt; 元素来代替 CSS 掩码。这里还有很多关于如何使用这些元素的其他问题。这种方法也适用于 IE9+。

.progress 
    position: relative;
    background-color: green;
    -webkit-mask: url(https://cdn.mediacru.sh/P-WOGKdNDiGT.svg) top left / cover;


/* IMG is just here for the size */
.progress IMG 
    visibility: hidden;


/* We expose the green by moving the LHS of the "background" grey */
.progress-bg 
    background-color: gray;
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    -webkit-animation-duration: 1s;
    -webkit-animation-name: to30percent;
    -webkit-animation-fill-mode: forwards;
    animation-duration: 1s;
    animation-name: to30percent;
    animation-fill-mode: forwards;


@-webkit-keyframes to30percent 
  from  left: 0%; 
  to  left: 30%; 


@keyframes to30percent 
  from  left: 0%; 
  to  left: 30%; 
<div class="progress">
    <img src="https://cdn.mediacru.sh/P-WOGKdNDiGT.svg" />
    <div class="progress-bg"></div>
</div>

这里有一个绿色背景的 div。在顶部,我们有一个灰色的 div 代表进度条的“背景”。我们正在这样做,因此我们可以将灰色 div 的“left”属性设置为与我们的进度百分比相同的值。

最后,整个事情都被我们的 SVG 掩盖了。

【讨论】:

谢谢!我不确定这是否存在,而且我使用的所有关键字似乎都不正确。现在我知道 CSS 屏蔽存在! :)【参考方案3】:

如果您的 svg 实际上只是一些文本或简单的形状,您也可以在 svg 内设置动画(例如作为渐变)。对于 IE,您需要添加 fakeSMIL 库或使用 js 制作动画。

例子:

svg 
    height: 500px;
    width: 100%;

text 
    font: 220px Arial;
    font-weight: bold;
    fill: url(#gradient);
<svg>
    <defs>
        <linearGradient id="gradient" x1="0" y1="0" x2="0" y2="1">
            <stop stop-color="#aaa" offset="0" />
            <stop stop-color="#aaa" offset="1">
                <animate dur="2s" by="-0.5" attributeName="offset" fill="freeze" calcMode="spline" keyTimes="0;1" keySplines="0.4, 0, 0.2, 1" />
            </stop>
            <stop stop-color="green" offset="1">
                <animate dur="2s" by="-0.5" attributeName="offset" fill="freeze" calcMode="spline" keyTimes="0;1" keySplines="0.4, 0, 0.2, 1" />
            </stop>
            <stop stop-color="green" offset="1" />
        </linearGradient>
    </defs>
    <text y="1em">HELLO</text>
</svg>

【讨论】:

谢谢!我也会尝试这个选项:)

以上是关于使用 CSS 慢慢地用颜色填充 SVG 图像(如进度条)的主要内容,如果未能解决你的问题,请参考以下文章

从SASS编译时CSS背景网址SVG填充颜色不起作用(不是base64)[重复]

设置内联 SVG 的填充颜色 [重复]

用作 base-64 背景图像数据时如何更改 svg 填充颜色?

在 Android 中动态且顺序地用颜色填充图像视图或位图

img src SVG改变填充颜色

用颜色填充 SVG 路径,但使用悬停淡入模式