# 动画属性一览
- 时间:
begin
:dur
:end
:min
:max
:restart
:repeatCount
:repeatDur
:fill
: 动画结束时效果remove (默认回到初始状态)
|freeze(停留在动画结束状态)
- 值
calcMode
:values
:keyTimes
:keySplines
:form
:to
:by
:
- 其他属性
attributeName
:additive
:accumulate
:
# 时间
# begin/end
- 开始时间/结束时间可用值
- 值1: 时间(s)
- 值2: 其他动画的时间节点的偏移量
- 值3: 事件
- 值4: 重复事件时间节点
- 值5: 键盘按钮(无效?)
- 值6: ISO8601 定义的标准时间
值1: 文档加载后的等待时间
<svg>
<rect x="0" y="0" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
begin="1s"
fill="freeze"
/>
</rect>
<rect x="0" y="10" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
begin="4s"
fill="freeze"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
值2: 其他事件的偏移量 id.
begin
/end
<svg>
<rect x="0" y="0" width="10" height="3">
<animate
id="a1"
attributeName="width"
to="200"
dur="3s"
begin="1s"
repeatCount="2"
fill="freeze"
/>
</rect>
<rect x="0" y="10" width="10" height="3">
<animate
id="a2"
attributeName="width"
to="200"
dur="3s"
begin="a1.end"
fill="freeze"
/>
</rect>
<rect x="0" y="20" width="10" height="3">
<animate
id="a3"
attributeName="width"
to="200"
dur="3s"
begin="a2.begin"
fill="freeze"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
值3: 事件 id.event
focusin
、focusout
、activate
、click
、mousedown
、mouseup
、mouseover
、mousemove
、mouseout
、DOMSubtreeModified
、DOMNodeInserted
、DOMNodeRemoved
、DOMNodeRemovedFromDocument
、DOMNodeInsertedIntoDocument
、DOMAttrModified
、DOMCharacterDataModified
、SVGLoad
、SVGUnload
、SVGAbort
、SVGError
、SVGResize
、SVGScroll
、SVGZoom
、beginEvent
、endEvent
、repeatEvent
。
<body>
<button id="startBtn">start</button>
<button id="endBtn">end</button>
<svg>
<rect x="0" y="10" width="10" height="3">
<animate
id="a1"
attributeName="width"
to="200"
dur="3s"
repeatCount="indefinite"
begin="startBtn.click"
end="endBtn.click"
fill="freeze"
/>
</rect>
</svg>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# dur
- 动画周期
- 可用格式/单位:
hh:mm:ss.iii
/mm:ss.iii
<svg>
<rect x="0" y="0" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
repeatCount="indefinite"
fill="freeze"
/>
</rect>
<rect x="0" y="10" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="00:15"
repeatCount="indefinite"
fill="freeze"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# restart
- 定义动画是否可以重新开始
always(默认)
: 总是可以重新开始whenNotActive
: 只有在结束后才可以重新开始never
: 永远不可以重新开始
<button id="startBtn">start</button>
<button id="endBtn">end</button>
<svg>
<rect x="0" y="10" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
restart="always"
begin="startBtn.click"
end="endBtn.click"
fill="freeze"
/>
</rect>
<rect x="0" y="20" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
restart="whenNotActive"
begin="startBtn.click"
end="endBtn.click"
fill="freeze"
/>
</rect>
<rect x="0" y="30" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
restart="never"
begin="startBtn.click"
end="endBtn.click"
fill="freeze"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# repeatDur
- 定义动画总重复时间
- 可用格式/单位:
hh:mm:ss.iii
/mm:ss.iii
<button id="startBtn">start</button>
<svg>
<rect x="0" y="10" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
begin="startBtn.click"
repeatDur="8s"
fill="freeze"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# fill
- 结束定格模式
- remove: 回到初始状态
- freeze: 定格结束状态
<button id="startBtn">start</button>
<svg>
<rect x="0" y="10" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
begin="startBtn.click"
fill="remove"
/>
</rect>
<rect x="0" y="20" width="10" height="3">
<animate
attributeName="width"
to="200"
dur="3s"
begin="startBtn.click"
fill="freeze"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 动画值
- 属性字符串内不能有空格,iphone11不生效
# values
- 设置多个值
<svg>
<circle cx="10" cy="10" r="5">
<animate attributeName="cy" attributeType="XML" values="10;130;10" dur="4s" repeatCount="indefinite"></animate>
<animate attributeName="cx" attributeType="XML" values="10;130;10" dur="4s" repeatCount="indefinite"></animate>
</circle>
</svg>
1
2
3
4
5
6
7
2
3
4
5
6
7
# keyTimes
- 和values一一对应
- 每一个值都是一个[0-1]的数,代表对应总时间的比例
<svg>
<circle cx="10" cy="10" r="5">
<animate
attributeName="cy"
attributeType="XML"
dur="4s"
repeatCount="indefinite"
values="10;130;10"
keyTimes="0;0.4;1"
/>
<animate
attributeName="cx"
attributeType="XML"
dur="4s"
repeatCount="indefinite"
values="10;130;10"
keyTimes="0;0.85;1"
/>
</circle>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# attributeName
- 要改变的属性值
<svg width="300" height="200">
<path
d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"
fill="transparent"
stroke="black"
>
<animate
attributeName="d"
dur="3s"
values="
M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80;
M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80;
M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80
"
keyTimes="0;0.5;1"
repeatCount="indefinite"
/>
</path>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<body>
<svg width="300" height="200">
<path
id="myPath"
d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"
fill="transparent"
stroke="black"
stroke-width="2"
>
<animate
id="myAnimate"
attributeName="stroke-dashoffset"
dur="2s"
keyTimes="0;1"
fill="freeze"
begin="2s"
/>
</path>
</svg>
<script>
// 通过设置 stroke-dasharray stroke-dashoffset 配合动画,做出线条逐渐延伸效果
document.addEventListener("DOMContentLoaded", function () {
const path = document.getElementById("myPath");
const animate = myPath.querySelector("animate");
const pathLength = path.getTotalLength();
path.setAttribute("stroke-dasharray", pathLength);
path.setAttribute("stroke-dashoffset", pathLength);
animate.setAttribute("values", `${pathLength};0`);
});
</script>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# accumulate
- 要改变的属性值
<button id="startBtn">start</button>
<svg width="3000" height="100">
<rect y="5" width="0" height="20" fill="blue">
<animate
attributeName="width"
begin="startBtn.click"
dur="1s"
values="0;60;20"
keyTimes="0;0.5;1"
repeatCount="indefinite"
accumulate="sum"
/>
</rect>
</svg>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15