【问题标题】:Animate feDropShadow inside filter动画 feDropShadow 内部过滤器
【发布时间】:2020-07-04 06:35:21
【问题描述】:

我有以下代码,我想在defs 中为feDropShadow 制作动画

@import url("https://fonts.googleapis.com/css?family=Open+Sans:300&display=swap");

*,
*::before,
*::after {
	box-sizing: border-box;
	position: relative;
}

html,
body {
	padding: 0;
	margin: 0;
	width: 100%;
	height: 100%;
}

body {
	display: flex;
	justify-content: center;
	align-items: center;
	font-family: "Open Sans", sans-serif;
}

:root {
	--easing: cubic-bezier(0.87, 0.08, 0.23, 0.91);
	--duration: 0.3s;
	--pink: #770946;
}

#app {
	height: 100vh;
	width: 100%;
	background: #1e0238;
	position: relative;
	overflow: hidden;
}

.circle-pink {
	transform: scale(1);
	fill: none;
	stroke: var(--pink);
	stroke-width: 6;
}

.circle-fill {
	transform: scale(1);
	transform-origin: center center;
	fill: var(--pink);
	stroke: none;
	stroke-width: 0;
	filter: url(#shadow);
}
<div id='app'>
	<svg viewBox="0 0 100 100">
		<defs>
			<filter id="shadow">
				<feDropShadow id="shadow-appear" dx="-0.4" dy="0.4" stdDeviation="0.2" flood-opacity="0.25" />
			</filter>
			<animate xlink:href="shadow-appear" attributeName="dx" values="0;-0.4;0" dur="3s" />
			<animate xlink:href="shadow-appear" attributeName="dy" values="0;0.4;0" dur="3s" />
		</defs>
		<circle cx="50" cy="25" r="45" class="circle-pink" />
		<circle cx="50" cy="25" r="40" class="circle-pink" />
		<circle cx="50" cy="25" r="35" class="circle-pink" />
		<circle cx="50" cy="25" r="30" class="circle-pink" />
		<circle cx="50" cy="25" r="25" class="circle-pink" />
		<circle cx="50" cy="25" r="20" class="circle-pink" />
		<circle cx="50" cy="25" r="18" class="circle-pink circle-fill">
			<animate attributeName="r" values="18;20;18" dur="3s" repeatCount="indefinite" />
		</circle>
	</svg>
</div>

根据MDN docs,这些属性是可动画的。

我想只使用 SVG 实现 this animation

半径是动画,但不是阴影。

我也找不到任何关于此的像样的文档。

PS;我已经尝试过this pen,但在我的情况下不起作用。

【问题讨论】:

    标签: html svg svg-filters svg-animate


    【解决方案1】:

    我有以下代码,我想在里面设置动画 feDropShadow defs

    要为 feDropShadow 过滤器设置动画,请使用 stdDeviation 属性

    <feDropShadow id="shadow-appear" dx="-0.4" dy="0.4" stdDeviation="0" flood-opacity="0.25" >
             <animate attributeName="stdDeviation" values="0;4;0" dur="2s" 
                  repeatCount="indefinite" /> 
    </feDropShadow>
    

    @import url("https://fonts.googleapis.com/css?family=Open+Sans:300&display=swap");
    
    *,
    *::before,
    *::after {
        box-sizing: border-box;
        position: relative;
    }
    
    html,
    body {
        padding: 0;
        margin: 0;
        width: 100%;
        height: 100%;
    }
    
    body {
        display: flex;
        justify-content: center;
        align-items: center;
        font-family: "Open Sans", sans-serif;
    }
    
    :root {
        --easing: cubic-bezier(0.87, 0.08, 0.23, 0.91);
        --duration: 0.3s;
        --pink: #770946;
    }
    
    #app {
        height: 100vh;
        width: 100%;
        background: #340362;
        position: relative;
        overflow: hidden;
    }
    
    .circle-pink {
        transform: scale(1);
        fill: none;
        stroke: var(--pink);
        stroke-width: 6;
    }
    
    .circle-fill  {
        transform: scale(1);
        transform-origin: center center;
        fill: var(--pink);
        stroke: none;
        stroke-width: 0;
        filter: url(#shadow); 
    }
    <div id='app'>
        <svg width="400" height="400" viewBox="0 -25 100 100">
            <defs>
                <filter id="shadow">
                    <feDropShadow id="shadow-appear" dx="-0.4" dy="0.4" stdDeviation="0" flood-opacity="0.25" >
    				  <animate attributeName="stdDeviation" values="0;4;0" dur="2s" repeatCount="indefinite" /> 
    				</feDropShadow>
                </filter>
                 <animate xlink:href="#shadow-appear" attributeName="dx" values="0;-0.4;0" dur="2s" /> 
                 <animate xlink:href="#shadow-appear" attributeName="dy" values="0;0.4;0" dur="2s" /> 
            </defs>
            <circle cx="50" cy="25" r="45" class="circle-pink" />
            <circle cx="50" cy="25" r="40" class="circle-pink" />
            <circle cx="50" cy="25" r="35" class="circle-pink" />
            <circle cx="50" cy="25" r="30" class="circle-pink" />
            <circle cx="50" cy="25" r="25" class="circle-pink" />
             <circle cx="50" cy="25" r="20" class="circle-pink" />
            <circle cx="50" cy="25" r="18" class="circle-pink circle-fill" >
                 
            </circle>
        </svg>
    </div>

    【讨论】:

      【解决方案2】:

      我认为我使用了错误的语法。根据@Alexandr_TT 的回答。 animate 应该在 feDropShadow 之内,而不是在它之外。之后,您可以为任何可动画属性设置动画。

      【讨论】:

      • 不一定,你可以使用 href 或 xlink:href 链接到任何你想要动画的东西。
      • 当我使用xlink:href 时它不起作用,但是当我将animate 移动到feDropShadow 中时它起作用了
      • 它应该可以工作:w3.org/TR/SVG11/animate.html#TargetElement 你还在为 dx 和 dy 制作动画吗?
      • 是的,仍然为这两个属性设置动画
      猜你喜欢
      • 2021-01-07
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多