javascript - 用于将 smil 动画与 svg 中的音频同步的 cat 2 JS
问题描述
我使用 html5 CMS 模板,我还想在其中集成 SVG 动画。音频文件链接到 SMIL 动画。这只能用javascript来解决。
当音频 SVG 动画停止并重新启动时,就会出现问题。两者都应该单击一次,但它没有成功,因为我无法在 javacript 中输入 2 次单击以获取两种状态的 SMIL 动画,暂停和未暂停。
如何连接这两个来源?:(您可以在网站arteurope.de上看到它,您必须单击按钮)
我需要把
svg.addEventListener("mouseout", function() {
svg.pauseAnimations();
进入
svg.addEventListener("click", function() {
svg.pauseAnimations();
但是动画没有开始,因为第一个函数的“点击”说:unpauseAnimation,第二个函数说:pauseAnimation。
<script type="text/javascript">
(function () {var svg = document.getElementsByTagName('svg')[0],
audio = null;
svg.addEventListener('click', handler, false);
function handler() {
if (!audio) {
audio = new Audio('https://arteurope.de/files/Vergessen.mp3');
audio.play();
} else if (audio && audio.paused) {
audio.play();
} else {
audio.pause();
}
}
})();
</script>
<script type="text/javascript">
var svg = document.querySelector(".svg-gears");
svg.pauseAnimations();
svg.addEventListener("click", function() {
svg.unpauseAnimations();
});
svg.addEventListener("mouseout", function() {
svg.pauseAnimations();
});
</script>
解决方案
连接两个脚本非常容易,但通常最简单的方法最后出现:
<script>
(function () {
var svg = document.getElementsByTagName('svg')[0],
txt = document.getElementsByTagName('text')[0];
audio = null;
svg.addEventListener('click', handler, false);
function handler() {
if (!audio) {
audio = new Audio('https://arteurope.de/files/Vergessen.mp3');
audio.play();
svg.unpauseAnimations();
txt.innerHTML = 'Stop';
} else if (audio && audio.paused) {
audio.play();
svg.unpauseAnimations();
txt.innerHTML = 'Stop';
} else {
audio.pause();
svg.pauseAnimations();
txt.innerHTML = 'Play';
}
}
})();
</script>
您只将动画动作放入音频脚本中。下面是一个片段:
<!DOCTYPE html>
<html>
<title>musicsite</title>
<head>
</head>
<body>
<svg
width="400"
height="600"
opacity="1"
id="svg1">
<defs id="defs4" >
<animate
xlink:href="#svg1"
id="tv1"
attributeName="opacity"
from="1"
to="1"
dur="1s"
begin="click"
restart="never"
fill="freeze" />
<animateTransform
xlink:href="#svg1"
id="scroll1"
type="translate"
attributeName="transform"
begin="tv1.end+4s"
dur="2s"
from="0,0"
to="0,-520"
fill="freeze" />
<animateTransform
xlink:href="#svg1"
id="scroll2"
type="translate"
attributeName="transform"
begin="scroll1.end+4s"
dur="2s"
from="0,-520"
to="0,0"
fill="freeze" />
<animateTransform
xlink:href="#button1"
id="zoom"
attributeName="transform"
type="scale"
transform="scale(2, 2)"
values="1; 2"
begin="scroll2.end+4s"
dur="2s"
fill="freeze" />
</defs>
<g
id="layer1">
<rect
width="400"
height="250"
x="200"
y="115"
id="rect0"
style="color:#000000;fill:#e9b96e;fill-opacity:0.34645673;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.9496063;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="400"
height="160"
x="200"
y="550"
id="rect1"
style="color:#000000;fill:#ef2929;fill-opacity:0.34645673;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.9496063;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="100"
height="100"
x="200"
y="800"
id="rect2"
style="color:#000000;fill:#729fcf;fill-opacity:0.34645673;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.9496063;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="100"
height="100"
x="500"
y="800"
id="rect3"
style="color:#000000;fill:#204a87;fill-opacity:0.34645673;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.9496063;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
<g id="button1" opacity="1" transform="translate(10 10)">
<rect x="20" y="20" rx="20" ry="20" width="100" transform="(1,1)" height="100" id="buttonrect" style="fill:red;stroke:black;stroke-width:5;" />
<text x="51" y="75" fill="black">Play</text>
</g>
</svg>
<script>
(function () {
var svg = document.getElementsByTagName('svg')[0],
txt = document.getElementsByTagName('text')[0];
audio = null;
svg.addEventListener('click', handler, false);
function handler() {
if (!audio) {
audio = new Audio('https://arteurope.de/files/Vergessen.mp3');
audio.play();
svg.unpauseAnimations();
txt.innerHTML = 'Stop';
} else if (audio && audio.paused) {
audio.play();
svg.unpauseAnimations();
txt.innerHTML = 'Stop';
} else {
audio.pause();
svg.pauseAnimations();
txt.innerHTML = 'Play';
}
}
})();
</script>
</body>
</html>
推荐阅读
- java - 在 Hazelcast 中查询
- python - 从 PyCharm 和 Linux 运行时的两个不同输出文件
- node.js - 文档中间件、模型中间件、聚合中间件、查询中间件有什么区别?
- ruby - 谁能解释一下 :hard_wrap 是如何工作的?
- javascript - 当实时位置到达标记位置时,如何调用显示“您已到达目的地”警报的函数?ReactJS 和传单
- javascript - 如何使用 React Native 创建底部标签导航
- javascript - 给定数组的 Observable,优化 Rxjs 中重复的昂贵计算
- javascript - 包含对象到平面对象数组的对象数组
- r - Firth 逻辑回归中的错误消息
- java - AspectJ @Around 和 @After 抛出相同的方法不起作用