简体   繁体   English

平滑地更改SVG的填充

[英]Smoothly change the filling of a SVG

I'm using javascript to change the color of a svg. 我正在使用javascript更改svg的颜色。 This changes my <linearGradient> filling : 这改变了我的<linearGradient>填充:

My problem is, that it is changing very rapidly. 我的问题是,它的变化非常快。 Is there any way to have a "smooth" flow between the colors? 有什么方法可以使颜色之间有“平滑”的流动? I tried to use the jquery anim() method but it wouldn't work because of the SVG-DOM. 我尝试使用jquery anim()方法,但由于SVG-DOM而无法使用。

Edit: More source code. 编辑:更多源代码。 In the end, it's pretty simple. 最后,这非常简单。 I get the stop elements of my svg and calculate a new rgb value. 我得到了svg的stop元素,并计算了一个新的rgb值。 I then set the rgb value as the new stop-color of the stop element 然后,我将rgb值设置为stop元素的新stop-color

js: js:

  var gradient = $('#upper').children('stop');
    var firstValue = 'stop-color:rgb('+top[0]+','+top[1]+','+top[2]+')';
    var secondValue = 'stop-color:rgb('+bottom[0]+','+bottom[1]+','+bottom[2]+')';
        gradient[0].setAttribute('style',firstValue);
        gradient[1].setAttribute('style',secondValue);

html html

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1"  preserveAspectRatio="none">
<defs>
<linearGradient id="upper" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="0%" y2="100%">
<stop style="stop-color:rgb(107,186,112);stop-opacity:1" offset="0"/>
<stop style="stop-color:rgb(107,186,112);stop-opacity:1" offset="1"/>
</linearGradient>
</defs>
<rect x="0" y="0" width="1" height="1" fill="url(#upper)" opacity="0.6" />
</svg>

Depending on the actual scenario, this could be solved with pure SMIL animation : 根据实际情况,可以使用纯SMIL动画解决此问题:

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1"  preserveAspectRatio="none">
  <defs>
    <linearGradient id="upper" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="0%" y2="100%">
      <stop stop-color="rgb(107,186,112)" offset="0">
        <animate attributeType="CSS" attributeName="stop-color" id="animate0"
           dur="2s" begin="rect0.click" fill="freeze" to="rgb(0,255,0)"/>
      </stop>
      <stop stop-color="rgb(107,186,112)" offset="1">
        <animate attributeType="CSS" attributeName="stop-color"
           dur="2s" begin="animate0.begin" fill="freeze" to="rgb(255,0,0)"/>
      </stop>
    </linearGradient>
  </defs>
  <rect x="0" y="0" width="1" height="1" fill="url(#upper)" opacity="0.6" id="rect0"/>
</svg>

I this case the animation is triggered by a click on the rectangle. 在这种情况下,动画是通过单击矩形触发的。

Specific colors can also be set by JavaScript and the animation can be triggered by JavaScript : 特定颜色也可以由JavaScript设置,动画可以由JavaScript触发

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1"  preserveAspectRatio="none">
  <defs>
    <linearGradient id="upper" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="0%" y2="100%">
      <stop stop-color="rgb(107,186,112)" offset="0">
        <animate attributeType="CSS" attributeName="stop-color" id="animate0"
           dur="2s" begin="indefinite" fill="freeze"/>
      </stop>
      <stop stop-color="rgb(107,186,112)" offset="1">
        <animate attributeType="CSS" attributeName="stop-color"
           dur="2s" begin="animate0.begin" fill="freeze"/>
      </stop>
    </linearGradient>
  </defs>
  <rect x="0" y="0" width="1" height="1" fill="url(#upper)" opacity="0.6"/>
  <script type="text/javascript">
    var gradientColors = [[255,0,0],[255,255,0]];
    var animateElements = document.getElementsByTagName("animate");
    for (var i=0; i<2; i++) {
      animateElements[i].setAttribute(
        "to",
        "rgb("+gradientColors[i].join(",")+")"
      );
    }
    animateElements[0].beginElement();
  </script>
</svg>

Whether these solutions are practical for you depends on whether the targeted browsers support SMIL animation. 这些解决方案是否适合您取决于目标浏览器是否支持SMIL动画。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM