樣式穿透vue中的scoped詳談
前言
我們平常在開發(fā)過程中特別是Vue技術(shù)棧的前端同學(xué)們,經(jīng)常會用到一些UI組件庫,特別是element-ui使用的頻率是比較高的,我們經(jīng)常會修改這些UI組件庫的默認(rèn)樣式時會使用到深度選擇器,大家都知道這么做,有沒有想過為什么?趁著疫情在家于是研究了一下,在這里分享一下
scoped的使命與作用
這里用vue做了一個demo,兩個頁面,一個頁面中是掘金的a標(biāo)簽,一個頁面是vue的a標(biāo)簽,我們一起看下scoped的作用,給其中一個頁面的a標(biāo)簽加上紅色,另外一個沒有加任何樣式,并且沒有在style中使用scoped,如下圖
答案大家應(yīng)該都知道,沒錯!兩個頁面中的鏈接文字都變成了紅色,當(dāng)我們點擊juejin這個頁面的時候,瀏覽器會自動引入當(dāng)前頁面的樣式,再去點擊github時瀏覽器會復(fù)用這個樣式,所以a鏈接的顏色都會變紅,因為Vue是單頁面應(yīng)用,所以我們打開的每一個頁面的樣式都會被夾在成全局的樣式,解決辦法就是加上scoped,這時a標(biāo)簽的顏色就不同了,我們打開頁面看下a標(biāo)簽(下圖)
這時候的a標(biāo)簽多了一個data-v-xxxxxxx這個東西,這個就是Vue替我們加上的, Vue在構(gòu)建構(gòu)建這個項目的時候會提我們以組件單位,不同的組件下所有的元素都會加上同一個類似組件ID的東西,同時會在我們寫的樣式上以屬性選擇器的方式拼接上這個唯一標(biāo)識,我們來驗證一下,(下圖)
對的,我們加上scoped之后Vue會在這段樣式的最后一段加上這個屬性,然后通過屬性選擇器選中這個元素,從而實現(xiàn)元素樣式的隔離,接下來我們一起看下scoped的副作用
scoped的副作用
這時我們引入element-ui驗證一下scoped的副作用,這里寫了一個demo(下圖),這里也使用了scoped
我們檢查一下元素(下圖)
注意這里的input元素是沒有例如data-v-xxxxxx的唯一標(biāo)識的但是我們自己寫的樣式(my-Txt input)在被構(gòu)建之后是什么樣子的呢?(下圖)
如上圖所示,我們自己寫的樣式卻被拼接了這個唯一的標(biāo)識,所以我們再怎么操作也是沒法命中這個元素的,也就是說Vue并沒有給這個input加上這個標(biāo)識,但是卻在我們的樣式中加上了這個標(biāo)識,但是我們?nèi)绻裺coped去掉,那么就能命中目標(biāo),但是這樣我們是不推薦的,樣式會被打包到統(tǒng)一的樣式中,這就是scoped的副作用,那我們怎么解決它呢?樣式穿透
樣式穿透(::v-deep)
我們現(xiàn)在就加上樣式穿透就可以命中目標(biāo)
<style scoped> .my-Txt { width: 200px; } .my-Txt ::v-deep input { background-color: pink; } </style>
這時候我們看下構(gòu)建后的樣式Vue會怎么處理(下圖)
我們可以看到這個唯一標(biāo)識從input后面跑到了my-Txt的后面了,也就是說我們不加入這個::v-deep,Vue永遠(yuǎn)都會把這個唯一的標(biāo)識拼接在我們寫的樣式的最后一段,如果我們想改變這個唯一標(biāo)識的位置,就需要你用樣式穿透來指定,那么上圖的意思就是帶有這個唯一標(biāo)識的my-Txt的元素,它的子元素中的input會應(yīng)用這個樣式,而我們寫的這個my-Txt也是具備這個唯一標(biāo)識的,從上面圖可以看到
總結(jié)
為了解決多頁面應(yīng)用中不同組件中的樣式隔離問題,Vue引入了scoped樣式的概念,但是Vue不會把所有的元素都加上唯一標(biāo)識,導(dǎo)致我們沒辦法命中這個元素的時候,我們就要用樣式穿透來指定這個唯一辨識被拼接到css樣式的哪一段?。。?/p>
以上就是樣式穿透vue中的scoped的詳細(xì)內(nèi)容,更多關(guān)于vue scoped樣式穿透的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用vue引入maptalks地圖及聚合效果的實現(xiàn)
這篇文章主要介紹了使用vue引入maptalks地圖及聚合效果的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Vue組件庫ElementUI實現(xiàn)表格加載樹形數(shù)據(jù)教程
這篇文章主要為大家詳細(xì)介紹了Vue組件庫ElementUI實現(xiàn)表格加載樹形數(shù)據(jù)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06vue中el-table和jsplumb實現(xiàn)連線功能
本文主要介紹了el-table和jsplumb實現(xiàn)連線功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作教程
在Vue中可以使用異步函數(shù)和await關(guān)鍵字來控制上一步執(zhí)行完再執(zhí)行下一步,這篇文章主要給大家介紹了關(guān)于vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作的相關(guān)資料,需要的朋友可以參考下2023-12-12Vue-cli proxyTable 解決開發(fā)環(huán)境的跨域問題詳解
本篇文章主要介紹了Vue-cli proxyTable 解決開發(fā)環(huán)境的跨域問題詳解,非常具有實用價值,需要的朋友可以參考下2017-05-05關(guān)于iview和elementUI組件樣式覆蓋無效問題及解決
這篇文章主要介紹了關(guān)于iview和elementUI組件樣式覆蓋無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09