前言
在學習vue.js的過渡動畫時,官方案例主要使用了opacity屬性。但是將opacity替換成width後就無動畫效果。通過搜尋發現有人遇到過這種問題,但是都沒有找到問題所在。
替換後程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#div1 {
width: 600px;
height: 200px;
background-color: red;
}
.fade-enter-active, .fade-leave-active {
transition: width .5s;
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
width: 0px;
}
</style>
</head>
<body>
<div id="app">
<button @click="show = !show">button</button>
<transition name="fade">
<div id="div1" v-if="show">
</div>
</transition>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
show: false
}
})
</script>
</body>
</html>
複製程式碼
除錯結果:
發現在class切換到v-leave-to時,width沒起作用,原因是由於CSS選擇器權重的問題導致的#div1
的權重要比.fade-leave-to
的高。
解決方案
解決方法有兩種: (1)提高選擇器權重:
#div1.fade-enter, #div1.fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
width: 0px;
}
複製程式碼
(2)使用!important
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
width: 0px !important;
}
複製程式碼
總結
在使用vue.js中,有的地方需要自己定義特定名稱的CSS類,如果在執行過程中,vue.js自動新增的類沒有問題,但是類中的屬性沒有效果,很有可能是選擇器選中問題。
像這個案例中,動畫切換的類都是在動畫開始,中間,結束時加的,動畫結束後這些類就移除了。除錯很麻煩。