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 中文字幕在线精品,韩国一级片视频,国产一级毛片免

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          B站接入層網(wǎng)絡(luò)演進(jìn)實(shí)踐

          B站接入層網(wǎng)絡(luò)演進(jìn)實(shí)踐

          期作者

          嗶哩嗶哩系統(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è)施。

          01 網(wǎng)絡(luò)設(shè)計(jì)背景

          1.1 穩(wěn)定性和擴(kuò)展性

          在設(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í)施。

          1.2 帶寬和流量模式

          隨著視頻化時(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è)備端口密度等等。

          1.3 成本優(yōu)化

          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)方式:

          • 統(tǒng)一所有的網(wǎng)絡(luò)元素,最好使用相同的硬件類型或相同的設(shè)備。執(zhí)行批量采購的同時(shí),引入多家網(wǎng)絡(luò)設(shè)備供應(yīng)商,充分競(jìng)爭(zhēng),從而達(dá)到降低成本的目的。
          • 為了豐富廠商的多樣性,需要制定標(biāo)準(zhǔn)的網(wǎng)絡(luò)參數(shù)要求。這一措施大大提高了廠商選擇的靈活性,同時(shí)為白盒化設(shè)備提供基本的技術(shù)指標(biāo)。

          1.4 高效運(yù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ò)崩潰的概率。

          02 B站接入層結(jié)構(gòu)演進(jìn)

          2.1 DCN V1.0網(wǎng)絡(luò)結(jié)構(gòu)

          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)。

          風(fēng)險(xiǎn)一:軟件風(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)定性。

          風(fēng)險(xiǎn)二:分裂風(fēng)險(xiǎ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ù)已不再使用。

          2.2 DCN V2.0網(wǎng)絡(luò)結(jié)構(gòu)

          為了解決堆疊方案的問題,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)中還是存在以下問題:

          • 收斂比:指單臺(tái)網(wǎng)絡(luò)設(shè)備的上行與下行帶寬比例,一般按不同的業(yè)務(wù)應(yīng)用設(shè)計(jì)不同收斂比,很難做到1:1的收斂比。由此帶來的運(yùn)維問題是需要隨時(shí)監(jiān)控Spine上行帶寬容量,達(dá)到預(yù)定閾值時(shí)需要及時(shí)擴(kuò)容帶寬;
          • 擴(kuò)展性:因Spine使用高功率框式交換機(jī),在IDC機(jī)房包間擴(kuò)容時(shí),只能采購指定品牌交換機(jī)的業(yè)務(wù)板卡,不利于擴(kuò)展,另外由于整個(gè)機(jī)框的端口密度受限,也會(huì)限制整個(gè)DCN規(guī)模擴(kuò)展;
          • 高電柜:現(xiàn)有框式交換機(jī)由于整機(jī)功率高,對(duì)機(jī)房環(huán)境有硬性要求,機(jī)房物理機(jī)柜、電力、空調(diào)等均需要按需求進(jìn)行改造。引入額外成本支持,同時(shí)改造完后機(jī)房?jī)?nèi)可能還是存在機(jī)房?jī)?nèi)局部過熱情況;
          • 心跳線:組網(wǎng)中接入層雖然由原來的堆疊升級(jí)到M-LAG技術(shù)進(jìn)行組網(wǎng),但同樣兩臺(tái)設(shè)備需要通過心跳線控制兩臺(tái)交換機(jī)同步數(shù)據(jù),始終未做到接入層設(shè)備獨(dú)立的情況,在設(shè)備升級(jí)和日常運(yùn)維中還是會(huì)帶來不少挑戰(zhàn);
          • OPEX&CAPEX高:框式設(shè)備對(duì)軟件特征的要求高,限制了選擇廠商設(shè)備的靈活性,無法充分引入競(jìng)爭(zhēng);維護(hù)多種芯片架構(gòu),增加了測(cè)試、培訓(xùn)、維護(hù)的要求。

          基于以上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)。

          03 DCN V3.0網(wǎng)絡(luò)結(jié)構(gòu)

          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)說明:

          • 組網(wǎng)中相關(guān)名詞解釋:接入層交換機(jī)ASW(Access Switch),匯聚層交換機(jī)PSW(Polymerizes Switch),分發(fā)層交換機(jī)DSW(Distribute Switch);
          • POD內(nèi)部的ASW/PSW/DSW 網(wǎng)絡(luò)設(shè)備使用同種規(guī)格芯片(當(dāng)前主流使用的Tomahawk3芯片),均為盒式交換機(jī),設(shè)備輕便,易安裝使用;
          • 服務(wù)器萬兆接入場(chǎng)景下,單Server-Pod包含4臺(tái)PSW和64臺(tái)ASW,PSW上下行帶寬收斂比達(dá)到1:1,單個(gè)POD支持64組機(jī)柜,按單機(jī)柜20臺(tái)服務(wù)器接入,單POD最大可支持1200臺(tái)服務(wù)器規(guī)模;
          • 服務(wù)器25G接入場(chǎng)景下,單Server-Pod包含8臺(tái)PSW和64臺(tái)ASW,保持PSW上下行帶寬收斂比1:1的同時(shí),25G接入場(chǎng)景下單個(gè)POD服務(wù)器規(guī)模容量不變;
          • 單個(gè)POD內(nèi)的服務(wù)器規(guī)模可以根據(jù)業(yè)務(wù)需求變更PSW的上下行收斂比,做到單個(gè)Server-POD容量規(guī)模更大,同時(shí)可橫向靈活擴(kuò)展Server-POD數(shù)量,支撐整個(gè)機(jī)房的規(guī)模應(yīng)用;
          • 整個(gè)組網(wǎng)去框化,機(jī)房現(xiàn)場(chǎng)無需改造機(jī)柜電力、空調(diào)等物理環(huán)境,直接使用現(xiàn)有普通機(jī)柜就可滿足,且避免了局部過熱的情況;
          • POD中兩臺(tái)ASW為一組,中間無心跳線連接,兩臺(tái)設(shè)備完全獨(dú)立,服務(wù)器接入層通過Bond接入,開啟雙發(fā)ARP特性,組網(wǎng)去堆疊化;
          • 組網(wǎng)成本上,在相同收斂比的情況下,Capex采購成本相比上一代網(wǎng)絡(luò)顯著降低,達(dá)到降本增效的目的;
          • 超大規(guī)模機(jī)房引入Cluster概念的方式進(jìn)行擴(kuò)展,同時(shí)在機(jī)房?jī)?nèi)部增加SuperSpine平面,支持整個(gè)機(jī)房規(guī)模容量擴(kuò)展。

          3.1 組網(wǎng)參數(shù)優(yōu)化

          3.1.1 ARP配置優(yōu)化

          • 接入層ASW開啟ARP Proxy功能,抑制同一臺(tái)交換機(jī)下的服務(wù)器通過二層直接轉(zhuǎn)發(fā)流量;
          • 接入層交換機(jī)ASW更改業(yè)務(wù)網(wǎng)段的VLAN MAC地址,指定兩臺(tái)ASW設(shè)置相同的MAC地址,用于交換機(jī)轉(zhuǎn)發(fā)流量到服務(wù)器;
          • 接入層ASW開啟加快ARP超時(shí)時(shí)間設(shè)置,默認(rèn)ARP超時(shí)時(shí)間各廠家不完全相同,統(tǒng)一配置ARP超時(shí)參數(shù),加快ARP表項(xiàng)更新,避免故障情況下產(chǎn)生路由黑洞的可能性。

          3.1.2 ASW風(fēng)暴抑制

          • 接入層ASW下聯(lián)服務(wù)器的聚合接口抑制二層廣播轉(zhuǎn)發(fā)/組播、二層未知單播轉(zhuǎn)發(fā),使得全網(wǎng)不存在二層轉(zhuǎn)發(fā)流量,實(shí)現(xiàn)全路由轉(zhuǎn)發(fā)。

          3.1.3 LACP配置優(yōu)化

          • LACP,即鏈路匯聚控制協(xié)議,全稱: Link Aggregation Control Protocol ;
          • 服務(wù)器為默認(rèn)采用Bond Mode 4,部分場(chǎng)景存在Bond Mode 0的情況;
          • ASW與服務(wù)器對(duì)接的聚合口需要設(shè)置相同LACP SystemID,對(duì)端的設(shè)備在邏輯上認(rèn)為收到是LACPDU 報(bào)文是從同一臺(tái)設(shè)備上發(fā)出;
          • ASW內(nèi)兩臺(tái)ASW設(shè)置不同的LACP Device ID,使得服務(wù)器看到LACP成員端口編號(hào)不同;
          • 由于部分業(yè)務(wù)的特殊性,服務(wù)器網(wǎng)卡工作在Bond Mode 0場(chǎng)景下以充分利用網(wǎng)卡帶寬。

          3.1.4 DHCP配置優(yōu)化

          • DHCP,即動(dòng)態(tài)主機(jī)配置協(xié)議,全稱: Dynamic Host Configuration Protocol ;
          • ASW設(shè)備的DHCP請(qǐng)求開啟option 82特性,將DHCP relay source ip設(shè)置為本機(jī)loopback地址,避免dhcp server回包異常。

          3.1.5 Hash配置優(yōu)化

          • B站DCN 3.0網(wǎng)絡(luò)結(jié)構(gòu)中,由于DSW、PSW、ASW設(shè)備采用相同的芯片,因此存在HASH極化的風(fēng)險(xiǎn),甚至在采用二層鏈路捆綁的情況下會(huì)加劇HASH極化的可能性。為避免出現(xiàn)Hash極化,所有設(shè)備均配置負(fù)載分擔(dān)模式為五元組,即sip+dip+sport+dport,并調(diào)整ASW、PSW、DSW設(shè)備的偏移參數(shù)algorithm。

          3.1.6 BGP配置優(yōu)化

          • 全網(wǎng)運(yùn)行EBGP路由協(xié)議,并根據(jù)實(shí)際情況不同路由類型的優(yōu)先級(jí);
          • 全網(wǎng)根據(jù)不同的業(yè)務(wù)類型將不同的路由條目設(shè)置Community屬性;
          • 接入層ASW開啟ARP轉(zhuǎn)32位主機(jī)路由,并通過BGP重分發(fā)至網(wǎng)絡(luò),且設(shè)置community屬性在DCN網(wǎng)內(nèi)傳遞;
          • 所有設(shè)備開啟BGP Balance特性,默認(rèn)情況下流量經(jīng)過ECMP進(jìn)行負(fù)載分擔(dān)。

          3.1.7 服務(wù)器網(wǎng)絡(luò)配置

          • 服務(wù)器網(wǎng)卡默認(rèn)工作在Bond Mode4,部分特殊場(chǎng)景工作在Bond Mode0;
          • 服務(wù)器重新編譯ARP內(nèi)核模塊,使服務(wù)器雙網(wǎng)口支持ARP報(bào)文雙發(fā)能力,目的是讓接入層兩臺(tái)不同的ASW同時(shí)學(xué)習(xí)到服務(wù)器ARP地址,形成流量負(fù)載分擔(dān)能力;
          • 當(dāng)服務(wù)器接入層發(fā)生DOWN/UP時(shí),在監(jiān)控到網(wǎng)口UP后加入Bond同時(shí)批量發(fā)送本 Server的所有ARP到兩個(gè)Bond成員口,同步ARP表項(xiàng),解決單向流量問題。

          3.1.8 Failover配置優(yōu)化

          • 當(dāng)ASW的上聯(lián)接口全部DOWN時(shí),下行接入服務(wù)器無法感知到,服務(wù)器會(huì)繼續(xù)向故障接入交換機(jī)發(fā)送數(shù)據(jù),此時(shí)由于ASW的上行端口全DOWN,交換機(jī)會(huì)將數(shù)據(jù)包全部丟棄,造成網(wǎng)絡(luò)異常。開啟ASW上下行接口Monitor-Link功能來規(guī)避此問題,當(dāng)上行接口全部故障時(shí),關(guān)閉下行接口。同時(shí)當(dāng)上行接口UP時(shí),下行接口也做延遲UP,預(yù)留一定時(shí)間供設(shè)備路由協(xié)議收斂,以避免出現(xiàn)路由黑洞的情況產(chǎn)生。

          04 未來展望

          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ù)。

          參考文獻(xiàn)

          [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ù)局網(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 新特性方面的文章了,另外兩篇是(可自行搜索):

          • 2020年CSS有哪些新特性
          • 應(yīng)用于下一代Web的樣式
          • 2021年你可能不知道的 CSS 特性

          你即將看到是 2022 年的,你會(huì)發(fā)現(xiàn)這三篇文章提到的 CSS 特性有相同的,但他們也是有變化的。

          回顧近兩年的 CSS 發(fā)展

          @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ù)往下閱讀!

          熱門的 CSS 特性

          在這節(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 容器查詢

          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容器查詢
          • 容器查詢中的 container@container
          • 容器查詢給設(shè)計(jì)帶來的變化
          • 現(xiàn)代Web技術(shù)讓我們離容器查詢更近一步

          CSS的父選擇器:has()

          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 選擇器Level 4
          • 再聊CSS的屬性選擇器
          • CSS偽選擇器::empty vs :blank
          • CSS3 選擇器:偽類選擇器
          • CSS3 選擇器:屬性選擇器
          • CSS3 選擇器:基本選擇器

          @layer控制 CSS 的級(jí)聯(lián)層

          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:CSS層疊和繼承
          • 聊聊CSS中的層疊相關(guān)概念
          • 管理CSS層疊
          • Web布局:CSS定位和層疊控制

          顏色函數(shù)

          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ì)拿redwhitegreenwhite 進(jìn)行對(duì)比,其中 greenwhite 對(duì)比度最高,最終會(huì)取 green 顏色:

          你也還可以像這樣使用:color-contrast(wheat vs tan, sienna, #d2691e to AA-large) 。它會(huì)將 wheattansienna#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 顏色更多介紹,可以閱讀:

          • 圖解CSS: CSS 顏色
          • A11Y 101:顏色對(duì)比度和Web可訪問性
          • 使用 color-mod() 函數(shù)修改顏色

          視窗單位

          ”視窗單位“對(duì)于大家來說應(yīng)該不會(huì)感到陌生了,特別是針對(duì)移動(dòng)端開發(fā)的同學(xué)來說。因?yàn)橐苿?dòng)端現(xiàn)在主流的適配方案之一就是采用視窗單位來處理的。但很多同學(xué)所知道的視窗單位應(yīng)該只是 vwvhvminvmax

          視窗單位給移動(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)問題以及解決方案感興趣的話,還可以移步閱讀:

          • The trick to viewport units on mobile
          • Does Safari 15 finally fix viewport height?
          • CSS fix for 100vh in mobile Webkit
          • A Bashfuul Button Worth Million
          • 100vh in Safari on iOS

          如果你不想花過多時(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)系的新單位:

          • svh/svw:小視窗高度(height)、寬度(width)的 1%
          • lvh/lvw:大視窗高度(height)、寬度(width)的 1%
          • dvh/dwv:動(dòng)態(tài)視窗高度(height)、寬度(width)的 1%

          也有相應(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 新增的 lhrlh 吧。

          簡(jiǎn)單地回憶一下 CSS 中另一對(duì)單位:emrem 。稍微了解 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è)新增的 lhrlhemrem 非常的相似,只不過他們相對(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ì)不齊。那么,有了 lhrlh 之后,事情會(huì)變得好一點(diǎn)。比如下圖這樣的場(chǎng)景:

          以前上圖這樣的標(biāo)記,常把寬高設(shè)置為 1em ,那么現(xiàn)在可以設(shè)置 1lh

          ::marker {
              width: 1lh;
              height: 1lh;
          }
          

          到目前為止,僅 Safari TP 105 聲稱支持這兩個(gè)相對(duì)單位 lhrlh 。前面提到 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容器查詢的單位主要有:

          • cqw:等于查詢?nèi)萜鲗挾龋?span style="color: #6A737D; --tt-darkmode-color: #6A737D;">width)的 1%
          • cqh:等于查詢?nèi)萜鞲叨龋?span style="color: #6A737D; --tt-darkmode-color: #6A737D;">height)的 1%
          • cqi:等于查詢?nèi)萜鲀?nèi)聯(lián)尺寸(inline-size)的 1%
          • cqb:等于查詢?nèi)萜鲏K尺寸(block-size)的 1%
          • cqmincqicqb 中較小的那個(gè)(也可以是 cqwcqh 中較小的那個(gè))
          • cqmaxcqicqb 中較大的那個(gè)(也可以是 cqwcqh 中較大的那個(gè))

          早其容器查詢的單位定義的是 c*(比如,cwchcmincmax )之類的,但其中有些單位會(huì)和 ch 單位產(chǎn)生沖突,因此,最終確定的容器查詢單位是以 cq* 開始的。也就是上面所列的幾個(gè)!

          正如 @Miriam Suzanne(最初提出建議的人,也是規(guī)范的編輯)所分享的,這些 CSS 單位是Chromium中實(shí)驗(yàn)性容器查詢支持的一部分。

          更為有趣的是,@Ahmad Shadeed 在他的文章《CSS Container Query Units》一文中提出 qwqhqminqmax 以及他們對(duì)應(yīng)的邏輯屬性的單位qiqb

          @Ahmad Shadeed 使用這些新的CSS單位運(yùn)用在 font-size 上。可以用于容器查詢的一坨 CSS 代碼,在clamp() 比較函數(shù)中使用cqw 單位來取代。

          過度滾動(dòng)行為:overscroll-behavior

          早在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-colorscrollbar-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í)感興趣的話,可以閱讀:

          • Custom Scrollbars In CSS
          • Prevent unwanted Layout Shifts caused by Scrollbars with the scrollbar-gutter CSS property

          CSS網(wǎng)格的subgrid

          就 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

          為此,最早定義的 subgridgridinline-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-columnsgrid-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-columnsgrid-template-rowssubgrid,它將與父網(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 屬性了:

          accent-color

          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-widthmax-width 較多,不知道大家是否和我一樣有這樣的感覺,使用 min-widthmax-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í)感興趣的話,還可以閱讀:

          • 圖解CSS: CSS媒體查詢
          • CSS媒體查詢新特性
          • 系統(tǒng)偏好設(shè)置的那些事兒

          F-mods

          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-overridedescent-overrideline-gap-overrideadvance-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-overridedescent-overrideline-gap-override 屬性目前已在 Chromium 87+ 和 Firefox 89+ 中實(shí)現(xiàn)!

          這四個(gè)描述符的組合可以讓我們告訴瀏覽器在下載 Web Fonts 之前字符占用多少空間,來覆蓋回退字體(系統(tǒng)字體)的布局,使其與 Web Fonts 相匹配。簡(jiǎn)單地說:這四個(gè)描述符可以讓你的系統(tǒng)字體更接近 Web Fonts!其中 ascent-overridedescent-overrideline-gap-override 描述符使我們 能夠完全消除垂直布局的偏移,因?yàn)檫@三個(gè)描述符都會(huì)影響行高。在 CSS Fonts Module Level 5 規(guī)范中又為 @font-face 規(guī)則添加了幾個(gè)新屬性。比如,用來覆蓋字體上標(biāo)(sup)和下標(biāo)(sub)的 superscript-position-overridesubscript-position-overridesuperscript-size-overridesubscript-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í)也較多,如果你感興趣的話,可以閱讀下面這些文章:

          • Web Fonts 的優(yōu)化:Web Fonts vs. 系統(tǒng)字體
          • Web Fonts 的優(yōu)化:FOUT, FOIT 和 FOFT
          • Web Fonts 的優(yōu)化:Web Fonts 字體加載策略
          • Web Fonts 的優(yōu)化:F-mods
          • 深入了解CSS字體度量,行高和vertical-align
          • 字體變體font-variation-*
          • 圖解CSS: 變量字體
          • CSS的 leading-trim 給排版帶來的變化

          下一代CSS Transform

          這個(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的Transform
          • CSS3 3D Transform
          • CSS3 2D Transform

          實(shí)驗(yàn)性屬性

          接下來提到的 CSS 特性只是部分瀏覽器的實(shí)驗(yàn)性功能,不會(huì)得到大多數(shù)瀏覽器的支持,或者可能只有在相應(yīng)的瀏覽器中開啟了實(shí)驗(yàn)性功能標(biāo)記才能看到效果。這些特性在 2022 年,甚至是再往后一兩年都有可能得不到所有主流瀏覽器的支持。除了不會(huì)得到瀏覽器支持,而且規(guī)范都有可能會(huì)變更。說不定還會(huì)從 CSS 中移除!

          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作用域:@scope

          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

          @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)畫

          這里所說的滾動(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 提供的系列教程:

          • Part 1: Introduction + Basic Scroll-Linked Animations
          • Part 2: Scroll-Linked Animations with Element-based offsets
          • Part 3: Practical Use-Cases
          • Part 4: Scroll-Linked Animations With the Web Animations API (WAAPI)

          CSS Houdini 變量:@property

          @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ì)這方面感興趣的話,可以閱讀:

          • CSS Houdini自定義屬性 @property 給動(dòng)效帶來的擴(kuò)展
          • CSS Houdini: @property 注冊(cè)自定義屬性
          • CSS Houdini:深入理解CSS自定義屬性
          • CSS Paint API給CSS的擴(kuò)展帶來了曙光
          • CSS Paint API

          瀑布流布局

          瀑布流是 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)瀑布流的布局的效果。

          小結(jié)

          上面列出的一些 CSS 新特性(也有新語法),具體有哪些新特性能在 2022 年中出現(xiàn)在瀏覽器中,還不得而知。上面的提到的一些特性其實(shí)已經(jīng)在一個(gè)或多個(gè)瀏覽器中能體驗(yàn)了。感興趣的可以自己嘗試一下。另外要特別提出的是,上面列的 CSS 屬性清單來自于社區(qū)有同行業(yè)專家以及我自己的一些積累和見解,如果有不對(duì)之處,歡迎一起探討。如果所列清單有遺漏,也歡迎大家分享出來。最后,希望上面的內(nèi)容能幫助大家了解 CSS 的一些新東西,打開一些未知領(lǐng)域!謝謝!(^_^)


          主站蜘蛛池模板: 亚洲免费一区二区| 久久精品一区二区国产| 中文人妻无码一区二区三区| 国产精品日本一区二区在线播放| 一区二区三区精密机械| 国产免费一区二区三区在线观看| 国模视频一区二区| 精品欧洲av无码一区二区三区| 久久久99精品一区二区| 国产成人精品一区二区三在线观看| 2022年亚洲午夜一区二区福利| 中文字幕在线一区| 人妻无码一区二区三区四区| 精产国品一区二区三产区| 国产精品香蕉在线一区| 人妻激情偷乱视频一区二区三区| 中日av乱码一区二区三区乱码| 亚洲国产av一区二区三区| 波多野结衣一区二区三区88| 国产综合精品一区二区| 精品一区二区ww| 国产在线精品一区二区| 国模精品一区二区三区视频| 日本免费一区尤物| 乱人伦一区二区三区| 日韩精品一区二区三区影院| 精品天海翼一区二区| 亚洲AV无码一区二区三区国产| 无码精品人妻一区二区三区影院| 国产在线精品一区二区在线看| 色一情一乱一伦一区二区三区日本 | 精品动漫一区二区无遮挡| 精品一区高潮喷吹在线播放| 亚洲国产一区在线观看| 亚洲日韩国产欧美一区二区三区 | 视频一区二区在线观看| 日韩精品一区二区三区中文字幕 | 人体内射精一区二区三区| 日韩高清国产一区在线 | 一区三区三区不卡| 亚洲日韩国产精品第一页一区|