精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何優雅地覆蓋組件庫樣式?

開發 前端
本文通過如何修改UI組件內部樣式為切入點,分析了幾種解法。了解了組合選擇器的優先級分數累加,以及在實際React、Vue項目用到的樣式隔離方案——CSS Module和Scoped的原理,最后是介紹了在樣式隔離的情況下,如何使用:global和深度作用選擇器做樣式覆蓋。

大家好,我是年年!組件庫的樣式覆蓋不掉,這應該是很多前端在工作中遇到過的問題。今天從實際案例出發分析原因,最后會給出在React和Vue項目中的最優解。

本文會講清:

  • React中CSS Module的原理是什么?:global是做什么的?
  • Vue中Scoped的原理是什么?深度作用選擇器是什么?

先不講概念,直接從需求出發:我使用了Antd組件庫來展示一個日歷。

現在我想將當前日期上面的藍色邊框變成紫色。

可以試試你能不能實現。

不管是React還是Vue,整個Calendar是被封裝起來的,我們沒有辦法在組件外簡單加上style/class改動內部的樣式。

import { Calendar } from 'antd';
...
<div className="myWrapper">
<Calendar class="custom"/>
</div>

定位要覆蓋的樣式

首先用開發者工具定位對應的樣式:.ant-picker-calendar-date-today,這就是我們要修改的地方。

.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {
border-color: #1890ff;
}

熟悉webpack的人應該知道,引入的CSS文件最終都會被style-loader處理。簡單來說,它的作用就是把CSS文件打包,放在style標簽內,最后塞進HTML中作為一個內部樣式表。不管是組件庫的樣式還是我們寫的自定義樣式都是這樣處理的。

我們要把組件庫的樣式先于自定義樣式引入,這樣自定義樣式才能有更高的優先級。

修改源文件

直接改組件庫的CSS源碼是最簡單粗暴的方法。打開你項目的node_modules文件夾,一層層點開,找到對應樣式文件,按照需求修改即可。

個人項目這樣處理確實可行,但是團隊合作時,同步別人本地的node_modules就比較麻煩,只能算一個60分解法。

全局CSS文件

之前提到,把自己寫的的CSS文件放在組件庫的樣式后面,可以保障自定義有更高優先級。只要重寫同名的樣式,理論上就能實現覆蓋組了。

但這樣??處理會發現并不起作用:

/* src/demo.css */
.ant-picker-calendar-date-today {
border-color: purple; /* 覆蓋為紫色 */
}
// src/Demo.js

// 組件庫的樣式
import 'ant-design-vue/dist/antd.css';
// 自定義樣式
import './demo.css'
import { Calendar } from 'antd';
...
<div className="myWrapper">
<Calendar />
</div>
...

...

因為這里還涉及CSS組合選擇器的優先級。

基礎的優先級應該不用贅述:!important>內聯樣式>ID選擇器>類選擇器>標簽選擇器。(!important這種hack會導致項目不好維護,不提倡使用)

在這個基礎上還有五種組合選擇器要對優先級分數做累計,以類選擇器為例:

  • 后代選擇器(空格):.A .B,選擇.A元素后的所有.B元素,
  • 子元素選擇器(大于號):.A>.B,選擇.A元素的直接后代中的.B元素
  • 相鄰兄弟選擇器(加號):.A+.B,選擇.A元素后緊鄰的第一個兄弟.B元素
  • 后續兄弟選擇器(~號):.A~.B,選擇.A元素后所有的兄弟.B元素
  • 交集選擇器(連在一起):.A.B選擇自身同時擁有.A和.B兩個屬性的元素

上面幾個規則看著很復雜,其實用的多的就是第一個后代選擇器,記住它就行。Antd組件庫用的就是它:

.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {
border-color: #1890ff;
}

如果說一個類選擇器優先級分數是10分,那三個形成的后代選擇器就是30分。

而自定義的樣式??只有10分,所以即使放在更后面引入,也不能成功覆蓋。

.ant-picker-calendar-date-today {
border-color: purple; // 覆蓋為紫色
}

需要完整重寫整個選擇器才能實現想要的效果。

這里補充一點,同樣也是組合選擇器,但并集選擇器(逗號)優先級不累計:.A, .B,選擇.A或者.B元素(可以是逗號+空格)

樣式隔離CSS Module和Scoped

上面我們引入自定義的全局CSS文件,實現了樣式的覆蓋,但是這種解法只能給80分。因為在實際工作中,項目Owner通常不允許使用全局CSS,這會造成樣式污染:你定義了一個樣式my_button,團隊其他人恰巧也命名為my_button,這就造成樣式沖突。

我們需要給每個文件做樣式隔離,就好像是給它一個命名空間。通常使React項目使用的是用的是CSS Module,Vue項目使用Scoped標記。

接下來會講清兩種樣式隔離的原理,以及使用樣式隔離時怎么覆蓋組件庫的樣式。

React的CSS Module

首先來了解一下CSS Module的原理。它的使用很簡單,在CSS文件加一個后綴.module,然后當做一個變量引入到JS文件中。

// src/Demo.js
import styles from './demo.module.css';
export default function Demo() {
return (
<div className={styles.myWrapper}>
<Calendar />
</div>
);
}
/* src/demo.module.css */
.myWrapper {
border: 5px solid black;
}

被編譯后??,插入的樣式表和元素的class屬性都會加上一個哈希值作為命名空間。

<style>
.demo_myWrapper__Hd9Qg {
border: 5px solid black;
}
</style>
<div class="demo_myWrapper__Hd9Qg">
...
</div>

可以看到,原本的CSS選擇器和HTML元素類名都從myWrapper變成了demo_myWrapper__Hd9Qg,前面加上了文件名,后面加上了哈希值,這樣就能保障樣式只在當前這個文件下生效了。

但是在這種樣式隔離情況下,我們原本用作覆蓋的CSS也被加上了哈希值,就像下圖這樣,這時沒有辦法選中UI組件,覆蓋也就不會成功。

所以,React給我們提供了一個語法:global。它生效范圍內的樣式會被當作全局CSS。

具體使用如下,在CSS文件中,使用:global包裹希望全局生效的樣式

:global(.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today) {
border-color:purple; /* 覆蓋為紫色 */
}

SCSS或SASS中,還可以使用嵌套語法:

:global {
.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {
border-color:purple;
}
}

最后編譯出來的代碼如下:

/* 加上了哈希*/
.demo_myWrapper__Hd9Qg {
border: 5px solid black;
}
/* :global作用域下都不會加上哈希*/
.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {
border-color:purple;
}

借助:global語法,即使使用CSS Module進行樣式隔離也可以如愿實現覆蓋功能。

Vue中的Scoped

Vue中也有類似的樣式隔離功能,使用Scoped標記CSS部分,使用也很簡單??:

<style scoped>
.myWrapper{
border: 5px solid black
}
</style>
...
<div class="myWrapper" >
<Calendar />
</div>
...

編譯出來的代碼如下??:

<style>
.myWrapper[data-v-2fc5154c] {
border: 5px solid black
}
</style>
<div class="myWrapper" data-v-2fc5154c>
...
</div>

可以看到,它的原理和CSS Module不太一樣,Vue的Scoped會使CSS選擇器后加上一個中括號。

這并不是Vue獨創的語法,而是屬性選擇器。.myWrapper[data-v-2fc5154c]代表選擇擁有data-v-2fc5154c這個屬性的、同時是myButton類的HTML元素。只有這個文件內部的HTML元素才會被打上data-v-2fc5154c這個屬性。其余文件的HTML元素即使是myWrapper類,這個樣式也不會對他生效。

回到相同的問題,假如Vue項目在使用了Scoped做樣式隔離,我們用于覆蓋的樣式也會加上屬性選擇器,但是UI組件內部的HTML元素都沒有該屬性??。

所以Vue提供了一個類似的語法:深度作用選擇器。

使用很簡單,把要“滲透“進組件內部的樣式前面加上>>>,作用域內的CSS樣式都不會帶上哈希值作為屬性選擇器。

<style scoped>
.myWrapper>>>
.ant-picker-calendar-full
.ant-picker-panel
.ant-picker-calendar-date-today{
border-color:purple
}
</style>
<template>
<div class="myWrapper" >
<Calendar />
</div>
</template>

編譯后??

<style>
.myWrapper[data-v-2fc5154c]
.ant-picker-calendar-full
.ant-picker-panel
/* 作用域內的CSS都沒有帶上屬性選擇器 */
.ant-picker-calendar-date-today {
border-color:purple
}
</style>

<div class="myWrapper" data-v-2fc5154c>
<div class="ant-picker-calendar-full" data-v-2fc5154c>
<div class="ant-picker-date-panel">
<td class="ant-picker-cell-today"></td>
</div>
</div>
</div>

借助深度作用選擇器,可以將要用于覆蓋CSS“滲透”進組件內部。

也可以將>>>寫成/deep/或者::v-deep。

相較于React的:global,Vue的深度作用選擇器是一種更優秀的方案,它必須要一個前導(也就是上面例子中的.myWrapper選擇器),前導依舊會被打上哈希值作為屬性選擇器,要滲透進去的樣式實際上是作為它的子選擇器,只在當前這個文件下生效,徹底避免造成全局污染。

結語

本文通過如何修改UI組件內部樣式為切入點,分析了幾種解法。了解了組合選擇器的優先級分數累加,以及在實際React、Vue項目用到的樣式隔離方案——CSS Module和Scoped的原理,最后是介紹了在樣式隔離的情況下,如何使用:global和深度作用選擇器做樣式覆蓋。

責任編輯:武曉燕 來源: 前端私教年年
相關推薦

2021-03-24 10:20:50

Fonts前端代碼

2024-11-13 16:37:00

Java線程池

2021-01-18 13:17:04

鴻蒙HarmonyOSAPP

2020-03-26 11:04:00

Linux命令光標

2021-05-12 22:07:43

并發編排任務

2021-01-28 14:53:19

PHP編碼開發

2022-05-24 06:07:48

JShack用戶代碼

2024-04-24 12:34:08

Spring事務編程

2021-09-08 08:34:37

Go 文檔Goland

2020-12-08 08:08:51

Java接口數據

2020-10-22 10:15:33

優化Windows電腦

2018-08-20 10:40:09

Redis位圖操作

2023-02-13 14:37:13

開發web瀏覽器

2020-09-25 11:30:20

Java判空代碼

2020-11-06 08:13:03

服務器Nodejs客戶端

2021-03-26 20:37:14

Prometheus監控指標

2020-07-09 10:15:55

空值Bug語言

2017-12-14 14:17:08

Windows使用技巧手冊

2020-04-10 10:22:12

Java判空編程語言

2020-02-05 14:05:21

Java技術數組
點贊
收藏

51CTO技術棧公眾號

亚洲天堂av综合网| 色综合天天做天天爱| 96pao国产成视频永久免费| 国产女人被狂躁到高潮小说| 都市激情亚洲欧美| 色婷婷av一区二区三区gif| 亚洲精品在线免费看| 国产精品一区二区黑人巨大| 亚洲区第一页| 国产一区二区三区在线看| 亚洲国产欧美91| 绿色成人影院| 亚洲女人的天堂| 欧洲在线视频一区| 性生交大片免费看女人按摩| 久久不射网站| 欧美国产视频一区二区| 亚洲成人黄色av| 91精品短视频| 在线不卡免费欧美| wwwxxx黄色片| av电影院在线看| 国产精品美女久久久久久久久久久 | 欧美午夜片欧美片在线观看| 日本免费在线视频观看| 头脑特工队2在线播放| 国产在线播放一区| 国产精品久久精品| 四虎精品永久在线| 国产综合网站| 久久久精品视频成人| 亚洲欧美va天堂人熟伦 | 精品一二三四在线| 日本久久久a级免费| 日本少妇吞精囗交| 午夜精品影院| 欧美美最猛性xxxxxx| 日日操免费视频| 九色精品国产蝌蚪| 国产视频精品久久久| 免费高清视频在线观看| 国产精一区二区| 欧美日韩精品欧美日韩精品一| 黄色动漫在线免费看| 国内高清免费在线视频| 亚洲精品综合在线| 2021国产视频| 黄色视屏免费在线观看| 国产精品久久午夜夜伦鲁鲁| 日本一区二区视频| 精品欧美不卡一区二区在线观看 | 精品久久国产字幕高潮| 日日夜夜精品视频免费观看 | 欧美日本在线看| 国产一二三区av| 国产亚洲精品精品国产亚洲综合| 色94色欧美sute亚洲线路一久| 男人天堂1024| 欧美大片免费| 色视频成人在线观看免| 男人搞女人网站| 欧美a视频在线| 91精品国产手机| 国产黄色一区二区三区| 中文字幕日韩在线| 亚洲国产一区二区三区四区| 成人手机在线免费视频| 夜夜春成人影院| 亚洲午夜激情免费视频| 国产极品视频在线观看| 午夜激情久久| 久久99国产综合精品女同| 国产一级中文字幕| 国产欧美日本| 国产精品爱啪在线线免费观看| 一区两区小视频| 国产一区二区三区美女| 国产精品jizz视频| 日本人妖在线| 国产精品国产三级国产有无不卡| 欧美爱爱视频网站| 牛牛电影国产一区二区| 大桥未久av一区二区三区| 激情婷婷综合网| 伊人久久大香| 亚洲国产一区自拍| 免费看黄色av| 影音先锋日韩在线| 91高清视频免费| 中文字幕av网站| 国产成人午夜精品影院观看视频| 国产一区二区视频在线免费观看| 国产污视频在线| 亚洲精品亚洲人成人网| 国产精品333| 日韩精品一页| 精品国产99国产精品| 波多野吉衣中文字幕| 99久久夜色精品国产亚洲狼| 久久久久五月天| 亚洲天堂五月天| 懂色中文一区二区在线播放| 欧美日韩精品免费看| 成人免费网站在线观看视频| 天天做天天摸天天爽国产一区| 日本www.色| 精品国产乱码久久久久久樱花| 亚洲成人av中文字幕| 亚洲高潮女人毛茸茸| 欧美网站在线| 国产精品免费在线免费| 亚洲成a人片77777精品| 国产丝袜欧美中文另类| 久久艹国产精品| 国内欧美日韩| 日韩精品亚洲精品| 劲爆欧美第一页| 久久成人av少妇免费| 黑人中文字幕一区二区三区| 久草免费在线| 欧美在线看片a免费观看| 在线精品视频播放| 亚洲破处大片| 国产欧美婷婷中文| 欧美成人综合在线| 亚洲高清在线视频| 操人视频免费看| 日韩欧美高清| 国产精彩精品视频| 香蕉视频黄色片| 亚洲一二三四在线观看| 中文字幕一区二区在线观看视频 | 日本免费一区二区视频| 中文精品99久久国产香蕉| 男人日女人网站| 91在线观看污| 午夜免费福利小电影| 91大神精品| 欧美日本在线视频中文字字幕| 久久久久精彩视频| 国产色91在线| 亚洲欧美另类动漫| 九色精品91| 国产97在线|亚洲| 三级在线电影| 精品久久久久久久久中文字幕| 中文字幕一二三| 性xxxx欧美老肥妇牲乱| 国产自摸综合网| 97视频在线观看网站| 欧美私模裸体表演在线观看| 人妻大战黑人白浆狂泄| 亚洲欧美清纯在线制服| 欧美极品日韩| 成人自拍视频网| 中文字幕亚洲欧美日韩2019| 中文字幕 日韩有码| 欧美激情自拍偷拍| 欧美成年人视频在线观看| 清纯唯美亚洲综合一区| 国产欧美一区二区三区在线| 日本在线人成| 国产人与禽zoz0性伦| 欧美天天视频| 国产精品久久国产三级国电话系列| a级网站在线播放| 欧美一级日韩不卡播放免费| 伊人在线视频观看| 高清在线成人网| 无码专区aaaaaa免费视频| 天堂俺去俺来也www久久婷婷| 欧美在线观看日本一区| 成人在线视频成人| 91精品国产麻豆| 国产网站在线看| 97久久超碰国产精品| 波多野结衣作品集| 亚州av乱码久久精品蜜桃| 亚洲一区二区在线| 国模雨婷捆绑高清在线| 亚洲欧美成人精品| 一级aaaa毛片| 亚洲一区二区视频在线| 国产精品无码午夜福利| 久久国产精品99久久人人澡| a级片一区二区| 日韩超碰人人爽人人做人人添| 国产精品扒开腿爽爽爽视频 | 99精品视频在线播放观看| 国产精品少妇在线视频| 久久久精品久久久久久96| 国产亚洲精品美女久久久m| 日韩久久一区二区三区| 欧美另类老女人| 久久久久久青草| 欧美一区二区私人影院日本| 久久精品一二区| 国产精品理伦片| 久久偷拍免费视频| 国产资源在线一区| 日韩视频第二页| 久久久久久免费视频| 久久大香伊蕉在人线观看热2| 日韩精品第二页| 欧美在线激情网| 特级毛片在线| 国产一区二区三区丝袜| 秋霞视频一区二区| 欧美喷潮久久久xxxxx| 日韩久久精品视频| 中文字幕在线播放不卡一区| 亚洲中文字幕一区| 激情文学综合丁香| 久久久久久久少妇| 亚洲人妖在线| 亚洲激情免费视频| 精品国产午夜| 蜜桃成人在线| 亚州一区二区| 国产乱人伦真实精品视频| 性爽视频在线| 国内自拍欧美激情| av网址在线看| 中文字幕亚洲专区| 日韩一区二区三区中文字幕| 日韩欧美一区中文| 国产精品无码在线播放| 欧美亚洲图片小说| 丁香六月婷婷综合| 精品电影在线观看| 久久久久久激情| 亚洲人成伊人成综合网小说| 欧美极品jizzhd欧美18| 久久久久久久性| 熟妇高潮精品一区二区三区| 粉嫩欧美一区二区三区高清影视| 爱情岛论坛亚洲自拍| 久久国产生活片100| 成年人在线观看视频免费| 国产日韩1区| 欧美午夜小视频| 亚洲手机视频| 国产免费黄色一级片| 欧美日韩蜜桃| 男女激情免费视频| 亚洲黄色影片| 九九爱精品视频| 亚洲精品视频啊美女在线直播| 女人被男人躁得好爽免费视频| 欧美婷婷在线| 国产欧美日韩网站| 在线成人h网| 欧美精品一区二区三区三州| 亚洲精品免费观看| 免费看国产曰批40分钟| 一本色道久久精品| 免费欧美一级视频| 噜噜噜在线观看免费视频日韩| 91猫先生在线| 日韩国产精品久久久| 亚洲欧美自偷自拍另类| 久久99精品一区二区三区| 久久精品亚洲天堂| 大美女一区二区三区| 色婷婷精品久久二区二区密| 99re这里只有精品视频首页| 久久久久亚洲av无码专区桃色| 国产欧美一区二区精品婷婷| 大吊一区二区三区| 亚洲免费观看高清完整版在线| 久久久久久久久久久97| 午夜精品久久一牛影视| 久久久蜜桃一区二区| 精品视频一区二区不卡| 国产深喉视频一区二区| 精品成人佐山爱一区二区| 天天干天天草天天射| 国产性猛交xxxx免费看久久| 日本在线看片免费人成视1000| 久久五月天综合| 女海盗2成人h版中文字幕| 日韩av黄色在线观看| 欧美日韩视频免费看| 99在线首页视频| 少妇一区二区视频| 在线视频一二三区| 一本色道久久综合| 手机免费av片| 99久久久免费精品国产一区二区 | 亚洲欧美视频在线观看视频| 国产亚洲第一页| 日本道精品一区二区三区| 国产精品欧美综合亚洲| 日韩高清中文字幕| 日本视频不卡| 欧美性做爰毛片| 国产一区精品二区| 免费观看成人在线| 亚洲先锋影音| 日本va中文字幕| 成人av在线观| 中文字幕资源站| 欧美视频一二三| 99久久国产免费| 尤物九九久久国产精品的特点| 免费电影视频在线看| 国产精品日韩精品| 美女福利一区| av中文字幕av| 免费人成黄页网站在线一区二区| 无码av免费精品一区二区三区| 国产精品欧美极品| 日韩一区二区视频在线| 日韩欧美中文字幕一区| 啊v视频在线| 日韩av免费在线播放| 国产人妖ts一区二区| 99热一区二区三区| 青青青伊人色综合久久| 亚洲黄色在线网站| 亚洲一二三区在线观看| 国产色在线视频| 色狠狠久久aa北条麻妃| 激情开心成人网| 激情欧美一区二区三区中文字幕| 中文字幕一区二区三区欧美日韩| 国产精品天天av精麻传媒| 99国产精品国产精品毛片| 免费在线看黄网址| 666欧美在线视频| 91亚洲欧美| 国产精品福利久久久| 一本色道久久综合亚洲精品酒店 | 日韩va亚洲va欧美va清高| 色88888久久久久久影院按摩| 亚洲三级黄色片| 韩国福利视频一区| 成人h动漫免费观看网站| 免费国产成人看片在线| 九九精品视频在线看| 亚洲黄色网址大全| 欧美乱妇15p| 日本中文字幕电影在线免费观看 | 欧美日韩成人在线观看| 免费看一区二区三区| 好吊色视频988gao在线观看| 国产在线精品一区二区夜色| 男人av资源站| 欧美二区三区的天堂| 成人日韩欧美| 成人国产一区二区| 亚洲福利免费| 久久久久国产精品无码免费看| 亚洲成人免费在线观看| 香蕉久久一区二区三区| 奇米成人av国产一区二区三区| 亚洲va久久| 午夜欧美福利视频| 国产精品全国免费观看高清| 97精品人妻一区二区三区| 理论片在线不卡免费观看| 日韩精品一区二区三区中文字幕| 日本高清视频免费在线观看| 国产99久久久国产精品潘金| 国产奶水涨喷在线播放| 日韩精品在线免费| 日本h片久久| 中文字幕乱码免费| 成人在线综合网| 在线视频一区二区三区四区| 亚洲天堂免费在线| 色狠狠一区二区三区| wwwjizzjizzcom| 91视频国产观看| 中文字幕你懂的| 欧美美女操人视频| 最新国产精品视频| 欧美女同在线观看| 一区二区三区在线观看国产| 天天操天天干天天爱| 国产精品美女久久久久久免费| 性欧美欧美巨大69| 国产又黄又粗又猛又爽的视频 | 91国内在线视频| 精品国产91久久久久久浪潮蜜月| 天堂av在线8| 午夜精品久久久久久久| 99青草视频在线播放视| 成人高清在线观看| 日韩黄色小视频| 精品无码人妻一区二区三| 亚洲欧美日韩在线高清直播| 国产精品18| 116极品美女午夜一级| 国产精品国产自产拍在线| 天天射天天操天天干| 成人精品久久一区二区三区| 亚洲看片一区| 欧美特黄一级片| 日韩激情第一页|