我想要一个div flash,以防用户单击它。有没有手动运行settimeout的解决方案?
settimeout解决方案:
app.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<style>
div { transition: background-color 1s; }
div.flashing { background-color: green; transition: none; }
</style>
<div id="app" :class="{'flashing':flashing}" v-on:click="flash">flash when clicked</div>
app.js
const data = { flashing: false }
new Vue({
el: '#app',
data,
methods: { flash }
})
function flash() {
data.flashing = true;
setTimeout(() => data.flashing = false, 100);
}
JS小提琴:https://jsfiddle.net/ang3ukg2/
与克里斯托弗(Christopher(的回答相似,但以一种更习惯的方式。这使用CSS动画通过绑定类和animationend
事件应用。
var demo = new Vue({
el: '#demo',
data: {
animated: false
},
methods: {
animate() {
this.animated = true
}
}
})
<link href="https://unpkg.com/animate.css@3.5.2/animate.min.css" rel="stylesheet" />
<script src="https://unpkg.com/vue@2.2.4/dist/vue.min.js"></script>
<div id="demo">
<h1 :class="{'bounce animated': animated}" @animationend="animated = false">
Animate Test
</h1>
<button @click="animate">
Animate
</button>
</div>
所有归功于罗伯特·基尔斯(Robert Kirsz(,他在对另一个问题的评论中提出了解决方案。
一种替代方法是使用CSS动画并将钩子钩到animationend
事件中:
app.html
<div id="app" v-on:click="toggleClass('app', 'flashing')">flash when clicked</div>
app.css
.flashing {
animation: flash .5s;
}
@keyframes flash {
0% {
background-color: none;
}
50% {
background-color: green;
}
100% {
background-color: none;
}
}
app.js
new Vue({
el: '#app',
methods: {
toggleClass (id, className) {
const el = document.getElementById(id)
el.classList.toggle(className)
}
},
mounted () {
document.getElementById('app').addEventListener('animationend', e => {
this.toggleClass(e.target.id, 'flashing')
})
}
})
工作示例:https://jsfiddle.net/powercube/ang3ukg2/5/
这将允许您重复使用其他类的toggleClass
方法,而无需使用任意类数据和超时的应用程序。
您可以在MDN上找到有关动画事件的更多信息。