在 jQuery 中暂停音频之前添加延迟
Add delay before pausing audio in jQuery
我试图在用户将鼠标悬停在 div 上时淡出 in/out 音频文件。
淡入有效,但音频在淡出完成前暂停。
这是我当前的代码:
$(function () {
$('#playmusic').hover(
function () {
$('#music')[0].play();
$('#music').animate({volume: 1}, 1000);
},
function () {
$('#music').animate({volume: 0}, 1000);
$('#music')[0].pause();
}
)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p id="playmusic">hover to hear audio</p>
<audio id="music" preload="auto">
<source src="https://upload.wikimedia.org/wikipedia/commons/e/ec/A_Tale_of_Distant_Lands.mp3" type="audio/mpeg">
</audio>
我想我需要在我的代码中添加一个 .delay
以便音频在淡出发生后暂停,但是以下给出了一个错误:
$('#music').delay(1000).[0].pause();
有谁知道我错在哪里?
如果你想延迟停止,可以用setTimeout来执行
这是一个例子
setTimeout(function(){
$('#music')[0].pause();
}, 1000);
时间以毫秒为单位设置。
delay 函数用于 jQuery 效果,包括动画,其他更好使用 setTimeout.
我建议使用动画的 complete
callback 来暂停音频。它在动画之后触发,即当音频淡入淡出完成时。
与使用独立计时器相比,此方法的一个优势在于,无论动画的持续时间如何,只要动画完成,音频就会暂停。
使用此格式提供回调函数:
.animate( properties [, duration ] [, easing ] [, complete ] )
complete
Type: Function()
A function to call once the animation is complete, called once per matched element.
或者,使用 alternate format 指定选项:
.animate( properties, options )
我还建议使用 stop()
来防止动画排队。否则,当快速悬停在触发器上和关闭触发器时,动画的累积会变得混乱。
这里有一个演示:
$(function() {
let $music = $('#music');
$('body').on('click', function() {
$(this).addClass('clicked');
});
function playMusic() {
$music
.stop(true, false)
.animate({
volume: 1
}, {
duration: 1000,
start: function() {
this.play();
}
});
}
function pauseMusic() {
$music
.stop(true, false)
.animate({
volume: 0
}, {
duration: 1000,
complete: function() {
this.pause();
}
});
}
$('#playmusic').hover(
playMusic,
pauseMusic
);
});
body {
min-height: 100vh;
transition: background-color 200ms;
}
body.clicked {
background-color: #FFFFF5;
}
#playmusic {
display: inline-block;
padding: 0.25em 0.5em;
background-color: #EEF;
cursor: pointer;
transition: background-color 200ms, opacity 200ms, margin-left 200ms;
border-radius: 0.25em;
visibility: hidden;
opacity: 0;
margin-left: -100%;
}
body.clicked #playmusic {
visibility: visible;
opacity: 1;
margin-left: 0;
}
body.clicked #playmusic:hover {
background-color: #DDFFDD;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Click the page first to interact with the document.</p>
<p id="playmusic">Hover to hear audio</p>
<audio id="music" preload="auto" allow="autoplay" autoplay>
<source src="https://upload.wikimedia.org/wikipedia/commons/e/ec/A_Tale_of_Distant_Lands.mp3" type="audio/mpeg">
</audio>
我试图在用户将鼠标悬停在 div 上时淡出 in/out 音频文件。
淡入有效,但音频在淡出完成前暂停。
这是我当前的代码:
$(function () {
$('#playmusic').hover(
function () {
$('#music')[0].play();
$('#music').animate({volume: 1}, 1000);
},
function () {
$('#music').animate({volume: 0}, 1000);
$('#music')[0].pause();
}
)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p id="playmusic">hover to hear audio</p>
<audio id="music" preload="auto">
<source src="https://upload.wikimedia.org/wikipedia/commons/e/ec/A_Tale_of_Distant_Lands.mp3" type="audio/mpeg">
</audio>
我想我需要在我的代码中添加一个 .delay
以便音频在淡出发生后暂停,但是以下给出了一个错误:
$('#music').delay(1000).[0].pause();
有谁知道我错在哪里?
如果你想延迟停止,可以用setTimeout来执行
这是一个例子
setTimeout(function(){
$('#music')[0].pause();
}, 1000);
时间以毫秒为单位设置。
delay 函数用于 jQuery 效果,包括动画,其他更好使用 setTimeout.
我建议使用动画的 complete
callback 来暂停音频。它在动画之后触发,即当音频淡入淡出完成时。
与使用独立计时器相比,此方法的一个优势在于,无论动画的持续时间如何,只要动画完成,音频就会暂停。
使用此格式提供回调函数:
.animate( properties [, duration ] [, easing ] [, complete ] )
complete
Type: Function()
A function to call once the animation is complete, called once per matched element.
或者,使用 alternate format 指定选项:
.animate( properties, options )
我还建议使用 stop()
来防止动画排队。否则,当快速悬停在触发器上和关闭触发器时,动画的累积会变得混乱。
这里有一个演示:
$(function() {
let $music = $('#music');
$('body').on('click', function() {
$(this).addClass('clicked');
});
function playMusic() {
$music
.stop(true, false)
.animate({
volume: 1
}, {
duration: 1000,
start: function() {
this.play();
}
});
}
function pauseMusic() {
$music
.stop(true, false)
.animate({
volume: 0
}, {
duration: 1000,
complete: function() {
this.pause();
}
});
}
$('#playmusic').hover(
playMusic,
pauseMusic
);
});
body {
min-height: 100vh;
transition: background-color 200ms;
}
body.clicked {
background-color: #FFFFF5;
}
#playmusic {
display: inline-block;
padding: 0.25em 0.5em;
background-color: #EEF;
cursor: pointer;
transition: background-color 200ms, opacity 200ms, margin-left 200ms;
border-radius: 0.25em;
visibility: hidden;
opacity: 0;
margin-left: -100%;
}
body.clicked #playmusic {
visibility: visible;
opacity: 1;
margin-left: 0;
}
body.clicked #playmusic:hover {
background-color: #DDFFDD;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Click the page first to interact with the document.</p>
<p id="playmusic">Hover to hear audio</p>
<audio id="music" preload="auto" allow="autoplay" autoplay>
<source src="https://upload.wikimedia.org/wikipedia/commons/e/ec/A_Tale_of_Distant_Lands.mp3" type="audio/mpeg">
</audio>