【问题标题】:How to animate pattern items sequentially?如何按顺序为模式项目设置动画?
【发布时间】:2020-06-10 00:23:24
【问题描述】:

  <svg viewbox="0 0 100 100">
    	<defs>
    		<pattern
    				id="dotted-pattern"
    				viewbox="0,0,100,100"
    				height="3.125%"
    				width="3.125%">
    			<circle cx="50" cy="50" fill="#10446D" r="12">
    				<animate
    					attributeName="opacity"
    					values="0; 1"
    					keyTimes="0; 1"
    					dur="1s"
    					begin="0s"
    					repeatCount="1"
    					fill="freeze" />
    			</circle>
    		</pattern>
    		<mask id="circle-mask" maskContentUnits="userSpaceOnUse" maskUnits="userSpaceOnUse">
    			<circle cx="50" cy="50" r="38.48" width="100" height="100" fill="white"></circle>
    		</mask>
    	</defs>
    
    	<rect
    			width="74"
    			height="74"
    			y="13"
    			x="13"
    			mask="url(#circle-mask)"
    			fill="url(#dotted-pattern)"></rect>
    </svg>

这样,所有模式项的动画都会同时运行。

如何按顺序运行?如果上一个项目完成,则开始下一个项目动画?

【问题讨论】:

    标签: css animation svg


    【解决方案1】:

    我将动画从白色到黑色的径向渐变,而不是为图案的圆圈设置动画,我会使用此渐变来填充蒙版圆圈,如下所示:

    <svg viewbox="0 0 100 100">
        	<defs>
            <radialGradient id="rg" cx=".5" cy=".5" r="0.01">
       <stop offset="0%" stop-color="white"></stop>
       <stop offset="100%" stop-color="black"></stop>
              <animate
        					attributeName="r"
        					values="0.01; 1"
        					dur="3s"
        					begin="0s"
        					repeatCount="1"
        					fill="freeze" />
      </radialGradient>
        		<pattern
        				id="dotted-pattern"
        				viewbox="0,0,100,100"
        				height="3.125%"
        				width="3.125%">
        			<circle cx="50" cy="50" fill="#10446D" r="12"/>
        				
        		</pattern>
        		<mask id="circle-mask" maskContentUnits="userSpaceOnUse" maskUnits="userSpaceOnUse">
        			<circle id="kk" cx="50" cy="50" r="38.48" width="100" height="100" fill="url(#rg)">
                
              </circle>
        		</mask>
        	</defs>
        
        	<rect
        			width="74"
        			height="74"
        			y="13"
        			x="13"
        			mask="url(#circle-mask)"
        			fill="url(#dotted-pattern)"></rect>
            
            
        </svg>

    第二个解决方案

    您可以用白色填充蒙版圆圈并像这样为半径设置动画:

    <svg viewbox="0 0 100 100">
        	<defs>
    
        		<pattern
        				id="dotted-pattern"
        				viewbox="0,0,100,100"
        				height="3.125%"
        				width="3.125%">
        			<circle cx="50" cy="50" fill="#10446D" r="12"/>
        				
        		</pattern>
        		<mask id="circle-mask" maskContentUnits="userSpaceOnUse" maskUnits="userSpaceOnUse">
        			<circle id="kk" cx="50" cy="50" r="38.48" width="100" height="100" fill="white">
                <animate
        					attributeName="r"
        					values="0.01; 38.48"
        					dur="3s"
        					begin="0s"
        					repeatCount="1"
        					fill="freeze" />
              </circle>
        		</mask>
        	</defs>
        
        	<rect
        			width="74"
        			height="74"
        			y="13"
        			x="13"
        			mask="url(#circle-mask)"
        			fill="url(#dotted-pattern)"></rect>
            
            
        </svg>

    【讨论】:

    • 有趣的解决方案。你能解释一下,最后如何得到不透明度为 1 的所有点。解决方案留下一些不透明度小于 1 的点?
    • 现在我正在使用以下值制作动画:values="0.01; 1"。这意味着我正在将半径从圆的值的 0.01 动画到 1 圆的值。您可以将第二个值更改为更大的值,例如 2。另请参阅我的答案的第二个解决方案
    • @enxaneta 谢谢你,这对我来说是一个可靠而有效的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2011-10-24
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多