Vue3中動態(tài)修改樣式與級聯(lián)樣式優(yōu)先順序圖文詳解
前言
本編記錄了Vue3中動態(tài)修改CSS樣式的方法,在項目中,經(jīng)常會遇到CSS樣式要變更的地方。
文章后面有對【級聯(lián)樣式優(yōu)先級順序】的復習
一、ref修改樣式
1、通過 Vue 的 ref 組件獲取 DOM 元素節(jié)點
通過ref對元素實現(xiàn)動態(tài)綁定,可以獲取到對應(yīng)的DOM元素節(jié)點,代碼如下:
提示:以下代碼語法采用Vue3比較精簡的setup語法糖展示
<template>
<div class="squareClass" ref="squareRef">
</div>
</template>
<script setup>
import {onMounted, ref} from 'vue'
//聲明squareRef對應(yīng)ref對象為一個常量
const squareRef = ref()
onMounted(() => {
//setup語法用.value獲取ref對象的值
console.log('獲取到的DOM對象: ' + squareRef.value)
console.log(squareRef.value)
})
</script>
瀏覽器控制臺打印結(jié)果如下:

注:這邊比較一下,和 DOM操作 document.getElementById(‘id’) 這個方法有什么區(qū)別
Vue中,在生命周期create階段ref組件就會對DOM節(jié)點進行動態(tài)綁定
如果在Vue3中要使用 document.getElementById(‘id’) 這個方法的話
要在onMounted組件中獲取節(jié)點,代碼如下:
<template>
<div id="squareId">
</div>
</template>
<script setup>
import {onMounted} from 'vue'
let squareId
onMounted(() => {
squareId = document.getElementById('squareId')
//這邊和ref的調(diào)用區(qū)別少了個.value
console.log(squareId)
})
</script>
瀏覽器控制臺打印結(jié)果如下:

2、通過 ref 修改 DOM 元素節(jié)點樣式
以下代碼展示的是通過 ref 來修改樣式,代碼如下:
<template>
<div ref="squareRef">
</div>
</template>
<script setup>
import {onMounted, ref} from 'vue'
const squareRef = ref()
onMounted(() => {
//ref修改DOM節(jié)點樣式,DOM操作document.getElementById('id')的寫法一樣,只不過去掉了.value,所以原理上是一樣的
squareRef.value.style.width = '200px'
squareRef.value.style.height = '200px'
//這邊樣式名稱有點小小的區(qū)別,在CSS中背景顏色的屬性名稱為:background-color,在style對象中的"-"符號不能用來引用屬性值
//所以這邊一律使用駝峰命名方式來調(diào)取CSS屬性或賦值,background-color對應(yīng)backgroundColor
squareRef.value.style.backgroundColor = 'greenyellow'
squareRef.value.style.border = '5px dashed green'
})
</script>
效果展示:

二、通過v-bind對Html元素的樣式(style)進行動態(tài)綁定
在Vue中,正常的v-bind寫法如下:
<div v-bind:style="squareStyle">
在項目使用中,我們普遍會省略掉前面的v-bind,簡寫的方式如下:
<div :style="squareStyle">
這時候我們只要聲明一個變量或常量,初始化該變量或常量的ref的值為css對象
就可以實現(xiàn)樣式的動態(tài)綁定,代碼如下:
提示:以下style樣式的動態(tài)綁定采用簡寫:style實現(xiàn)
<template>
<div :style="squareStyle">
</div>
</template>
<script setup>
import {ref} from 'vue'
//聲明一個常量或變量即可實現(xiàn)樣式動態(tài)綁定
const squareStyle = ref({
width: '200px',
height: '200px',
backgroundColor: 'skyblue',
border: '5px dotted blue',
borderRadius: '110px'
})
</script>
效果展示:

三、v-bind:style動態(tài)綁定和ref修改style樣式的區(qū)別
在Vue中,通過ref組件對style進行動態(tài)綁定之后,這個style的對象除了用ref組件重新賦值之外
通過ref.value.style是不能對動態(tài)綁定的對象進行修改的。
<template>
<div ref="squareRef" :style="squareStyle">
</div>
</template>
<script setup>
import {onMounted, ref} from 'vue'
const squareRef = ref(),
squareStyle = ref()
onMounted(()=>{
//v-bind:style動態(tài)綁定
squareStyle.value = {
width: '200px',
height: '200px',
backgroundColor: 'skyblue',
border: '5px dotted blue',
borderRadius: '110px'
}
//通過ref組件進行style樣式修改
squareRef.value.style.width = '300px'
squareRef.value.style.height = '300px'
squareRef.value.style.backgroundColor = 'greenyellow'
squareRef.value.style.border = '5px dashed green'
squareRef.value.style.borderRadius = ''
})
</script>
結(jié)果展示:

我明明已經(jīng)修改了樣式,怎么不生效呢?
因為該樣式對象已被動態(tài)綁定,就算修改了值,也會馬上變回去
這時候只有通過修改動態(tài)綁定的style對象,才能對其進行修改
代碼如下:
<template>
<div :style="squareStyle">
</div>
</template>
<script setup>
import {onMounted, ref} from 'vue'
const squareStyle = ref()
onMounted(() => {
//第一個樣式是天空藍圓形
squareStyle.value = {
width: '200px',
height: '200px',
backgroundColor: 'skyblue',
border: '5px dotted blue',
borderRadius: '110px'
}
//第二個樣式是黃綠方塊
squareStyle.value = {
width: '300px',
height: '300px',
backgroundColor: 'greenyellow',
border: '5px dashed green'
}
})
</script>
結(jié)果展示:

修改的樣式會把前一次的樣式整個覆蓋掉(上面的borderRadius屬性不見了),這是需要注意的地方
四、【級聯(lián)樣式優(yōu)先級順序】復習
這邊我們復習一下關(guān)于CSS樣式賦值的【級聯(lián)樣式優(yōu)先級順序】
下面代碼展示三種級聯(lián)樣式的類型:外聯(lián)式樣式、內(nèi)聯(lián)式樣式、內(nèi)嵌式樣式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>級聯(lián)樣式測試</title>
<!-- 在head標簽里用link標簽引入的樣式文件為【外聯(lián)式樣式】 -->
<link rel="stylesheet" href="CSS.css" rel="external nofollow" type="text/css">
<!-- 在head標簽里的style標簽為【內(nèi)聯(lián)式樣式】 -->
<style>
.circle {
/* 這邊我們用background-color(背景顏色)來做級聯(lián)優(yōu)先級測試 */
/* 加上【 !important 】最高優(yōu)先級關(guān)鍵字來進行標注和比較 */
background-color: greenyellow !important; /* 內(nèi)聯(lián)式樣式的背景顏色為【黃綠色】 */
}
</style>
</head>
<body>
<!-- 在元素標簽中,style屬性代表級聯(lián)樣式類型中的【內(nèi)嵌式樣式】 -->
<div class="circle"
style="width: 200px;
background-color: skyblue !important; /* 內(nèi)嵌式樣式的背景顏色為【天空藍】 */
height: 200px;border: 5px blue dashed;
border-radius: 110px">
</div>
<script>
</script>
</body>
</html>
注:IE6瀏覽器不支持【 !important 關(guān)鍵字 】
【外聯(lián)式樣式】的 CSS.css 文件內(nèi)容如下:
/* 外聯(lián)式樣式中,背景顏色為【深粉色】 */
.circle {
background-color: deeppink !important;
}
頁面效果展示:

我們來標記一下三個樣式級別在頁面中圓形的CSS背景顏色:
- 內(nèi)嵌式樣式: 天空藍
- 內(nèi)聯(lián)式樣式: 黃綠色
- 外聯(lián)式樣式: 深粉色
所以這邊展示后得到的結(jié)果說明最高級別的樣式為: 【 內(nèi)嵌式樣式 】
【級聯(lián)樣式優(yōu)先級順序】測試結(jié)果如下圖所示:

五、總結(jié)
實際上,動態(tài)綁定style的優(yōu)先級是大于對style樣式進行修改的
這邊項目上有時候代碼多了,可能忘了某個樣式動態(tài)綁定過就給它通過style修改了樣式
發(fā)現(xiàn)不生效,這時候排查問題就會發(fā)現(xiàn)它已經(jīng)有動態(tài)綁定的值了
所以才寫了這篇來加深記憶和幫助一下遇到同樣問題的朋友
到此這篇關(guān)于Vue3中動態(tài)修改樣式與級聯(lián)樣式優(yōu)先順序的文章就介紹到這了,更多相關(guān)Vue3動態(tài)修改樣式與級聯(lián)樣式優(yōu)先順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用element-ui table expand展開行實現(xiàn)手風琴效果
這篇文章主要介紹了使用element-ui table expand展開行實現(xiàn)手風琴效果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03
vue導出excel和echart圖形分別在不同工作表的實現(xiàn)方法
這篇文章主要給大家介紹了如何使用vue實現(xiàn)導出excel和echart圖形分別在不同工作表,文中有詳細的代碼示例供大家參考,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2023-10-10
cesium開發(fā)之如何在vue項目中使用cesium,使用離線地圖資源
這篇文章主要介紹了cesium開發(fā)之如何在vue項目中使用cesium,使用離線地圖資源問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Vue中登錄驗證成功后保存token,并每次請求攜帶并驗證token操作
這篇文章主要介紹了Vue中登錄驗證成功后保存token,并每次請求攜帶并驗證token操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

