樣式穿透vue中的scoped詳談
前言
我們平常在開(kāi)發(fā)過(guò)程中特別是Vue技術(shù)棧的前端同學(xué)們,經(jīng)常會(huì)用到一些UI組件庫(kù),特別是element-ui使用的頻率是比較高的,我們經(jīng)常會(huì)修改這些UI組件庫(kù)的默認(rèn)樣式時(shí)會(huì)使用到深度選擇器,大家都知道這么做,有沒(méi)有想過(guò)為什么?趁著疫情在家于是研究了一下,在這里分享一下
scoped的使命與作用
這里用vue做了一個(gè)demo,兩個(gè)頁(yè)面,一個(gè)頁(yè)面中是掘金的a標(biāo)簽,一個(gè)頁(yè)面是vue的a標(biāo)簽,我們一起看下scoped的作用,給其中一個(gè)頁(yè)面的a標(biāo)簽加上紅色,另外一個(gè)沒(méi)有加任何樣式,并且沒(méi)有在style中使用scoped,如下圖

答案大家應(yīng)該都知道,沒(méi)錯(cuò)!兩個(gè)頁(yè)面中的鏈接文字都變成了紅色,當(dāng)我們點(diǎn)擊juejin這個(gè)頁(yè)面的時(shí)候,瀏覽器會(huì)自動(dòng)引入當(dāng)前頁(yè)面的樣式,再去點(diǎn)擊github時(shí)瀏覽器會(huì)復(fù)用這個(gè)樣式,所以a鏈接的顏色都會(huì)變紅,因?yàn)閂ue是單頁(yè)面應(yīng)用,所以我們打開(kāi)的每一個(gè)頁(yè)面的樣式都會(huì)被夾在成全局的樣式,解決辦法就是加上scoped,這時(shí)a標(biāo)簽的顏色就不同了,我們打開(kāi)頁(yè)面看下a標(biāo)簽(下圖)

這時(shí)候的a標(biāo)簽多了一個(gè)data-v-xxxxxxx這個(gè)東西,這個(gè)就是Vue替我們加上的, Vue在構(gòu)建構(gòu)建這個(gè)項(xiàng)目的時(shí)候會(huì)提我們以組件單位,不同的組件下所有的元素都會(huì)加上同一個(gè)類似組件ID的東西,同時(shí)會(huì)在我們寫的樣式上以屬性選擇器的方式拼接上這個(gè)唯一標(biāo)識(shí),我們來(lái)驗(yàn)證一下,(下圖)

對(duì)的,我們加上scoped之后Vue會(huì)在這段樣式的最后一段加上這個(gè)屬性,然后通過(guò)屬性選擇器選中這個(gè)元素,從而實(shí)現(xiàn)元素樣式的隔離,接下來(lái)我們一起看下scoped的副作用
scoped的副作用
這時(shí)我們引入element-ui驗(yàn)證一下scoped的副作用,這里寫了一個(gè)demo(下圖),這里也使用了scoped

我們檢查一下元素(下圖)

注意這里的input元素是沒(méi)有例如data-v-xxxxxx的唯一標(biāo)識(shí)的但是我們自己寫的樣式(my-Txt input)在被構(gòu)建之后是什么樣子的呢?(下圖)

如上圖所示,我們自己寫的樣式卻被拼接了這個(gè)唯一的標(biāo)識(shí),所以我們?cè)僭趺床僮饕彩菦](méi)法命中這個(gè)元素的,也就是說(shuō)Vue并沒(méi)有給這個(gè)input加上這個(gè)標(biāo)識(shí),但是卻在我們的樣式中加上了這個(gè)標(biāo)識(shí),但是我們?nèi)绻裺coped去掉,那么就能命中目標(biāo),但是這樣我們是不推薦的,樣式會(huì)被打包到統(tǒng)一的樣式中,這就是scoped的副作用,那我們?cè)趺唇鉀Q它呢?樣式穿透
樣式穿透(::v-deep)
我們現(xiàn)在就加上樣式穿透就可以命中目標(biāo)
<style scoped>
.my-Txt {
width: 200px;
}
.my-Txt ::v-deep input {
background-color: pink;
}
</style>這時(shí)候我們看下構(gòu)建后的樣式Vue會(huì)怎么處理(下圖)

我們可以看到這個(gè)唯一標(biāo)識(shí)從input后面跑到了my-Txt的后面了,也就是說(shuō)我們不加入這個(gè)::v-deep,Vue永遠(yuǎn)都會(huì)把這個(gè)唯一的標(biāo)識(shí)拼接在我們寫的樣式的最后一段,如果我們想改變這個(gè)唯一標(biāo)識(shí)的位置,就需要你用樣式穿透來(lái)指定,那么上圖的意思就是帶有這個(gè)唯一標(biāo)識(shí)的my-Txt的元素,它的子元素中的input會(huì)應(yīng)用這個(gè)樣式,而我們寫的這個(gè)my-Txt也是具備這個(gè)唯一標(biāo)識(shí)的,從上面圖可以看到
總結(jié)
為了解決多頁(yè)面應(yīng)用中不同組件中的樣式隔離問(wèn)題,Vue引入了scoped樣式的概念,但是Vue不會(huì)把所有的元素都加上唯一標(biāo)識(shí),導(dǎo)致我們沒(méi)辦法命中這個(gè)元素的時(shí)候,我們就要用樣式穿透來(lái)指定這個(gè)唯一辨識(shí)被拼接到css樣式的哪一段!??!
以上就是樣式穿透vue中的scoped的詳細(xì)內(nèi)容,更多關(guān)于vue scoped樣式穿透的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue 框架之動(dòng)態(tài)綁定 css 樣式實(shí)例分析
這篇文章主要介紹了Vue 框架之動(dòng)態(tài)綁定 css 樣式的方法,本文通過(guò)分享小實(shí)例給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
使用vue引入maptalks地圖及聚合效果的實(shí)現(xiàn)
這篇文章主要介紹了使用vue引入maptalks地圖及聚合效果的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
vue組件傳遞對(duì)象中實(shí)現(xiàn)單向綁定的示例
下面小編就為大家分享一篇vue組件傳遞對(duì)象中實(shí)現(xiàn)單向綁定的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Vue組件庫(kù)ElementUI實(shí)現(xiàn)表格加載樹(shù)形數(shù)據(jù)教程
這篇文章主要為大家詳細(xì)介紹了Vue組件庫(kù)ElementUI實(shí)現(xiàn)表格加載樹(shù)形數(shù)據(jù)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
vue中el-table和jsplumb實(shí)現(xiàn)連線功能
本文主要介紹了el-table和jsplumb實(shí)現(xiàn)連線功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作教程
在Vue中可以使用異步函數(shù)和await關(guān)鍵字來(lái)控制上一步執(zhí)行完再執(zhí)行下一步,這篇文章主要給大家介紹了關(guān)于vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作的相關(guān)資料,需要的朋友可以參考下2023-12-12
Vue-cli proxyTable 解決開(kāi)發(fā)環(huán)境的跨域問(wèn)題詳解
本篇文章主要介紹了Vue-cli proxyTable 解決開(kāi)發(fā)環(huán)境的跨域問(wèn)題詳解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
關(guān)于iview和elementUI組件樣式覆蓋無(wú)效問(wèn)題及解決
這篇文章主要介紹了關(guān)于iview和elementUI組件樣式覆蓋無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue項(xiàng)目中實(shí)現(xiàn)的微信分享功能示例
這篇文章主要介紹了vue項(xiàng)目中實(shí)現(xiàn)的微信分享功能,結(jié)合實(shí)例形式分析了基于vue.js實(shí)現(xiàn)的微信分享功能具體定義與使用方法,需要的朋友可以參考下2019-01-01

