Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
嗶哩嗶哩系統(tǒng)部網(wǎng)絡(luò)團(tuán)隊(duì)
負(fù)責(zé)B站數(shù)據(jù)中心網(wǎng)絡(luò)規(guī)劃、設(shè)計(jì)、建設(shè)、運(yùn)維與優(yōu)化,為公司業(yè)務(wù)提供穩(wěn)定且可靠的網(wǎng)絡(luò)服務(wù)。整個(gè)團(tuán)隊(duì)專注于數(shù)據(jù)中心內(nèi)網(wǎng)、骨干網(wǎng)絡(luò)、負(fù)載均衡、傳輸網(wǎng)絡(luò)、虛擬化網(wǎng)絡(luò)以及國際化網(wǎng)絡(luò)的落地和應(yīng)用,并根據(jù)業(yè)務(wù)的發(fā)展需求不斷迭代更新底層基礎(chǔ)網(wǎng)絡(luò)設(shè)施。
在設(shè)計(jì)任何網(wǎng)絡(luò)結(jié)構(gòu)時(shí),網(wǎng)絡(luò)的穩(wěn)定性和擴(kuò)展性是兩個(gè)必然要考慮的因素。丟包、擁塞、擴(kuò)容三大標(biāo)準(zhǔn)決定了網(wǎng)絡(luò)質(zhì)量的上限和下限。任何程度的網(wǎng)絡(luò)質(zhì)量波動(dòng)都會(huì)對(duì)點(diǎn)直播視頻業(yè)務(wù)的生產(chǎn)和消費(fèi)造成最為直接的影響。基于B站始終把用戶體驗(yàn)放在第一位的前提下,在設(shè)計(jì)網(wǎng)絡(luò)前必須對(duì)網(wǎng)絡(luò)的流量模型,業(yè)務(wù)對(duì)網(wǎng)絡(luò)的要求做出充分調(diào)研。繼而從設(shè)備選型、網(wǎng)絡(luò)規(guī)劃、技術(shù)應(yīng)用、協(xié)議設(shè)計(jì)、生態(tài)演進(jìn)等多維度做出最貼合當(dāng)下B站客戶需求的網(wǎng)絡(luò)方案并落地實(shí)施。
隨著視頻化時(shí)代到來,承載業(yè)務(wù)的數(shù)據(jù)中心其規(guī)模也與日俱增,新增的數(shù)據(jù)中心所包含的服務(wù)器容量從幾千臺(tái)迅速攀升至數(shù)萬臺(tái)。傳統(tǒng)的樹形網(wǎng)絡(luò)結(jié)構(gòu)中,在網(wǎng)絡(luò)結(jié)構(gòu)和帶寬容量方面,未曾考慮到數(shù)據(jù)中心內(nèi)東西向流量的需求,大多是為了滿足南北向流量的大帶寬應(yīng)用而設(shè)計(jì),因此這種結(jié)構(gòu)雖然能滿足業(yè)務(wù)一時(shí)的應(yīng)用場(chǎng)景。但是由于各層上下聯(lián)帶寬存在較高的收斂比現(xiàn)象,后期如果需要擴(kuò)容帶寬,就需要通過升級(jí)各網(wǎng)絡(luò)元件,如擴(kuò)容核心設(shè)備的業(yè)務(wù)板卡、Fabric等。
同時(shí),在線、離線主機(jī)應(yīng)用程序,比如AI、大數(shù)據(jù)計(jì)算集群,產(chǎn)生了顯著的東西向流量。一些特定應(yīng)用和場(chǎng)景(比如多活改造),需要集群間的大量數(shù)據(jù)復(fù)制。傳統(tǒng)的樹形結(jié)構(gòu)在滿足東西方向大帶寬需求上捉襟見肘,要么組網(wǎng)成本太高,要么無法實(shí)現(xiàn),因?yàn)檎麄€(gè)組網(wǎng)受限于商用物理設(shè)備形態(tài)限制,比如設(shè)備端口密度等等。
B站的網(wǎng)絡(luò)基礎(chǔ)設(shè)施CAPEX(Capital Expenditure)在整體IT成本中占比顯著。因此,技術(shù)團(tuán)隊(duì)通過優(yōu)化個(gè)別網(wǎng)絡(luò)單元的成本來改善這一現(xiàn)象。具體可以用以下兩種實(shí)現(xiàn)方式:
隨著網(wǎng)絡(luò)設(shè)備數(shù)量增加,網(wǎng)元故障頻次必然增多,縮小網(wǎng)絡(luò)故障域是降低網(wǎng)絡(luò)OPEX(Operational Expenditure)的一個(gè)重要指標(biāo)。網(wǎng)絡(luò)中容易產(chǎn)生廣播和單播風(fēng)暴,這會(huì)對(duì)網(wǎng)絡(luò)穩(wěn)定性和可靠性造成影響。如何高效運(yùn)營管理網(wǎng)絡(luò),這是一個(gè)熱門的話題。在網(wǎng)絡(luò)設(shè)計(jì)之初,按全路由設(shè)計(jì)能縮小故障范圍,將故障域設(shè)定在更小的網(wǎng)絡(luò)范圍中。在全路由設(shè)計(jì)時(shí),盡量使用同一種路由協(xié)議(比如BGP協(xié)議),來簡(jiǎn)化設(shè)備控制面復(fù)雜度,從而降低網(wǎng)絡(luò)崩潰的概率。
B站DCN V1.0方案中,接入層和核心層均采用堆疊組網(wǎng)方案,網(wǎng)關(guān)配置在Spine設(shè)備,整個(gè)網(wǎng)絡(luò)處于一個(gè)大型的二層廣播域。如圖1:
圖1 DCN V1.0結(jié)構(gòu)
在堆疊方案中將兩臺(tái)接入交換機(jī)虛擬為一臺(tái),起到冗余備份的作用,服務(wù)器通過Bond接入交換機(jī),提升接入層面網(wǎng)絡(luò)的可靠性和穩(wěn)定性。Spine層也是將兩臺(tái)核心網(wǎng)絡(luò)設(shè)備通過堆疊虛擬為1臺(tái)。堆疊帶來的好處是設(shè)備控制面只有一個(gè),兩臺(tái)交換機(jī)進(jìn)行集中式配置,減少了頻繁登錄不同設(shè)備的操作時(shí)間,整體簡(jiǎn)化了網(wǎng)絡(luò)設(shè)備管理成本;兩臺(tái)接入交換機(jī)的表項(xiàng)依靠堆疊心跳線進(jìn)行同步。但在組網(wǎng)方案和后期運(yùn)維中堆疊方案逐漸暴露了兩個(gè)風(fēng)險(xiǎn)。
無論是哪個(gè)廠商的設(shè)備,都無法保證軟件系統(tǒng)不存在BUG,一旦出現(xiàn)BUG就需要對(duì)設(shè)備軟件升級(jí)補(bǔ)丁或軟件版本。雖然有類似ISSU的技術(shù)可以實(shí)現(xiàn)不中斷升級(jí),但I(xiàn)SSU的適用范圍僅限兩個(gè)版本差距很小的情況,且在實(shí)踐過程中各廠家無損升級(jí)技術(shù)復(fù)雜度高,升級(jí)風(fēng)險(xiǎn)較大,成功率低,會(huì)或多或少引入額外問題,導(dǎo)致升級(jí)過程中網(wǎng)絡(luò)連通性異常。另外堆疊成員節(jié)點(diǎn)單獨(dú)升級(jí)會(huì)影響控制面,影響網(wǎng)絡(luò)穩(wěn)定性。
交換機(jī)之間互聯(lián)的堆疊線路出現(xiàn)故障或者異常時(shí),將導(dǎo)致堆疊分裂,雖然不常見,但是在實(shí)際運(yùn)行過程中仍會(huì)遇到,B站歷史上就曾經(jīng)出現(xiàn)過此類Case。產(chǎn)生的問題是分裂后,等同于網(wǎng)絡(luò)中出現(xiàn)了兩臺(tái)配置完全相同的交換機(jī),造成網(wǎng)絡(luò)配置沖突,最終導(dǎo)致堆疊系統(tǒng)所承載的業(yè)務(wù)中斷。
面對(duì)這個(gè)分裂風(fēng)險(xiǎn),當(dāng)然也有相應(yīng)的解決辦法,就是一旦系統(tǒng)檢測(cè)到分裂情況,就會(huì)將除去堆疊口、管理接口以及管理員指定的例外端口之外的其他端口全部DOWN掉,來防止分裂后對(duì)網(wǎng)絡(luò)造成影響。雖然這種方式規(guī)避了配置完全相同的兩臺(tái)交換機(jī)出現(xiàn)在網(wǎng)絡(luò)里面,但代價(jià)也是顯而易見的,業(yè)務(wù)恢復(fù)操作變得復(fù)雜,遠(yuǎn)程恢復(fù)操作變得極難。
基于以上兩個(gè)風(fēng)險(xiǎn)點(diǎn)及其他堆疊組網(wǎng)帶來的隱患,B站當(dāng)前數(shù)據(jù)中心接入層組網(wǎng)堆疊技術(shù)已不再使用。
為了解決堆疊方案的問題,2019年初開始,團(tuán)隊(duì)開始對(duì)DCN網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行重新設(shè)計(jì)。Leaf接入層采用M-LAG技術(shù)(跨設(shè)備鏈路聚合組)取代原來的堆疊方式,Spine層不再使用堆疊,每臺(tái)設(shè)備獨(dú)立運(yùn)行,同時(shí)為了更好的冗余和提升帶寬收斂比,在Spine層增加網(wǎng)絡(luò)設(shè)備數(shù)量。Spine-Leaf層運(yùn)行EBGP路由協(xié)議,破除大二層網(wǎng)絡(luò)帶來的廣播風(fēng)暴風(fēng)險(xiǎn)。DCN V2.0網(wǎng)絡(luò)結(jié)構(gòu)如下圖2:
圖2 DCN V2.0結(jié)構(gòu)
M-LAG(Multichassis Link Aggregation Group)跨設(shè)備鏈路聚合組,是一種實(shí)現(xiàn)跨設(shè)備鏈路聚合的機(jī)制,讓兩臺(tái)接入交換機(jī)以同一個(gè)狀態(tài)和被接入的設(shè)備進(jìn)行鏈路聚合協(xié)商,從而把鏈路可靠性從單板級(jí)提高到了設(shè)備級(jí),組成雙活系統(tǒng)。在被接入的設(shè)備看來,就如同和一臺(tái)設(shè)備建立了鏈路聚合關(guān)系。相比DCN V1.0結(jié)構(gòu),V2.0結(jié)構(gòu)有效解決了交換機(jī)軟件版本升級(jí)難問題,兩臺(tái)接入交換機(jī)可以獨(dú)立進(jìn)行升級(jí),保證有一臺(tái)設(shè)備正常工作即可,對(duì)正在運(yùn)行的業(yè)務(wù)幾乎沒有影響。同時(shí)接入層面做一些配置優(yōu)化,如配置Monitor聯(lián)動(dòng)設(shè)備上下行端口,BGP路由協(xié)議配置優(yōu)化等,相比V1.0時(shí)代網(wǎng)絡(luò)穩(wěn)定性和可擴(kuò)展性提升了一個(gè)層級(jí)。但與此同時(shí),DCN V2.0網(wǎng)絡(luò)結(jié)構(gòu)中還是存在以下問題:
基于以上M-LAG組網(wǎng)帶來的相關(guān)問題,B站網(wǎng)絡(luò)團(tuán)隊(duì)在DCN組網(wǎng)結(jié)構(gòu)上繼續(xù)探索,砥礪前行尋找最新DCN結(jié)構(gòu)組網(wǎng)方案,由此B站DCN V3.0組網(wǎng)結(jié)構(gòu)登場(chǎng)。
2020年底B站網(wǎng)絡(luò)團(tuán)隊(duì)與國內(nèi)外互聯(lián)網(wǎng)頭部企業(yè)、設(shè)備供應(yīng)商等廣泛交流與學(xué)習(xí),開始調(diào)研新一代DCN盒式組網(wǎng)方案,并于2021年中旬完成DCN V3.0網(wǎng)絡(luò)結(jié)構(gòu)整套方案驗(yàn)證。且于2021Q3在新建數(shù)據(jù)中心落地應(yīng)用3.0組網(wǎng)結(jié)構(gòu),經(jīng)過半年的灰度驗(yàn)證,整個(gè)組網(wǎng)穩(wěn)定運(yùn)行,當(dāng)前此組網(wǎng)方案已全量在B站數(shù)據(jù)中心部署;DCN 3.0網(wǎng)絡(luò)結(jié)構(gòu)如圖3所示:
圖3 DCN V3.0結(jié)構(gòu)
DCN V3.0網(wǎng)絡(luò)結(jié)構(gòu)說明:
B站網(wǎng)絡(luò)團(tuán)隊(duì)按穩(wěn)定和高效原則設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)。底層物理網(wǎng)絡(luò)通過物理線路、硬件設(shè)備和網(wǎng)絡(luò)技術(shù),形成了一張穩(wěn)定且可靠的DCN網(wǎng)絡(luò),為上層業(yè)務(wù)提供高效和快速的轉(zhuǎn)發(fā)通道。基礎(chǔ)網(wǎng)絡(luò)下承機(jī)房基礎(chǔ)設(shè)施、上接業(yè)務(wù),需要解決業(yè)務(wù)需求變化快和基礎(chǔ)網(wǎng)絡(luò)升級(jí)難這一對(duì)永恒的矛盾點(diǎn)。未來基礎(chǔ)網(wǎng)絡(luò)會(huì)繼續(xù)緊跟技術(shù)發(fā)展潮流,根據(jù)業(yè)務(wù)需求,探索新型網(wǎng)絡(luò)結(jié)構(gòu),為B站業(yè)務(wù)提供更穩(wěn)定、更高效及高擴(kuò)展的網(wǎng)絡(luò)服務(wù)。
[1] Facebook’s data center network: https://engineering.fb.com/2019/03/14/data-center-engineering/f16-minipack/
[2] A Border Gateway Protocol 4 (BGP-4). https://tools.ietf.org/html/rfc4271, 2006.
[3] BGP in the Data Center: https://www.oreilly.com/library/view/bgp-in-the/9781491983416/
[4] Use of BGP for routing in large-scale data centers. https://tools.ietf.org/html/rfc7938, 2016.
作者:SYS-網(wǎng)絡(luò)團(tuán)隊(duì)
來源:微信公眾號(hào):嗶哩嗶哩技術(shù)
出處:https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&mid=2247487939&idx=1&sn=bcf362e7d5d6969dc02fb124cb8e37d3
022年3月24日,國家稅務(wù)總局及時(shí)發(fā)布了《關(guān)于小規(guī)模納稅人免征增值稅等征收管理事項(xiàng)的公告》(國家稅務(wù)總局公告2022年第6號(hào))公告,進(jìn)一步明確了有關(guān)征管事項(xiàng)。
打開貴州省電子稅務(wù)局網(wǎng)站
https://etax.guizhou.chinatax.gov.cn/xxmh/html/inde x.html,點(diǎn)擊右上角登錄,進(jìn)入電子稅務(wù)局登錄頁面,登錄電子稅務(wù)局。
1. 代開增值稅發(fā)票
1.1 增值稅小規(guī)模納稅人在電子稅務(wù)局申請(qǐng)代開增值稅專用發(fā)票時(shí),系統(tǒng)會(huì)彈出提示:
您在2022 年4月1日以后取得的適用 3%征收率的應(yīng)稅銷售收入,應(yīng)當(dāng)開具免稅普通發(fā)票。若您有特殊情況,需要開具其他增值稅發(fā)票,請(qǐng)按提示選擇相應(yīng)原因:
1.1.1 開具發(fā)票為2022年3月31日前發(fā)生納稅義務(wù)的業(yè)務(wù)
1.1.2. 前期已開具相應(yīng)征收率發(fā)票,發(fā)生銷售折讓、中止或者退回等情形需要開具紅字發(fā)票,或者開票有誤需要重新開具
1.1.3. 因?yàn)閷?shí)際經(jīng)營業(yè)務(wù)需要,放棄享受免征增值稅政策
如需繼續(xù)開具增值稅專用發(fā)票,納稅人需選擇相應(yīng)原因后才可繼續(xù)辦理。
1.2 自然人在電子稅務(wù)局申請(qǐng)代開增值稅普通發(fā)票時(shí),系統(tǒng)已自動(dòng)默認(rèn)征收率為“免稅”,納稅人可以自行選擇修改,如果選擇3%征收率,系統(tǒng)會(huì)彈出提示:
您在2022 年4月1日以后取得的適用3%征收率的應(yīng)稅銷售收入,應(yīng)當(dāng)開具免稅普通發(fā)票。若您有特殊情況,需要開具其他增值稅發(fā)票,請(qǐng)按提示選擇相應(yīng)原因:
1.2.1. 開具發(fā)票為 2022 年3月31日前發(fā)生納稅義務(wù)的業(yè)務(wù)
1.2.2. 前期已開具相應(yīng)征收率發(fā)票,發(fā)生銷售折讓、中止或者退回等情形需要開具紅字發(fā)票,或者開票有誤需要重新開具
1.2.3. 因?yàn)閷?shí)際經(jīng)營業(yè)務(wù)需要,放棄享受免征增值稅政策,如需繼續(xù)開具征收率為3%的增值稅發(fā)票,納稅人需選擇相應(yīng)原因后才可繼續(xù)辦理。
2. 增值稅及附加稅(費(fèi))申報(bào)(小規(guī)模納稅人適用)
登錄電子稅務(wù)局后,依次點(diǎn)擊【我要辦稅】→【稅費(fèi)申報(bào)及繳納】→【按期應(yīng)申報(bào)】,選擇【增值稅及附加稅費(fèi)申報(bào)表(小規(guī)模納稅人適用)】填寫申報(bào)表,系統(tǒng)自動(dòng)彈出提示: 自 2022 年 4 月 1 日至 2022 年 12 月 31 日,增值稅小規(guī)模納稅人適用 3%征收率的應(yīng)稅銷售收入,免征增值稅;適用3%預(yù)征率的預(yù)繳增值稅項(xiàng)目,暫停預(yù)繳增值稅。
3. 增值稅預(yù)繳申報(bào)
登錄電子稅務(wù)局后,依次點(diǎn)擊【我要辦稅】→【稅費(fèi)申 報(bào)及繳納】→【其他申報(bào)】,選擇【增值稅預(yù)繳申報(bào)表】填 寫申報(bào)表,點(diǎn)擊【下一步】,進(jìn)入增值稅預(yù)繳申報(bào)表,此時(shí) 如填寫建筑服務(wù)一欄,系統(tǒng)在右上方自動(dòng)彈出提示:自 2022年 4 月 1 日至 2022 年 12 月 31 日,增值稅小規(guī)模納稅人適用 3%征收率的應(yīng)稅銷售收入,免征增值稅;適用 3%預(yù)征率的預(yù)繳增值稅項(xiàng)目,暫停預(yù)繳增值稅。
于2022年的CSS新特性,自己之前也有篇原創(chuàng),CSS 的未來:Cascade Layers (CSS @layer),專門是在介紹@layer(級(jí)聯(lián)層)的文章,而新的一年會(huì)有更多的CSS的新特性會(huì)出現(xiàn)在瀏覽器中。
今天分享一篇大漠老師的文章,主要內(nèi)容是2022年哪些CSS特性將在瀏覽器中出現(xiàn),以下是正文。
原文: https://www.w3cplus.com/css/what-is-new-css-in-2022.html
作者:大漠老師,請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
雖然近些年 CSS 變化很快,但我認(rèn)為 2021 年是 CSS 的元年。在即將過去的 2021 年,CSS 變化非常地大,其中新增了很多特性,比如 CSS 容器查詢、CSS 父選擇器、CSS 層疊控制規(guī)則、CSS 子網(wǎng)格等等。而且這些特性已經(jīng)在個(gè)別,甚至是在大部分主流瀏覽器已經(jīng)可以看到了。幾大主流瀏覽器(Chrome、Firefox、Safari和Edge)還專注于修復(fù)瀏覽器兼容性痛點(diǎn),讓 Web 開發(fā)者的工作變得更輕松。
瀏覽器兼容性方面的修復(fù),在 Web.dev 上發(fā)布了 2021 年的年中和年終報(bào)告,報(bào)告雖然簡(jiǎn)單,但我們可以看到瀏覽器廠商都在致于力磨平 CSS 特性在瀏覽器上的兼容性。為此,我們應(yīng)該感謝他們的付出!
隨著 2021 年的結(jié)束,讓我們一起來看看 2022 年,我們可以期待哪些 CSS 特性將會(huì)在瀏覽器中出現(xiàn)。這了是我連續(xù)第三年整理有關(guān)于 CSS 新特性方面的文章了,另外兩篇是(可自行搜索):
你即將看到是 2022 年的,你會(huì)發(fā)現(xiàn)這三篇文章提到的 CSS 特性有相同的,但他們也是有變化的。
@Bramus 前兩天在Twitter 上發(fā)了一條信息,他整理了一份 2022 年的將會(huì)出現(xiàn)在瀏覽器的 CSS 清單:
有關(guān)于清單中列出的 CSS 相關(guān)介紹,可以閱讀他的文章:《CSS In 2022》
這份清單中列出的 CSS 特性和 @Adam Argyle 分別在 2020 年 和 2021 年分享的 CSS 新特性列的出的清單差不多,不同的是,在2021年,有些CSS特性已經(jīng)得到了瀏覽器的支持,有些已經(jīng)進(jìn)入了瀏覽器的實(shí)驗(yàn)屬性列表清單,說不定2022年,你就能看到了!
有關(guān)于 @Adam Argyle 在 2020 和 2021 分享的 CSS 新特性,我也曾整理過一份,清單有些類似,但內(nèi)容還是有差異,主要涵蓋了一些我自己在 CSS 方面的認(rèn)識(shí)和嘗試,分別記錄在《2020年CSS有哪些新特性》和《2021年你可能不知道的 CSS 特性》以及《應(yīng)用于下一代Web的樣式》
當(dāng)然,如果你也是 CSS 的忠實(shí)愛好者,不斷的在關(guān)注和推進(jìn) CSS 向前發(fā)展,那么你可能已經(jīng)知道了,自 2019 年開始,每年年低都會(huì)有一份關(guān)于 CSS 發(fā)展?fàn)顟B(tài)相關(guān)的報(bào)告(2019、2020 和 2021)呈現(xiàn)給你。在每年的報(bào)告中,我們都可以看到一項(xiàng)關(guān)于”開發(fā)者期待的CSS特性“的統(tǒng)計(jì):
在第一份報(bào)告出來的時(shí)候,我特意還花了一點(diǎn)時(shí)間去理解這份有關(guān)于 CSS的報(bào)告:《從9102年的CSS狀態(tài)報(bào)告中看CSS特性的使用》,另外有幸運(yùn)在 2020年年底和一些大學(xué)生一起聊了一個(gè)關(guān)于CSS狀態(tài)和學(xué)習(xí)的話題!如果你對(duì)該話題感興趣的話,可以閱讀《CSS現(xiàn)狀和如何學(xué)習(xí)》,文章中附有分享時(shí)錄制的視頻!
除此之外,W3C 的 CSS 工作小組,這兩年也都出了 CSS 規(guī)范的重點(diǎn)報(bào)告,最新的是 2020年 和 2021年的。注意,W3C 關(guān)于 CSS 規(guī)范的重點(diǎn)報(bào)告并不是每年都有的!接下來,我將按著 @Bramus 的 《CSS In 2022》大綱往下梳理,其中會(huì)加入一些我自己對(duì)這方面的認(rèn)識(shí)和見解。
我需要額外提出的是,接下來內(nèi)容中提到的 CSS 特性只會(huì)涉及到那些全新的或仍然沒有得到瀏覽器支持的(哪怕是實(shí)驗(yàn)性方面的)特性。但這并不代表著它們不值得期待,說不定在2022年你就能使用了!如果你對(duì)這方面感興趣的話,請(qǐng)繼續(xù)往下閱讀!
在這節(jié)中提到的 CSS 特性是近些年來,Web 開發(fā)者一直期待的特性(或者說 CSS 中遺失的特性)。這些特性將在 2022 年的某個(gè)時(shí)候就得到了主流瀏覽器的支持。慶幸的是,有些特性已經(jīng)在一個(gè)或多個(gè)主流瀏覽器中得到了支持,其他特性也將隨著時(shí)間的推移也會(huì)隨之而來。在 2022 年,學(xué)習(xí)或了解這些 CSS 特性,我想你會(huì)獲得收益的!
有意思的是,CSSWG一直還維護(hù)著一份關(guān)于 CSS 設(shè)計(jì)中不完整的錯(cuò)語列表。感興趣的可以點(diǎn)擊這里閱讀!
CSS 容器查詢的特性一直以來都是 Web 設(shè)計(jì)師和開發(fā)者所期待的功能之一,從這幾年的 CSS 發(fā)展?fàn)顟B(tài)的報(bào)告就可以看得出來。在沒有容器查詢之前,Web 開發(fā)者大多是依賴于 JavaScript 腳本來做判斷,從而改變 UI 網(wǎng)格。雖然 CSS 容器查詢存在于 CSS Containment Module 中有些年頭,但一直未得到瀏覽器的支持。慶幸的是,在 2021 年,該特性得到了飛速的發(fā)展,時(shí)至今日,能在主流瀏覽器中看到 CSS 容器查詢功能。這一切,都離不開 @TerribleMia ,是她為我們帶來了這么好的 CSS 特性,并且一直在推進(jìn)該特性向前發(fā)展。
@TerribleMia 除了設(shè)計(jì) CSS 容器查詢特性之外,還設(shè)計(jì)了 CSS 另外兩個(gè)非常優(yōu)秀的特性,那就是 CSS 的 @layer 和 @scoped 兩個(gè) @ (At rule)規(guī)則。詳細(xì)的可以閱讀《Miriam's CSS Sandbox》。
CSS 容器查詢 @container 有點(diǎn)類似于 CSS 的媒體查詢 @media ,只是它將根據(jù)元素的父容器(或祖先元素)的尺寸(size)或樣式(style)來調(diào)整自己或自己后代元素的樣式規(guī)則。在沒有 CSS 容器查詢,Web 開發(fā)者為了能在不同容器下調(diào)整 UI,大多都是依賴于媒體查詢來做。也就是說,有了該特性之后,不需要再依賴視窗大小加添加類名的方式來調(diào)整UI了:
上圖演示了,基于視窗的設(shè)計(jì)和基于容器的尺寸設(shè)計(jì)。可以說, CSS 容器查詢的出現(xiàn),除了改變 Web 開發(fā)者的開發(fā)方式之外,也將給 Web 設(shè)計(jì)帶來變革命。這個(gè)論點(diǎn)在 2021 年的 GDS 大會(huì)上,@Una Kravets 在分享的 《The New Responsive: Web design in a compoent-driven world》主題(該主題視頻可以在 YouTube上訪問)中就提出這樣的觀點(diǎn):
CSS 容器查詢將會(huì)成為下一代響應(yīng)式 Web 設(shè)計(jì)必不可少的特性之一。
有了 CSS 容器查詢之后,我們就可以基于同一個(gè)組件,在不同尺寸下調(diào)整其UI,比如我們手淘 APP 頂部的搜索框效果:
上面效果的關(guān)鍵性代碼如下:
.form__container {
container: inline-size;
}
.form {
display: grid;
align-items: center;
}
@container (min-width: 480px) {
.form {
grid-template-columns: min-content 1fr 200px;
grid-template-areas: "searchIcon searchInput button";
grid-template-rows: 88px;
gap: 10px;
}
}
@container (min-width: 768px) {
.form {
grid-template-columns: min-content 1fr min-content 200px;
grid-template-areas: "searchIcon searchInput cameraIcon button";
grid-template-rows: 88px;
gap: 10px;
}
}
詳細(xì)代碼可以點(diǎn)擊這里閱讀或獲取。
CSS 容器查詢?cè)谥髁鳛g覽器都能體驗(yàn)效果了,但需要開啟其相關(guān)標(biāo)記。如果你要運(yùn)用于生產(chǎn)環(huán)境,可以考慮其相應(yīng)的 Polyfill:
CSS容器查詢特性絕對(duì)是眾望所歸的一個(gè)特性,在2022年更會(huì)全速向前!
有關(guān)于 CSS 容器查詢更多的介紹可以移步閱讀下面這些文章:
CSS 選擇器是 CSS 中最基礎(chǔ)的知識(shí),也是必不可少的一部分,如果你沒掌握好 CSS 選擇器的話,那么你將會(huì)在 CSS 的世界中有那種”眾里尋她千百度,驀然回首,那人卻在燈火闌珊處“的感覺!也正因此,CSS 選擇器模塊的迭代非常的快,現(xiàn)在已經(jīng)進(jìn)入 Level 4 版本了。在 Level 4 版本中,添加了多個(gè)偽類選擇器,比如 :is() 、:where() 、:not() 和 :has() 等,而其中 :has() 選擇器也是我們期待已久的一個(gè)選擇器。@SaraSoueidan 在 Twitter 上引用 @Jen Simmons 的話說:
:has()選擇器本質(zhì)上就是CSS中期待已久的父選擇器!
CSS 的 :has() 偽類選擇器和 :not() 有點(diǎn)相似,也被稱為結(jié)構(gòu)性偽類選擇器,在 CSS 的函數(shù)中也稱之為 動(dòng)態(tài)偽類函數(shù)。它允許你更精細(xì)地匹配元素:
:has() 偽類代表一個(gè)元素,如果作為參數(shù)傳遞的任何選擇器至少與一個(gè)元素相匹配!
簡(jiǎn)單地說,元素只有在傳遞到 :has() 中的選擇器至少匹配一個(gè)元素時(shí)才會(huì)被選中。這樣理解起來似乎有點(diǎn)暈,我們來看個(gè)簡(jiǎn)單地示例:
figure img {
aspect-ratio: 21 / 9;
border: 5px solid #3f51b5;
}
figure:has(figcaption) img {
border: 5px solid #9c27b0;
}
上面示例中的 figure img 選擇器大家應(yīng)該都明白,表示選中 <figure> 元素中的所有 <img> 元素;而 figure:has(figcaption) img 選擇器表示的是選中 包含了<figcaption> 元素的 <figure> 元素中的所有 <img> 元素。注意,這里:has() 中傳了個(gè) figcaption 選擇器作為其參數(shù)。
<!-- 未匹配,因?yàn)?figure 沒有包含 figcaption 元素 -->
<figure>
<img alt="" src="" />
</figure>
<!-- 會(huì)匹配,因?yàn)?figure 包含了 figcaption 元素 -->
<figure>
<figcaption></figcaption>
<img alt="" src="" />
</figure>
在支持的瀏覽器中你將看到的效果如下:
注意,Safari TP 137 是目前唯一一個(gè)默認(rèn)支持 :has() 選擇器的瀏覽器。
雖然說 :has() 被稱為 CSS 的父選擇器,但它的作用遠(yuǎn)不止于此。我們可以使用 :has() 和 :not() 等選擇器相互結(jié)合,實(shí)現(xiàn)一些更復(fù)雜的效果。
就上面示例而言,當(dāng)你在 <input type="email"> 輸入的值是否有效時(shí),表單不同狀態(tài)下有不同的 UI 效果:
是不是很有意思。如果對(duì) CSS 的 :has() 選擇器感興趣的話,還可以閱讀《CSS 選擇器:is() 和 :where() 與 :has() 有什么功能》一文。
更多關(guān)于選擇器的內(nèi)容:
CSS的級(jí)聯(lián)順序一直以來令眾多開發(fā)者(特別是不熟悉CSS的開發(fā)者)感到困惑和頭痛。CSS 新的 @ 規(guī)則 @layer 將可以讓 CSS 的級(jí)聯(lián)順序按照你的意圖來進(jìn)行控制。簡(jiǎn)單地說,@layer 可以通過分層的方式,讓你適當(dāng)控制同源規(guī)則的級(jí)聯(lián)排序。
比如下面這個(gè)示例:
/* 預(yù)設(shè)級(jí)聯(lián)層的順序,并且相鄰級(jí)聯(lián)層之間有逗號(hào)分隔 */
@layer setting, tool, generic, element, object, component, utilities;
@layer setting {
/* 附加到級(jí)聯(lián)層 setting 中的 CSS */
}
@layer tool {
/* 附加到級(jí)聯(lián)層 tool 中的 CSS */
}
@layer generic {
/* 附加到級(jí)聯(lián)層 generic 中的 CSS */
}
@layer element {
/* 附加到級(jí)聯(lián)層 element 中的 CSS */
}
@layer object {
/* 附加到級(jí)聯(lián)層 object 中的 CSS */
}
@layer component {
/* 附加到級(jí)聯(lián)層 component 中的 CSS */
}
@layer utilities {
/* 附加到級(jí)聯(lián)層 utilities 中的 CSS */
}
上面只是演示了 @layer 規(guī)則的一個(gè)基本使用,而與 @layer 相關(guān)的知識(shí)和細(xì)節(jié)很多,這里就不深入展開了。要是你對(duì)該特性感興趣的話,可以閱讀《初探 CSS 的級(jí)聯(lián)層(@layer)》一文。到目前為止,你們可以在 Chromium 99、Firefox 97 和 Safari TP 133 中查閱。注意,Safari 是最早支持該特性的瀏覽器。
有關(guān)于 CSS 中層疊更多的話題還可以閱讀:
在 CSS Color Module Level 5 中新增了兩個(gè)處理顏色的新函數(shù),即 color-mix() 和 color-contrast() ,除此之外,還擴(kuò)展了以前的顏色函數(shù)(比如 rgb() 、hsl() 、hwb() 、lab() 和 lch() 等)功能,可以在一個(gè)顏色的基礎(chǔ)上改變某一個(gè)或某幾個(gè)參數(shù)的值,從而得到一個(gè)新的顏色。比如上圖部的 hsl() 函數(shù),我們可以基于 --theme-primary 顏色(假設(shè)它的值為 hsl(274, 61%, 50%))改變其飽和度(從 50% 調(diào)整到 30% )從而得到一個(gè)新的顏色 hsl(274, 61%, 30%) 。這個(gè)特性,可以讓我們?cè)诤苋菀椎脑?CSS 控制品牌色的色盤:
說個(gè)題外話,我最近的主要工作內(nèi)容之一是將 Design Token 運(yùn)用于前端生產(chǎn)的工程鏈路中,并且根據(jù)組件可變參數(shù)來自動(dòng)生成不同風(fēng)格的 UI 組件。那么,在未來的某一天,我就可以使用這種特性來為品牌色構(gòu)建色盤。
新增的 color-mix() 和 color-contrast() 函數(shù)相對(duì)來說要更復(fù)雜一些。其中 color-mix() 函數(shù)有點(diǎn)類似于設(shè)計(jì)師調(diào)色一樣:允許你在一個(gè)給定的顏色空間中混合兩種顏色。
比如:
:root {
--theme-color: #ff0000;
}
.text-primary-dark {
color: color-mix(var(--theme-primary), black 10%);
}
.text-primary-darker {
color: color-mix(var(--theme-primary), black 20%);
}
color-contrast() 函數(shù)比較有意思,特別是在用于構(gòu)建可訪問性 Web 的時(shí)候特別有用。因?yàn)樗梢詭椭覀兲岣?Web 可訪問性方面的能力(更好的控制文本色和背景色的對(duì)比度)。其主要作用是獲取一個(gè)顏色值,并將其與其他顏色的列表進(jìn)行比較,從列表中選擇對(duì)比度最高的一個(gè)。
比如color-contrast(white vs red, white, green) ,分別會(huì)拿red 、white 和 green 與 white 進(jìn)行對(duì)比,其中 green 和 white 對(duì)比度最高,最終會(huì)取 green 顏色:
你也還可以像這樣使用:color-contrast(wheat vs tan, sienna, #d2691e to AA-large) 。它會(huì)將 wheat 與 tan 、sienna 和 #d2691e 進(jìn)行對(duì)比,最終 sienna 顏色獲勝,因?yàn)樗c wheat 顏色的對(duì)比度為 4.273 ,超過了 AA-large 的閾值。
Safari TP 124 已將 hwb()、lch() 、lab() 、color-mix() 和 color-contrast() 置為默認(rèn)功能!
額外提一下,其中 hwb() 、lch() 和 lab() 所表達(dá)的顏色空間和 rgb() 還是有差異的,它們能將顏色表達(dá)的更細(xì)膩。就拿 hwb() 函數(shù)來說:
基于同一色相 0deg 描述的顏色:
有關(guān)于 CSS 顏色更多介紹,可以閱讀:
”視窗單位“對(duì)于大家來說應(yīng)該不會(huì)感到陌生了,特別是針對(duì)移動(dòng)端開發(fā)的同學(xué)來說。因?yàn)橐苿?dòng)端現(xiàn)在主流的適配方案之一就是采用視窗單位來處理的。但很多同學(xué)所知道的視窗單位應(yīng)該只是 vw 、vh 、vmin 和 vmax :
視窗單位給移動(dòng)端開發(fā)的適配是帶來了極大的優(yōu)勢(shì),但我想你在使用視窗單位的時(shí)候,應(yīng)該也碰到了iOS上 Safari 的兼容性問題。因?yàn)椋趇OS上的 Safari 有一個(gè)長(zhǎng)期存在的,極其惱人的Bug,它不能與 vh 單位很好的配合。如果你將一個(gè)容器的高度設(shè)置為 100vh 時(shí),會(huì)導(dǎo)致這個(gè)元素有點(diǎn)太高(會(huì)出現(xiàn)滾動(dòng)條)。造成這種現(xiàn)象的主要原因是移動(dòng)端上的 Safari 在計(jì)算 100vh 時(shí)忽略了它的部分用戶界面。
如果你對(duì) iOS 的 Safari上 100vh 的相關(guān)問題以及解決方案感興趣的話,還可以移步閱讀:
如果你不想花過多時(shí)間搞清楚這個(gè)問題的話,只是想快速解決這個(gè)問題,那可以將下面這段代碼放到你的代碼片段中:
body {
height: 100vh;
}
@supports (-webkit-touch-callout: none) {
body {
height: -webkit-fill-available;
}
}
雖然上面的代碼可以解決 100vh 在 iOS Safari 引起的問題,但終究也只能說是一種 Hack 手段(事實(shí)上,CSS 中有很多黑魔法,這里不是主要聊這個(gè)的,顠過)。慶幸的是,CSS Values and Units Module Level 4 新增了幾個(gè)與視窗有關(guān)系的新單位:
也有相應(yīng)的單位用于 CSS 的邏輯屬性中,比如 svi/svb 。有關(guān)于 這幾個(gè)新增的視窗單位更詳細(xì)的介紹,可以閱讀 @Bramus 的 《The large, Small, and Dynamic Viewports》一文和@Arek Nawo 的 《Investigating the new CSS viewport relative units》一文。既然聊起了 CSS 的單位,那就再多花點(diǎn)篇幅和大家再多聊幾個(gè)新增的 CSS 單位,也是蠻有意思的。先說 CSS Values and Units Module Level 4 新增的 lh 和 rlh 吧。
簡(jiǎn)單地回憶一下 CSS 中另一對(duì)單位:em 和 rem 。稍微了解 CSS 的同學(xué)都知道:- em 是相對(duì)于元素自已的 font-size 值計(jì)算(除元素自身的 font-size 取值為em時(shí),元素自身的 font-size 值單位為 em時(shí),其相對(duì)于其父元素的font-size值計(jì)算) - rem 是相對(duì)于HTML文檔的根元素的 font-size 值計(jì)算,文檔的根元素一般是指 <html> 元素
這兩個(gè)新增的 lh 和 rlh 與 em 和 rem 非常的相似,只不過他們相對(duì)的是 line-height 的值計(jì)算:- lh 相對(duì)于元素自己的 line-height 計(jì)算 - rlh 相對(duì)于文檔根元素(<html> )的 line-height 計(jì)算
你肯定會(huì)問,這樣的單位有何用處呢?我想大家在還原 UI 設(shè)計(jì)稿的時(shí)候,肯定碰到了因?yàn)樽煮w不同以及 line-height 值不同,讓元素在視覺上看上去總是對(duì)不齊。那么,有了 lh 和 rlh 之后,事情會(huì)變得好一點(diǎn)。比如下圖這樣的場(chǎng)景:
以前上圖這樣的標(biāo)記,常把寬高設(shè)置為 1em ,那么現(xiàn)在可以設(shè)置 1lh :
::marker {
width: 1lh;
height: 1lh;
}
到目前為止,僅 Safari TP 105 聲稱支持這兩個(gè)相對(duì)單位 lh 和 rlh 。前面提到 CSS 容器查詢特性一直以來是 Web 設(shè)計(jì)師和開發(fā)者一直期待的特性,并且在 2021 年得到快速發(fā)展。同時(shí),和 CSS 容器查詢特性一起出現(xiàn)的 ”*容器查詢單位“ 也是很有意義和作用的。只不過,CSS 容器查詢單位與 CSS 容器查詢模塊放在一起,并未和其他的 CSS 單位納入一起。CSS 容器查詢單位和視窗單位有點(diǎn)類似,不同的是 視窗單位相對(duì)于瀏覽器視窗尺寸計(jì)算,而容器查詢單位相對(duì)于查詢?nèi)萜饔?jì)算。使用容器查詢長(zhǎng)度單位的樣式表可以更容易將一個(gè)組件從一個(gè)查詢?nèi)萜髦幸频搅硪粋€(gè)查詢?nèi)萜鳌SS容器查詢的單位主要有:
早其容器查詢的單位定義的是 c*(比如,cw 、ch 、cmin 和 cmax )之類的,但其中有些單位會(huì)和 ch 單位產(chǎn)生沖突,因此,最終確定的容器查詢單位是以 cq* 開始的。也就是上面所列的幾個(gè)!
正如 @Miriam Suzanne(最初提出建議的人,也是規(guī)范的編輯)所分享的,這些 CSS 單位是Chromium中實(shí)驗(yàn)性容器查詢支持的一部分。
更為有趣的是,@Ahmad Shadeed 在他的文章《CSS Container Query Units》一文中提出 qw 、qh 、qmin 和 qmax 以及他們對(duì)應(yīng)的邏輯屬性的單位qi 、qb 。
@Ahmad Shadeed 使用這些新的CSS單位運(yùn)用在 font-size 上。可以用于容器查詢的一坨 CSS 代碼,在clamp() 比較函數(shù)中使用cqw 單位來取代。
早在2018年和大家聊改變滾動(dòng)體驗(yàn)的時(shí)候就介紹過 overscroll-behavior 屬性,我們可以通過該屬性覆蓋 overscroll 容器(指的是內(nèi)容寬或高大于容器的寬或高,出現(xiàn)滾動(dòng)條)時(shí)的默認(rèn)行為。拿一個(gè)具體的實(shí)例來說,比如我們?cè)跇?gòu)建彈框的時(shí)候,彈框內(nèi)容過高也會(huì)出現(xiàn)滾動(dòng)條,這個(gè)時(shí)候就會(huì)有兩個(gè)滾動(dòng)條出現(xiàn),一個(gè)是彈框的,一個(gè)是body 的,其默認(rèn)行為會(huì)像下面錄屏的效果:
彈框無法滾動(dòng)時(shí),其底部的內(nèi)容可以繼續(xù)滾動(dòng)。說實(shí)話,這樣的默認(rèn)滾動(dòng)行為給用戶的體驗(yàn)是極差的。更多的時(shí)候,我們希望彈框無法滾動(dòng)時(shí),其底部的滾動(dòng)條也不能滾動(dòng)。如下所示:
要實(shí)現(xiàn)上面視頻的效果,我們就需要使用 overscroll-behavior 屬性,并且將其值設(shè)置為 contain :
.modal {
overscroll-behavior-y: contain;
overflow-y: auto;
}
這個(gè)特性早在 Firefox 36 和 Chrome 63 就開始得到支持了,只不過Safari還未得到支持,不過 Safari 也在迎頭趕上。
有關(guān)于 overscroll-behavior 的相關(guān)介紹,可以閱讀 @Ahmad Shadeed 的《Prevent Scroll Chaining With Overscroll Behavior》一文。
在 CSS 中改善滾動(dòng)體驗(yàn),除了overscroll-behavior 屬性之外,還有其他的一些屬性,比如滾動(dòng)捕捉 scroll-snap (Scroll Snap模塊中的屬性)、pull-to-refresh 等。CSS 除了要以控制滾動(dòng)行為之外,也可以控制滾動(dòng)條的樣式。在今年以前,CSS 控制滾動(dòng)條樣式是使用瀏覽器的一些私有屬性來搞定:
就在 2021 年 12 月 09日,W3C 發(fā)布了的 CSS Scrollbars Styling Module Level 1 規(guī)范,該規(guī)范提供了 scrollbar-color 和 scrollbar-width 兩個(gè)屬性,用來給滾動(dòng)條設(shè)置樣式。以后,我們要以使用它們來輕易完成滾動(dòng)條樣式的定制:
.section { scrollbar-color: #6969dd #e0e0e0; scrollbar-width: thin;}
我想大家都知道,使用 CSS 來美化滾動(dòng)條樣式主要原因之一是因?yàn)闈L動(dòng)條在不同的系統(tǒng)平臺(tái)上顯示有差異,外觀不統(tǒng)一。除此之外,還有另一個(gè)問題。在 Web 上顯示滾動(dòng)條有一個(gè)副作用,那就是 內(nèi)容的布局可能會(huì)根據(jù)滾動(dòng)條的類型而改變。如果我們想防止由滾動(dòng)條引起的一些不必要的布局變化,希望有相應(yīng)的 CSS 屬性來處理。以前沒有,但現(xiàn)在有了。CSS Overflow Module Level 4 新增了一個(gè) scrollbar-gutter 屬性,有了這個(gè)屬性,開發(fā)者就可以更好的控制滾動(dòng)條,或者說解決因滾動(dòng)條類型不同引起布局的差異變化。下圖中展示了 scrollbar-gutter 的取值不同時(shí)的效果:
如果你對(duì)美化滾動(dòng)條以及 scrollbar-gutter相關(guān)的知識(shí)感興趣的話,可以閱讀:
就 Web 布局 而言,雖然 Flexbox 很優(yōu)秀了,但在二維布局中 Flexbox 還是有很大的局限性。在整個(gè) Web 布局的技術(shù)體系中,只有 CSS Grid 才是唯一的二維布局。CSS Grd 布局在這幾年中一直在不斷的向前推進(jìn),已經(jīng)得到了主流瀏覽器的支持。CSS Grid 能這么快向前推進(jìn),除了要感謝瀏覽器廠商的開發(fā)者團(tuán)隊(duì)之外,我個(gè)人認(rèn)為還必須要感謝 @Jen Simmons 和 @Rachel Andrew。
@Jen Simmons 和 @Rachel Andrew 除了是 CSS Grid 規(guī)范的締造者,還是 CSS Grid 布道者,她一直在社區(qū)努力推進(jìn) Grid 向前發(fā)展。
CSS Grid 已經(jīng)有很多年了,該模塊中的很多特性在主流瀏覽器中都得到了支持。在 2021 年,我自已陸續(xù)花了近半年的時(shí)間,對(duì) CSS Grid 技術(shù)進(jìn)行了系統(tǒng)的學(xué)習(xí),并且整理了二十多篇有關(guān)于 CSS Grid 方面的系列教程,在這個(gè)系列中除了 CSS Grid 的理論知識(shí)之外,還有一些實(shí)戰(zhàn)案例。要是你對(duì)這方面感興趣的話,可以從《2022年不能再錯(cuò)過 CSS 網(wǎng)格布局了》一文中索引。這里著重把 CSS 網(wǎng)格中的子網(wǎng)格 subgrid 單獨(dú)拿出來是原因的。子網(wǎng)格從定義到今天,經(jīng)歷了很多個(gè)版本的演變,而且在 CSS 社區(qū)也引起來很大的爭(zhēng)議。在 CSS Grid 出現(xiàn)之后,就有人提出:
在 CSS 網(wǎng)格布局系統(tǒng)中應(yīng)該要有一個(gè)子網(wǎng)格,即 subgrid
為此,最早定義的 subgrid 像 grid 和 inline-grid 一樣,它只是 display 屬性的一個(gè)值:
.subgrid {
display: subgrid;
}
不過沒過多年,subgrid 就從 display 屬性中移除了。使用嵌套網(wǎng)格來模擬子網(wǎng)格:.grid { display: grid; grid-template-columns: repeat(4, 1fr); }
.grid__item { display: grid; grid-template-columns: repeat(4, 1fr);}
簡(jiǎn)單地說,在需要嵌套網(wǎng)格的網(wǎng)格項(xiàng)目上再次使用 display: grid 以及 grid 相關(guān)的屬性重新定義一個(gè)網(wǎng)格。只不過,這種方式也問題存在:很難將嵌套網(wǎng)格項(xiàng)目與父網(wǎng)格對(duì)齊。換句話說,父網(wǎng)格和嵌套網(wǎng)格是兩個(gè)獨(dú)立的網(wǎng)格,他們有著自己獨(dú)立的網(wǎng)格參數(shù)。為了讓子網(wǎng)格能繼續(xù)父網(wǎng)格的相關(guān)參數(shù),才又將 subgrid 再次引入到 CSS Grid 系統(tǒng)中,只不過,subgrid 不再是 display 的值,而是網(wǎng)格屬性 grid-template-columns 或 grid-template-rows 屬性的值。
.grid__container { display: grid; grid-template-columns: 1fr 2fr 3fr 2fr 1fr; grid-template-rows: 1fr 2fr 2fr 1fr; gap: 1rem; } .grid__container--subgrid { grid-column: 2 / 5; grid-row: 2 / 4; } .grid__container--subgrid { display: inherit; grid-template-columns: subgrid; grid-template-rows: subgrid; }
正如上圖所示,這就是subgrid的作用:通過設(shè)置grid-template-columns或grid-template-rows為subgrid,它將與父網(wǎng)格對(duì)齊。真正的子網(wǎng)格可以使用父網(wǎng)格的相關(guān)參數(shù)。簡(jiǎn)單地說,使用該特性,可以輕易實(shí)現(xiàn)像下圖這樣的卡片布局:
還有一段時(shí)間,也有另一種建議,那就是使用 display: contents 來替代 subgrid 。而到今天為止,在網(wǎng)格布局系統(tǒng)中,嵌套網(wǎng)格、子網(wǎng)格和 display: contents 模擬的子網(wǎng)格都同時(shí)存在。他們都有著自己的特性。這里就不花過多時(shí)間闡述了。subgrid已成為 CSS Grid 模塊中不可或缺的一個(gè)特性,直到今天為止(2012年的最后一天),也僅 Firefox 瀏覽器支持。不過,Chrome 已進(jìn)入 WIP 階段,我想 2022 年上半年,你就能在 Chrome 瀏覽器體驗(yàn) subgrid 的效果。
既然提到 CSS Grid,那就順嘴說一下 CSS 的 gap 屬性吧。該屬性不只是 Grid 布局獨(dú)有的,在 CSS Flexbox 、Grid 和多列布局中都有 gap 屬性。在布局中,在某些場(chǎng)景中,給相鄰元素之間設(shè)置間距要比 margin 容易地多。
從 @Jen Simmons 發(fā)的推特消息中可以獲知,Safari 14.1 開始也支持 Flexbox 中的 gap 屬性。我自測(cè)了一下,Grid中的 gap 也得到支持了。也不是說,現(xiàn)在主流瀏覽器都已支持 gap 屬性了:
Web 中有很多控件的 UI 效果是跟隨系統(tǒng)走的。比如表單中的一些控件,比如常用的輸入框(<input>)、單選按鈕,復(fù)選框,進(jìn)度條等。
以往,為了在 UI 的風(fēng)格上能滿足設(shè)計(jì)師的需求,即 所以平臺(tái)上使用風(fēng)格一致的UI效果。為此,Web 開發(fā)者需要增加額外的開發(fā)工作量,采用自定義表單控件的方式來讓 UI 網(wǎng)格統(tǒng)一。為了讓開發(fā)者能更好的滿足設(shè)計(jì)師的需求,并且快速讓各種平臺(tái)統(tǒng)一 UI 網(wǎng)格, CSS Basic User Interface Module Level 4 新增了 accent-color 屬性,可以很輕易的控制 Web 控件 (Widget Accent) UI:
:root { accent-color: deeppink; } @media (prefers-color-scheme: dark) { :root { accent-color: hsl(328 100% 65%); }}
既然提到 Web 表單中的控件,那就給大家提兩個(gè)有關(guān)于 `` 元素的屬性。因?yàn)檫@兩個(gè)屬性能給你的用戶帶來更好的體驗(yàn),特別是在操作表單的時(shí)候。除了給 <input> 元素的 type 指定不同值時(shí),可以提供不同鍵盤類型之外,還可以使用 inputmode 屬性:
inputmode 可以喚起不同類型的軟鍵盤,另一個(gè)改善用戶體驗(yàn)的是給 <input> 元素的 enterkeyhint 屬性設(shè)置不同的值,可以改變軟鍵中的 Enter 鍵的類型的操作行為:
上面提到的,不管是 CSS 還是 HTML 的屬性,都是用來改變用戶體驗(yàn)的。再提一個(gè)和 HTML相關(guān)的屬性。
自Safari 15 開始,我們?cè)?HTML 的 <meta> 標(biāo)簽為 theme-color 設(shè)置顏色,讓瀏覽器自身的 UI 顏色有讓開發(fā)者來控制:
特別聲明,這里的 theme-color 不是 CSS 屬性,他是 HTML 的 <meta> 元素的 name 的一個(gè)值,結(jié)合 content 和 media 能輕易控制系統(tǒng)級(jí)的顏色。
似乎跑題了!我們要聊的是 2022 年的 CSS !嗯!那我們繼續(xù)回到 CSS 的世界中來。
CSS 媒體查詢 @media 已不是什么新特性了(除了新增的一些用戶偏好的條件設(shè)置)。但今天要提出的是他的語法規(guī)則的寫法。先上一張圖吧:
以往在 @media 或者在 @container 規(guī)則中寫判斷條件時(shí)使用 min-width 和 max-width 較多,不知道大家是否和我一樣有這樣的感覺,使用 min-width 和 max-width 很多時(shí)候傻傻分不清楚他們的范圍。為此,我總是喜歡使用下圖來做判斷:
自 CSS Media Queries Level 4 開始,我們可以使用較為熟悉的數(shù)學(xué)表達(dá)式了,在媒體條件中使用 > 、>= 、< 或 <= 等數(shù)學(xué)表達(dá)式:
上圖中使用 @media 語法表達(dá)的話,像下面這樣:
/* Old Way */
@media (max-width: 768px) {
…
}
@media (min-width: 375px) {
…
}
@media (min-width: 375px) and (max-width: 768px) {
...
}
/* New Way */
@media (width <=768px) {
…
}
@media (width >=375px) {
…
}
@media (375px <=width <=768px) {
...
}
同樣的,數(shù)學(xué)比較運(yùn)算符表達(dá)式也同樣可以運(yùn)用于 @container 容器查詢的條件判斷中。
如果你對(duì)媒體查詢方面的知識(shí)感興趣的話,還可以閱讀:
F-mods 是 Font Metrics Override Descriptors(字體度量覆蓋描述符)的簡(jiǎn)稱。它對(duì)應(yīng)著 CSS Fonts Module Level 4 規(guī)范中的 @font-face 部分的第十一小節(jié),即 默認(rèn)的字體度量覆蓋。簡(jiǎn)單地說,在 @font-face 規(guī)則中新增了 ascent-override、descent-override、line-gap-override 和 advance-override 等屬性:
@font-face { font-family: 'Arial' src: local('Arial'); --unitsPerEm: 1000; --lineGap: 10; --descender: -237; --ascender: 1041; --advanceWidthMax: 815; ascent-override: calc(var(--ascender) / var(--unitsPerEm) * 100%); descent-override: calc(var(--descender) / var(--unitsPerEm) * 100%); line-gap-override: calc(var(--lineGap) / var(--unitsPerEm) * 100%); advance-override: calc(var(--advanceWidthMax) / var(--unitsPerEm)); }
其中 advance-override 還未進(jìn)入 W3C 規(guī)范,目前還僅處于提案中;而 ascent-override、descent-override 和 line-gap-override 屬性目前已在 Chromium 87+ 和 Firefox 89+ 中實(shí)現(xiàn)!
這四個(gè)描述符的組合可以讓我們告訴瀏覽器在下載 Web Fonts 之前字符占用多少空間,來覆蓋回退字體(系統(tǒng)字體)的布局,使其與 Web Fonts 相匹配。簡(jiǎn)單地說:這四個(gè)描述符可以讓你的系統(tǒng)字體更接近 Web Fonts!其中 ascent-override、descent-override 和 line-gap-override 描述符使我們 能夠完全消除垂直布局的偏移,因?yàn)檫@三個(gè)描述符都會(huì)影響行高。在 CSS Fonts Module Level 5 規(guī)范中又為 @font-face 規(guī)則添加了幾個(gè)新屬性。比如,用來覆蓋字體上標(biāo)(sup)和下標(biāo)(sub)的 superscript-position-override、subscript-position-override、superscript-size-override 和 subscript-size-override 描述符。雖然這幾個(gè)屬性還沒有得到任何瀏覽器的支持,但對(duì)于 Web 開發(fā)者而言,這是希望。
除此之外,還新增了 size-adjust 描述符,它允許我們調(diào)整字形的比例系數(shù)(百分比)。該描述符取代了前面提到的 advance-override描述符。正如 @Addy Osmani在他自己推特上,是這樣描述 size-adjust:
size-adjust 已經(jīng)得到了 Chromium 92+ 和 Firefox 89+ 的支持。
說到 @font-face 那就有必要提到大家也一直期待的另一個(gè) CSS 特性,那就是 leading-trim:
leading-trim 其主要作用就是用來改變文本布局。
在鉛印刷術(shù)中,為了讓鉛字塊(排成行)之間有一定的間距,排字工人會(huì)在行與行之間墊一些鉛條,讓閱讀變得更舒服一些。在那個(gè)時(shí)代,鍋條一般都放置在鉛塊下方。同樣的,在Web排版上也有鉛條的身影,只不過他分面上下兩個(gè)部分。在CSS中引入該特性,它的工作原理就像一個(gè)文本框剪切刀。去掉文本框上下之間多余的空間(這個(gè)空間其實(shí)就是鉛條高度的一半):
h1 { text-edge: cap alphabetic; leading-trim: both; }
示例中用到了text-edge 屬性,簡(jiǎn)單地用下圖來描述其作用:
開發(fā) Web 時(shí),對(duì)于排版方面是較為復(fù)雜的,涉及到的CSS知識(shí)也較多,如果你感興趣的話,可以閱讀下面這些文章:
這個(gè)和前面提到的 CSS 媒體查詢有點(diǎn)類似。不是 CSS 的新特性,在 CSS Transform Level 2 規(guī)范中把以前用到 transform 屬性的 rotate() 、scale() 、translate() 函數(shù)變成獨(dú)立的 CSS 屬性。而且它們都已經(jīng)成為主流瀏覽器的實(shí)驗(yàn)屬性,能在瀏覽器中體驗(yàn)他們。
element {
scale: 2;
rotate: 30deg;
translate: -50% -50%;
}
平移(translate)、旋轉(zhuǎn)(rotate)和縮放(scale)屬性允許開發(fā)者獨(dú)立地指定簡(jiǎn)單的變換,其方式與典型的用戶界面使用方式一致,而不必記住變換中的順序,使transform()、rotate()和scale()的動(dòng)作保持獨(dú)立并在屏幕坐標(biāo)中發(fā)揮作用。它們被應(yīng)用的順序是,首先是平移,然后是旋轉(zhuǎn),然后是縮放,而不是你定義它們的順序。有了獨(dú)立的變換屬性,這也意味著我們可以對(duì)它們分別進(jìn)行動(dòng)畫和過渡。
@keyframes individual {
50% {
translate: 0 50%;
}
75% {
scale: 1;
}
}
element {
transition: rotate 200ms ease-in-out, scale 500ms linear;
}
element:hover {
scale: 2;
rotate: -3deg;
}
有關(guān)于這方面更詳細(xì)的介紹可以閱讀:
接下來提到的 CSS 特性只是部分瀏覽器的實(shí)驗(yàn)性功能,不會(huì)得到大多數(shù)瀏覽器的支持,或者可能只有在相應(yīng)的瀏覽器中開啟了實(shí)驗(yàn)性功能標(biāo)記才能看到效果。這些特性在 2022 年,甚至是再往后一兩年都有可能得不到所有主流瀏覽器的支持。除了不會(huì)得到瀏覽器支持,而且規(guī)范都有可能會(huì)變更。說不定還會(huì)從 CSS 中移除!
上圖看上去很熟,對(duì)吧!但它不是 SCSS 中的嵌套,是原生 CSS 中的嵌套。在 CSS 方面這算是一個(gè)突破性的補(bǔ)充,也算是繼續(xù) CSS 自定義屬性(CSS 變量)的又補(bǔ)充。以往這樣的規(guī)則,只能在 CSS 的處理器中運(yùn)行。在 CSS 的嵌套模塊中,我們可以使用 & 和 @nest 規(guī)則在一個(gè)樣式規(guī)則塊中嵌套另一個(gè)樣式規(guī)則塊:
table.colortable { & td { text-align: center; &.c { text-transform: uppercase } &:first-child, &:first-child + td { border: 1px solid black } } & th { text-align: center; background: black; color: white; } @nest footer & { font-size: 0.8em; }}
有關(guān)于 CSS 的原生嵌套更多的介紹,可以閱讀《圖解CSS:CSS的嵌套》一文。
CSS Cascading and Inheritance Level 5 中引入了 @layer 規(guī)則,將在 Level 6 中會(huì)引入另一個(gè)規(guī)則 @scope 。這是一種將樣式范圍擴(kuò)大到DOM樹的一種用法。
<!-- HTML -->
<div class="dark-theme">
<a href="#">plum</a>
<div class="light-theme">
<a href="#">also plum???</a>
</div>
</div>
/* 當(dāng).light-theme和.dark-theme被嵌套時(shí),你可能不會(huì)得到預(yù)期的結(jié)果 */
.light-theme a {
color: purple;
}
.dark-theme a {
color: plum;
}
/* 通過范圍劃分,我們可以解決這個(gè)問題,因?yàn)閍元素的樣式將由其最近的范圍來確定 */
@scope (.light-scheme) {
a {
color: darkmagenta;
}
}
@scope (.dark-scheme) {
a {
color: plum;
}
}
@when ... @else 是 CSS Conditional Rules Module Level 5 新增的特性,他們可以分開來單獨(dú)使用,也可以組合在一起使用。
@when media(width >=400px) and media(pointer: fine) and supports(display: flex) {
/* A */
} @else supports(caret-color: pink) and supports(background: double-rainbow()) {
/* B */
} @else {
/* C */
}
@Stefan Judis 將這個(gè)CSS 特性(@when ... @else)有前面提到的 CSS特性,即 CSS 容器查詢 和 媒體查詢的數(shù)學(xué)運(yùn)算表達(dá)式組合在一起,重新設(shè)計(jì)了 @Ahmad Shadeed 的 《Conditional Border Radius In CSS》文章中提到的有條件設(shè)置圓角:
@Stefan Judis 重新設(shè)計(jì)的方案:
有關(guān)于有條件設(shè)置圓角半徑除了這里提到的方案,其實(shí)還有其他的方案,你要是想一探究竟的話,可以閱讀前幾天剛整理的《CSS 中的條件圓角技巧》一文。
這里所說的滾動(dòng)與動(dòng)畫指 Scroll-linked Animations 模塊中提供的 @scroll-timeline規(guī)則和 animation-timeline 屬性。你可以將 CSS 動(dòng)畫與一個(gè)滾動(dòng)容器的滾動(dòng)偏移量關(guān)聯(lián)起來。當(dāng)你向上或向下滾動(dòng)一個(gè)容器時(shí),鏈接的動(dòng)畫將相應(yīng)的前進(jìn)或后退。
使用 @scroll-timeline 規(guī)則和 animation-timeline 構(gòu)建類似上面的效果,要以按下面三步來走:
/* (1) Define Keyframes */
@keyframes adjust-progressbar {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
/* (2) Define a ScrollTimeline */
@scroll-timeline scroll-in-document {
source: auto;
orientation: block;
scroll-offsets: 0, 100%;
}
/* (3) Attach the Animation + set the ScrollTimeline as the driver for the Animation */
#progressbar {
animation: 1s linear forwards adjust-progressbar;
animation-timeline: scroll-in-document;
}
有關(guān)于這方面更詳細(xì)的介紹,可以閱讀 @Bramus 提供的系列教程:
@property 是用來注冊(cè)一個(gè)變量的,該變量是一個(gè) CSS Houdini 中的變量,但它的使用和 CSS 中的自定義屬性(CSS變量)是一樣的,不同的是注冊(cè)方式:
// Chrome 78+
// 需要在 JavaScript腳本中注冊(cè)
CSS.registerProperty({
'name': '--custom-property-name',
'syntax': '<color>',
'initialValue': 'black',
'inherits': false
})
// Chrome 85+
// 在CSS文件中注冊(cè)
@property --custom-property-name {
'syntax': '<color>',
'initialValue': 'black',
'inherits': false
}
他的最大特色之一就是可以指定已注冊(cè)的 CSS 變量的類型、初始值,是否可繼承:
雖然它的使用方式和 CSS 的自定義屬性相似,但它要更強(qiáng)大,特別是在動(dòng)效方面的使用,能增強(qiáng) CSS 的動(dòng)效能力,甚至實(shí)現(xiàn)一些以前 CSS 無法實(shí)現(xiàn)的動(dòng)效。比如
@property --milliseconds {
syntax: '<integer>';
initial-value: 0;
inherits: false;
}
.counter {
counter-reset: ms var(--milliseconds);
animation: count 1s steps(100) infinite;
}
@keyframes count {
to {
--milliseconds: 100;
}
}
把它和 CSS Houdini 的 Paint API 結(jié)合起來,可做的事情更多:
更多這方向的效果可以在 houdini.how 網(wǎng)站上查閱:
CSS Houdini 中的 @property 和 Paint API 是對(duì)現(xiàn)在 CSS 能力的擴(kuò)展,如果你對(duì)這方面感興趣的話,可以閱讀:
瀑布流是 Web 中經(jīng)典布局之一。到目前為止依舊是 JavaScript 實(shí)現(xiàn)的瀑布流布局為主要技術(shù)方案,雖然使用 CSS 技術(shù)在一定條件之下可以完成瀑布流布局,但其局限性也較大。在 CSS Grid 最新模塊中提供了原生的 CSS 瀑布流布局方案:
.masonry {
display: grid; gap: 20px;
grid: masonry / repeat(auto-fill, minmax(250px, 1fr));
}
但一直以來他還只是 Firefox 中的一個(gè)實(shí)驗(yàn)屬性,還沒有看到其他瀏覽器有支持,但我期望在 2022 年的某一天能在主流瀏覽器上都能看到 CSS Grid 實(shí)現(xiàn)瀑布流的布局的效果。
上面列出的一些 CSS 新特性(也有新語法),具體有哪些新特性能在 2022 年中出現(xiàn)在瀏覽器中,還不得而知。上面的提到的一些特性其實(shí)已經(jīng)在一個(gè)或多個(gè)瀏覽器中能體驗(yàn)了。感興趣的可以自己嘗試一下。另外要特別提出的是,上面列的 CSS 屬性清單來自于社區(qū)有同行業(yè)專家以及我自己的一些積累和見解,如果有不對(duì)之處,歡迎一起探討。如果所列清單有遺漏,也歡迎大家分享出來。最后,希望上面的內(nèi)容能幫助大家了解 CSS 的一些新東西,打開一些未知領(lǐng)域!謝謝!(^_^)
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。