Vue下是如何實現CSS私有作用域的

2021-09-22 06:23:52 字數 1302 閱讀 8557

在web開發中,css是乙個利器,它可以使得我們的頁面更加炫酷華麗,但是在好用的前提下它也給迭代開發帶來了一定的麻煩,比如樣式相互覆蓋或者樣式影響到了未考慮的元素等,所以css的私有化就顯得很有必要了。

但從嚴格意義上來說,css樣式都是全域性的,並不存在私有作用域這一說法,所以我們會通過各種各樣的方式來模擬實現css的私有化。其中大部分都說基於bem思想來實現的。

css私有化的實現原則是匹配規則盡可能精確。比如通過全域性唯一的id來匹配或通過全域性唯一的class來匹配,如每乙個需要賦予樣式的元素都新增乙個獨一無二的類名,然後只通過類名來書寫樣式,避免使用萬用字元、標籤選擇器和後代選擇器等。

在css私有化領域中非常出名的是bem(block element modifier)命名規則,它的主要思想是:

只通過  塊__元素--修飾符  來定義規則

bem的好處:清晰易懂,看到類名就知道作用是什麼,方便維護;

bem的缺點:醜、長(伺服器開啟gzip後會小一點);

簡單介紹bem後,我們再看看vue下的實現。在vue單檔案元件下,我們只需要在style標籤上新增scoped屬性就可以實現css私有化的功能,那麼它又是如何實現的呢?

未新增scoped屬性前

新增scoped屬性後

可以清楚看到,新增scoped後,vue-loader載入器會做兩個處理:

1、給html標籤新增data-v-hash屬性

2、給css樣式新增[data-v-hash]選擇器

這樣一來,css樣式就只對帶有相應data-v-hash的標籤起作用了,也就變現實現了css作用域的功能。

當然,在開發過程中,也會遇到父之間無法操作子元件樣式的問題(比如在自己的頁面上用了element-ui的el-button元件)

如果父元件加了scoped屬性,那麼所以規則都會自動在最後追加data-v-hash選擇器,自然找不到子元件的元素,此時我們需要把父元件的scoped去掉,或者使用深度作用選擇器

Vue下iframe如何實現和父視窗的通訊

在父視窗頁面 1 2dialog 3 title 4 visible.sync visible 5 width 30 6 class ifr dialog 7center 8 opened handleopened 910 1112 1314 15view code 在iframe頁面 hello,...

什麼是依賴注入,vue的依賴注入如何實現的

允許乙個祖先元件向其所有子孫後代注入乙個依賴,不論元件層次有多深 這也是使用 parent不好實現的地方 並在起上下游關係成立的時間裡始終生效。不用再關心dom層級,只要在祖先元件內部就可以一直使用祖先元件提供的provide provide 選項允許我們指定我們想要提供給後代元件的資料 方法。然後...

什麼是物件序列化 如何實現 什麼情況下使用

a 什麼是物件序列化 物件序列化可以將乙個物件儲存到乙個檔案,可以將通過流的方式在網路上傳輸,可以將檔案的內容讀取轉化為乙個物件。所謂物件流也就是將物件的內容流化,可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在物件流進行讀寫操作時引發的問題。b 序列化的實現 將...