1. 程式人生 > 實用技巧 >【咕笛說vue】把“樣式穿透”原理和方法說透

【咕笛說vue】把“樣式穿透”原理和方法說透

當我們在vue專案中引用到第三方元件時,比如element-ui,常常需要更改某些元素的樣式,但如果使用常規的css樣式覆蓋的方式是經常無效的,那麼我們就要用到“樣式穿透”的方法。這一節咕笛老師來詳細講解一下這個魔改樣式的大殺招~

在一個元件中,我們定義元件樣式一般寫在頁面的最下方,以style包裹

CSS
<style>
    .div{
        
    }
</style>

為了不汙染全域性樣式,我們在style上加一個scoped修飾符,這個樣式就只在當前元件的範圍內有效

CSS
<style scoped>
    .div{
        
    }
</style>

但這是如何作到在當前元件範圍內有效的呢?我們開啟F12,檢視一下元素的DOM結構就可以看出端倪:

在每個dom元素上,有一個data-v-xxxxxxxx的識別符號,這個識別符號就是保證scoped有效的根本!我們定位到button上,檢視css樣式:

我們看到元素後面被加上了[data-v-xxxxxxxx]屬性,這也就是CSS的屬性選擇器,只有擁有這個屬性的元素或類才會應用此樣式。每個元件下[data-v-xxxxxxxx]這個id值是一致的,所以限制了其作用範圍。

這個方法是基於PostCss的,關於PostCss可以看其官網的介紹,這裡就不多講了。PostCss官網->

清楚了這個原理之後,我們就可以解釋為什麼很多第三方元件引入進來,通過常規的css樣式覆蓋是無效的,因為該元件是scoped,父元件是觸及不到其內部的樣式的!

那我們要是必須要改變第三方元件的樣式要怎麼辦呢?這裡就要說“樣式穿透”的方法了。

所謂樣式穿透,就是在父級元件中強制去修改子級元件的內部樣式,注意這裡的父子層次並不一定是一級,可能是很多級。

具體要怎麼作呢?按不同的css的渲染器寫法也是不同的。

普通的css語法: 在要修改的樣式前新增>>>符號

CSS
.wrapper >>> .el-card__header{
    border:none;
}

scss語法: 在要修改的樣式前新增 ::v-deep

CSS
::v-deep .el-card__header{
    border:none;
}

sass語法/less語法 :在要修改的樣式前新增 /deep/

CSS
.wrap /deep/ .el-card__header{

    border:none;
}

為啥要有這三種不同的寫法??因為不同的編譯解析器識別的語法不同,寫錯會報錯。

好了,這一節內容就講到這裡,特別提醒一下,樣式穿透在vue開發中使用的會比較頻繁,但是要注意作用範圍,最好避免全域性下樣式穿透修改元件樣式。

原文轉自:http://www.gudi.tech/post/15.html