摘要:引言雖然現(xiàn)在與更流行,但使用它們會(huì)導(dǎo)致過分依賴濫用做唯一定位,違背了選擇器的初衷。本期精讀的文章是,帶你重新理解強(qiáng)大的選擇器。討論地址是精讀使用屬性選擇器如果你想?yún)⑴c討論,請點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。
1 引言
雖然現(xiàn)在 Css Module 與 Css-in-js 更流行,但使用它們會(huì)導(dǎo)致過分依賴 濫用 class 做唯一定位,違背了 Css 選擇器的初衷。
本期精讀的文章是:attribute-selectors-splicing-html-dna-css,帶你重新理解強(qiáng)大的 Css 選擇器。
2 概要Css Module 與 Css-in-js 大部分場景使用 className 作為選擇器,那么本文以選擇器為重點(diǎn),看看選擇器有哪些實(shí)用的用法。
屬性選擇器如果你想選擇包含 title 屬性的 div:
div[title]
選擇包含 title 屬性的子元素,只需要加個(gè)空格:
div [title]
選擇 title 內(nèi)容是 dna 的元素:
div[title="dna"]
選擇 title 屬性包含 dna 單詞的元素:
注意 dna 需要是單詞,也就是用空格分割,比如 “my beautiful dna” 或 “mutating dna is fun!”
div[title~="dna"]
和正則類似,選擇 title 屬性中,以 dna 結(jié)尾的元素:
div[title$="dna"]
以 dna 開頭:
div[title^="dna"]
如果希望選擇 dna 或 dna-zh,但不希望匹配 dnaer,可以:
這種場景一般用在國際化,比如 en en-us 就可以用 |="en"
div[title|="dna"]
只要包含 dna 這三個(gè)字符就選中:
div[title*="dna"]
真的很像正則,你可以用 i 標(biāo)識匹配時(shí)大小寫不敏感:
div[title*="dna" i]
如果你想找到一個(gè) a 標(biāo)簽,擁有 title 屬性并且 className 以 genes 結(jié)尾,可以這樣:
a[title][class$="genes"]獲取標(biāo)簽的值
可以用 attr 標(biāo)識符拿到當(dāng)前選擇器選中元素的屬性,比如當(dāng) hover 狀態(tài)時(shí),在文字尾部顯示其 title 屬性:
.joke:hover:after { content: "Answer:" attr(title); display: block; }其它用法
本文還介紹了一些實(shí)用技巧,比如
根據(jù)輸入框類型設(shè)置樣式
input[type="email"] { color: papayawhip; } input[type="tel"] { color: thistle; }
改變下載標(biāo)簽的 icon
a[download][href$="pdf"]:after { content: url(pdf-icon.svg); }
當(dāng)然也可以選中一些老代碼進(jìn)行樣式重寫,比如:
Old, holey genes
div[bgcolor="#000000"] { /*override*/ background-color: #222222 !important; }
不過這種用法要謹(jǐn)慎,寫的越多越難以維護(hù)。
結(jié)合一些新標(biāo)簽功能
比如 details 標(biāo)簽是 html 原生的手風(fēng)琴折疊組件:
List of Genes
Roddenberry Hackman
我們可以使用屬性選擇器,定義其打開時(shí)的樣式:
details[open] { background-color: hotpink; }
為沒有 async 標(biāo)記的 script 標(biāo)簽著色,算是友情提示哪兒有錯(cuò)誤:
script[src]:not([async]) { display: block; width: 100%; height: 1em; background-color: red; } script:after { content: attr(src); }
為 JS 事件著色,比如觸發(fā)的鼠標(biāo)事件可以作為選擇器:
[OnMouseOver] { color: burlywood; } [OnMouseOver]:after { content: "JS: " attr(OnMouseOver); }
選中隱藏元素:
[hidden], [type="hidden"] { display: block; }
還有更多就不一一列舉了,感興趣的讀者可以跳轉(zhuǎn)到原文繼續(xù)閱讀。大部分內(nèi)容其實(shí)都寫在了 w3school 選擇器參考手冊,只是結(jié)合一篇文章來讀,可以理解得更深刻,同時(shí)文章里確實(shí)有一些新鮮的選擇器,比如 JS 事件選擇器,HTML5 屬性標(biāo)簽選擇器等等。
3 精讀這篇文章確實(shí)說明了 Css 選擇器的強(qiáng)大性,但回到 css module 或者 css-in-js 的工程代碼里,我們往往難以做太多的實(shí)踐,有如下幾個(gè)原因:
一直在擔(dān)心的 DOM 結(jié)構(gòu)變動(dòng)業(yè)務(wù)開發(fā)中,大量需求涌入,也許過了一周,DOM 結(jié)構(gòu)就已經(jīng)面目全非了,而且就算是一個(gè)普通的圣杯布局,可能老版本用 Table 布局,后面進(jìn)來一個(gè)年輕小伙子直接用 div + flex 重構(gòu)了,你會(huì)擔(dān)心之前寫的 table 選擇器在某一天全部失效。
也許今天的 div 選擇器,明天因?yàn)檎Z義化改造就換成了 article 標(biāo)簽。
最大原因是 一種視覺界面對應(yīng)的實(shí)現(xiàn)方式太多,不僅標(biāo)簽可以各異,css 屬性還有 table、block、flex、grid 可選,同時(shí) grid 屬性還會(huì)導(dǎo)致視覺結(jié)構(gòu)與 DOM 結(jié)構(gòu)不完全對應(yīng)。
如果你今天用 css 選擇器做了一套完全貼合現(xiàn)在 DOM 結(jié)構(gòu)的 css 文件,這個(gè) css 文件也許是后面 dom 結(jié)構(gòu)改動(dòng)的噩夢。
你敢做全局樣式覆蓋嗎我們排除標(biāo)簽,僅對屬性做全局覆蓋,的確可以部分繞開 DOM 結(jié)構(gòu)的限制,但是這樣的全局樣式覆蓋,不同的人有不同看法。
小明的團(tuán)隊(duì)非常懂得 css 運(yùn)用,他們每天都會(huì)花一個(gè)小時(shí)討論項(xiàng)目的 css 架構(gòu),并對通用需求樣式做了抽象,并且每個(gè)人都很認(rèn)可這個(gè)方案,在他們的團(tuán)隊(duì),一個(gè)非常酷炫的按鈕與動(dòng)畫效果,通過 就可以完成,頁面間交互非常流暢,用戶體驗(yàn)統(tǒng)一,前端代碼也非常簡潔和優(yōu)雅。
小白的團(tuán)隊(duì)水平參差不齊,有人永遠(yuǎn)只使用 table 布局,有人卻總想將一些試驗(yàn)階段 css 屬性用在生產(chǎn)環(huán)境,小白自己抽象了一個(gè)全局樣式 css 文件,可團(tuán)隊(duì)沒什么時(shí)間溝通,甚至有人私下也注入了不少全局 css 樣式,總有人抱怨自己的樣式被全局覆蓋了,最后小白甚至不得不在自己頁面入口處寫上 *: unset 清空各種奇怪的全局樣式干擾,他想清空那該死的全局 css 樣式文件,但他知道這樣做帶來的是更大的災(zāi)難。
可以看到,并不是每個(gè)團(tuán)隊(duì)都適合做全局樣式覆蓋。
JS 模塊化思維的影響為什么一個(gè)項(xiàng)目安裝了幾百個(gè) npm 三方包,卻依然可以正常運(yùn)行?因?yàn)楹玫娜桨际亲袷啬K化的,同時(shí)也不產(chǎn)生副作用,這樣被使用時(shí)的效果就可以被預(yù)期,試想一下幾百個(gè) npm 包里同時(shí)定義了不同規(guī)范的全局 css 覆蓋,你的項(xiàng)目會(huì)成為什么樣。
當(dāng)然 js 與 css 是不適合放在一起比較的,css 大多是業(yè)務(wù)級別的,也就是能寫 css 只有做業(yè)務(wù)的你,第三方包一般是不會(huì)提供 css 定義干擾你的項(xiàng)目的。
然而大部分 UI 組件庫是自帶樣式的,他們有自己的設(shè)計(jì)哲學(xué),但為什么現(xiàn)在你會(huì)反感,而當(dāng)初使用 Bootstrap 不會(huì)?
使用 Bootstrap 的時(shí)代,Bootstrap 一般是作為項(xiàng)目第一個(gè)依賴安裝的,我們明確知道它會(huì)注入全局樣式。我們會(huì)泡在他的官方文檔目錄,一條條理解他做的全局樣式規(guī)則,他提供的各種 class。
然而現(xiàn)在是一個(gè) Css-in-js 的時(shí)代,或者至少是 css-in-npm 的時(shí)代,什么都用 npm 裝,什么都是模塊化的,很多時(shí)候我們用一個(gè) UI 組件僅僅是為了在某一處地方使用,而不想接受他帶來的全局樣式污染,視覺設(shè)計(jì)哲學(xué),更不想看他的 css 文檔。所以好的組件庫往往 css 使用的很收斂,盡量不要對用戶項(xiàng)目環(huán)境造成影響。
如果你項(xiàng)目的樣式已經(jīng)被不得不安裝的第三方包全局覆蓋得面目全非,每一次對全局樣式修改都如履薄冰,可能你會(huì)比較反感 css 選擇器,你會(huì)推崇更安全的 css modules,或甚至是 css-in-js,讓每個(gè)組件的 className 都唯一,做到標(biāo)簽粒度的隔離。
4 總結(jié)筆者認(rèn)為,在一個(gè)確定的環(huán)境中,比如一個(gè)組件,一個(gè)獨(dú)立負(fù)責(zé)的模塊,是比較適合用 css 選擇器的,這樣可以讓樣式代碼更易讀,DOM 結(jié)構(gòu)更清爽。但請一定注意作用域,如果不是大家一起達(dá)成的共識,最好不要放到全局樣式中。
就算項(xiàng)目的風(fēng)格非常明確,a 標(biāo)簽一定要用紅色,在把這條規(guī)則放到全局樣式之前,請思考一下,這樣會(huì)不會(huì)破壞了某個(gè)用 a 標(biāo)簽?zāi)M按鈕的組件庫的樣式?
css 屬性選擇器的強(qiáng)大功能,需要有良好的項(xiàng)目管理做支撐,或者通過技術(shù)手段比如 shadow dom 做支撐。不過 shadow dom 的支持程度 現(xiàn)在仍然很低,所以使用編譯工具做的隔離,在某種程度上模擬了 Css 選擇器,承擔(dān)了 Css 選擇器 + shadow dom 的功能。
一切樣式都用 className 控制,也許是 shadow dom 出來前的一種妥協(xié)方案,這篇文章更多是在描述 Css 選擇器設(shè)計(jì)之美,但需要我們理性去使用。
討論地址是:精讀《使用 CSS 屬性選擇器》 · Issue #113 · dt-fe/weekly
如果你想?yún)⑴c討論,請點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。前端精讀 - 幫你篩選靠譜的內(nèi)容。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/99387.html
摘要:前言有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對瀏覽器的兼容性有了解過嗎,那么如何才是我們正確回答這個(gè)問題的姿勢呢。 前言 有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對瀏覽器的兼容性有了解過嗎,那么如...
摘要:前言有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對瀏覽器的兼容性有了解過嗎,那么如何才是我們正確回答這個(gè)問題的姿勢呢。 前言 有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對瀏覽器的兼容性有了解過嗎,那么如...
摘要:概述的解釋器優(yōu)化器代碼可能在字節(jié)碼或者優(yōu)化后的機(jī)器碼狀態(tài)下執(zhí)行,而生成字節(jié)碼速度很快,而生成機(jī)器碼就要慢一些了。比如有一個(gè)函數(shù),從獲取值引擎生成的字節(jié)碼結(jié)構(gòu)是這樣的指令是獲取參數(shù)指向的對象,并存儲在,第二步則返回。 1 引言 本期精讀的文章是:JS 引擎基礎(chǔ)之 Shapes and Inline Caches 一起了解下 JS 引擎是如何運(yùn)作的吧! JS 的運(yùn)作機(jī)制可以分為 AST 分...
摘要:經(jīng)過連續(xù)幾期的介紹,手寫編譯器系列進(jìn)入了智能提示模塊,前幾期從詞法到文法語法,再到構(gòu)造語法樹,錯(cuò)誤提示等等,都是為智能提示做準(zhǔn)備。 1 引言 詞法、語法、語義分析概念都屬于編譯原理的前端領(lǐng)域,而這次的目的是做 具備完善語法提示的 SQL 編輯器,只需用到編譯原理的前端部分。 經(jīng)過連續(xù)幾期的介紹,《手寫 SQL 編譯器》系列進(jìn)入了 智能提示 模塊,前幾期從 詞法到文法、語法,再到構(gòu)造語法...
閱讀 639·2021-10-13 09:39
閱讀 1449·2021-09-09 11:53
閱讀 2637·2019-08-29 13:55
閱讀 721·2019-08-28 18:08
閱讀 2586·2019-08-26 13:54
閱讀 2406·2019-08-26 11:44
閱讀 1835·2019-08-26 11:41
閱讀 3758·2019-08-26 10:15