Svg fill animation for the given path

后端 未结 3 1212
無奈伤痛
無奈伤痛 2020-12-03 02:31

I am trying to animate an arrow from left to right.The code of my arrow\'s path is given below:

相关标签:
3条回答
  • 2020-12-03 02:37

    Building upon andreas' answer. You can cover your arrow with a shape that is animated to uncover it.

    <svg id="svg_circle" width="450" height="400" viewBox='0 0 450 400'> 
      <path class="path" stroke="#F0F0F0" fill="#fff"
        stroke-width="1" opacity="1" id="svg_1"
        d="m34.97813,21.70979l-33.55223,0.47088l-0.0394,
           -13.57138l34.2665,-0.47295l-0.0208,-7.14282
           l14.50618,14.42226l-14.95643,15.04345l-0.20382,
           -8.74944z"> 
       <animate id="project_anim1" attributeName="fill"
          from="#fff" to="#4DAF4C" begin="0s" dur="3s"
          fill="freeze" repeatCount="indefinite" />
      </path>
      <rect x="0" y="0" width="53" height="34" fill="#fff">
        <animate attributeType="XML" attributeName="x"
          from="0" to="53" begin="0s" dur="3s"
          repeatCount="indefinite" />
        <animate attributeType="XML" attributeName="width"
          from="53" to="0" begin="0s" dur="3s"
          repeatCount="indefinite" />
      </rect>
    </svg>

    0 讨论(0)
  • 2020-12-03 02:39

    You can do this by just animating the <stop>s in a <linear gradient>.

    <svg id="svg_circle" width="100%" height="100%" viewBox = '0 0 450 400'> 
    
      <defs>
        <linearGradient id="left-to-right">
          <stop offset="0" stop-color="#4DAF4C">
            <animate dur="2s" attributeName="offset" fill="freeze" from="0" to="1" />
          </stop>
          <stop offset="0" stop-color="#fff">
            <animate dur="2s" attributeName="offset" fill="freeze" from="0" to="1" />
          </stop>
          
        </linearGradient>
      </defs>
    
      <path class="path" stroke="#F0F0F0" fill="url(#left-to-right)" stroke-width="1" opacity="1" d="m34.97813,21.70979l-33.55223,0.47088l-0.0394,-13.57138l34.2665,-0.47295l-0.0208,-7.14282l14.50618,14.42226l-14.95643,15.04345l-0.20382,-8.74944z" id="svg_1" />
    </svg>

    How this works is that we have a linear gradient representing an abrupt change from green to white. The <animation> elements move the position, of that abrupt change, from the left of the arrow (offset=0) to the right (offset="1").

    Note that SVG <animate> elements will not work in IE. If you need to support IE, you will need to use the FakeSmile library or use a different method (such as a JS animation library).

    0 讨论(0)
  • 2020-12-03 02:46

    I don't think this is possible with the fill attribute. But instead, you can invert your SVG path to a rectangle with a triangle like hole. Now you just need a second element behind that path, where you can simply animate the scale in x-direction, to fill the hole from left to right.

    Here is an image showing the technique:

    An here is a working example:

    <svg width="100%" height="100%" viewBox='0 0 450 400'>
      <rect x="0" y="0" width="1" height="22" style="fill: black;" >
        <animateTransform attributeName="transform" type="scale" from="1 1" to="50 1" begin="0s" dur="2s" repeatCount="indefinite" />
      </rect>
      <path fill="#ffffff" d="M0,0v29.8h86V0H0z M6.5,25V5.5L48.8,25H6.5z"/>
    </svg>

    Note: The answer was updated from triangle to arrow, I won't update my answer as the technique is the same for every shape.

    0 讨论(0)
提交回复
热议问题