Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

svg animate - How can I make my SVG SMIL animation play back correct again?

I'm a designer with little coding experience and a while ago I played around with SMIL animations and I remember that some browsers did not support specific commands. Now I wanted to review my animations and unfortunately noticed that the browser I originally tested the animations with successfully (opera) also stopped playing my animation back correctly. The blue ball used to move up and down the y-axis and this animation is not working anymore now.

Do you guys know why this animation is not played back correctly anymore in codepen and how I can view the animation as it used to be?

https://codepen.io/clemse/pen/gOYPNJZ

This is the part that does not seem to work:

<!-- Animating the ball along the Y Axis, with specific y coordinate values relative to time, with speed dependent on bezier curve -->
<animate
           attributeName="cy"
           begin="0.2s"
           dur="1.6s"
           values="142;10;-5;142;142"
           keySplines="
                       0.1 0.9 1.0 1.0; 
                 1.0 1.0 1.0 1.0; 
                       0.5 1.6 0.1 0.9;
                 0.1 0.9 1.0 1.6;" 
           keyTimes="
                       0;0.20;0.40;0.8;1" 
           calcMode="spline"
           repeatCount="indefinite"
           />
question from:https://stackoverflow.com/questions/65860327/how-can-i-make-my-svg-smil-animation-play-back-correct-again

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You can have a look at the console and you will see where the problem is. According to the specs for keySplines,

The values of x1 y1 x2 y2 must all be in the range 0 to 1.

Your example has two values of 1.6. I have changed them to 0.6 and it works in my browser (Chrome).

<svg style="display:block; margin: 0 auto;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="600" viewBox="0 0 300 300">

<!-- Background shape--> 
<rect x="0" y="0" width="300" height="300" fill="#FCCE01 "/>

<!-- Opening the Group for the Toy-->
<g>
  
<!-- Animating the balls impact on the toyvertically-->  
  <animateTransform
          attributeName="transform"
          type="translate"
          values="0,0;0,8;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0" 
          begin="1.0s" 
          dur="1.6"
          repeatCount="indefinite"
  />
  
<!-- Positioning the toy-->
<g transform="translate(-65,34)">  
  
<!-- Ball shape-->
  <ellipse cx="217" cy="30" rx="15" ry="15"
           fill="#65c8d2"
           stroke="#4e2561" 
           stroke-width="3">

<!-- Animating the ball along the Y Axis, with specific y coordinate values relative to time, with speed dependent on bezier curve -->
    <animate
               attributeName="cy"
               begin="0.2s"
               dur="1.6s"
               values="142;10;-5;142;142"
               keySplines="0.1 0.9 1.0 1.0;1.0 1.0 1.0 1.0;0.5 0.6 0.1 0.9;0.1 0.9 1.0 0.6" 
               keyTimes="0;0.20;0.40;0.8;1" 
               calcMode="spline"
               repeatCount="indefinite"
               />
   
<!-- Animating the balls shape (squashing) along the x axis-->    
    <animate 
               attributeName="rx"
               values="15; 10.5 ; 17 ; 19 ; 15 ; 10.5 ; 17 ; 15 ; 15 ; 15 ; 15"
               begin="0.2s"
               dur="1.6s"
               repeatCount="indefinite"
               />
    
<!-- Closing the object so only the ball gets animated-->
    </ellipse>
  
<!-- Positioning the trigger-->
  <g transform="translate(200,150)"> 

<!-- Drawing the trigger-->
   <path d="M0,0 L-14,0 Q-15,20 3,25 L0,0z "
         style="stroke:#4e2561;
         stroke-width:3;
         fill:#e54e6d">
      
 <!--Animating the triggers rotation-->
      <animateTransform
                        attributeName="transform"
                        type="rotate"
                        values="0 0 0; -30 0 0; 0 0 0; 0 0 0 ; 0 0 0 ; 0 0 0; 0 0 0 ; 0 0 0 ; 0 0 0 ; 0 0 0 "
                        begin="0s"
                        dur="1.6s"
                        fill="freeze" 
                        repeatCount="indefinite"
                        />    
     
    </path>
       
  </g>
  
<!--Positioning the cage-->
<g transform="translate(200,150)">

<!--Drawing the cage-->
  <path d="M0,0 L-18,-52 L52,-52 L34,0 L10,0 L2,-52   M30,-52 L24,0 M-5,-17 L40,-17 M45,-34 L-12,-34"
        style="stroke:#4e2561;
               stroke-width:3;
               fill:none"/>
  </g>
  
<!--Positioning the Cone-->  
  <g transform="translate(200,150)">
   
<!--Drawing the Cone-->      
   <path d="M0,0 L10,75 A1,1 0 0,0 24,75 L34,0 L0,0z "
         style="stroke:#4e2561;
                stroke-width:3;
                fill:#e54e6d"/>
  </g>
    
 </g>
  
</svg>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...