這里是云端源想IT,幫你輕松學(xué)IT”
嗨~ 今天的你過得還好嗎?
天不言而四時(shí)行,
地不語(yǔ)而百物生。
- 2024.03.11 -
在數(shù)字世界的構(gòu)建中,字體不僅僅是文字的外衣,更是情感和風(fēng)格的傳遞者。作為網(wǎng)頁(yè)設(shè)計(jì)師和前端開發(fā)者,掌握HTML中的字體標(biāo)簽,能夠讓我們創(chuàng)造出更加豐富和吸引人的用戶體驗(yàn)。
今天,就讓我們一起走進(jìn)HTML字體標(biāo)簽的世界,探索它們?nèi)绾巫尵W(wǎng)頁(yè)變得生動(dòng)有趣。
語(yǔ)法結(jié)構(gòu):<標(biāo)簽 屬性=“值”> 內(nèi)容 </標(biāo)簽>
1、標(biāo)題標(biāo)簽< h1> - < h6>
標(biāo)題標(biāo)簽的默認(rèn)樣式是自動(dòng)加粗的,字體一級(jí)標(biāo)題最大,六級(jí)標(biāo)題最小,每個(gè)標(biāo)題標(biāo)簽獨(dú)占一行。
示例:
<h1>一級(jí)</h1>
<h2>二級(jí)</h2>
<h3>三級(jí)</h3>
<h4>四級(jí)</h4>
<h5>五級(jí)</h5>
<h6>六級(jí)</h6>
2、字體標(biāo)簽<font>
在HTML中,最常用的字體標(biāo)簽非<font>莫屬,雖然現(xiàn)代開發(fā)中更推薦使用CSS來控制字體樣式,但了解它的歷史仍然有其必要性。<font>標(biāo)簽允許我們通過color、size和face屬性來改變字體的顏色、大小和類型。
例如,如果我們想要顯示紅色Arial字體的文字,我們可以這樣寫:
<font color="red" size="5" face="Arial">這是紅色Arial字體的文字</font>
這行代碼的意思是:
注意:雖然標(biāo)簽在HTML4.01中是有效的,但在HTML5中已經(jīng)被廢棄,建議使用CSS來進(jìn)行樣式定義。
3、字號(hào)大?。?lt;font size="n">
字號(hào)大小在網(wǎng)頁(yè)設(shè)計(jì)中同樣重要,它直接影響著閱讀體驗(yàn)。HTML允許我們通過<font size="n">來調(diào)整字體的大小,其中“n”可以是1到7的數(shù)字。
例如:
<!DOCTYPE html>
<html>
<head>
<title>Font Size Example</title>
</head>
<body>
<p><font size="5">This is a paragraph with font size 5.</font></p>
<p><font size="10">This is a paragraph with font size 10.</font></p>
<p><font size="15">This is a paragraph with font size 15.</font></p>
</body>
</html>
運(yùn)行結(jié)果:
不過,現(xiàn)代網(wǎng)頁(yè)設(shè)計(jì)更傾向于使用CSS來控制字號(hào),以便更精細(xì)地調(diào)整字體大小。
4、粗體標(biāo)簽
<b>:這個(gè)標(biāo)簽用于將文本加粗顯示,相當(dāng)于英文中的bold。它不會(huì)改變字體,只是使文本看起來更粗體。
<p><b>這是加粗的文本</b></p>
<strong>:與<b>標(biāo)簽類似,<strong>標(biāo)簽也用于表示加粗的文本。
<p><strong>這是重要的文本</strong></p>
但在HTML5中,<strong>標(biāo)簽被賦予了語(yǔ)義,用來表示重要的文本內(nèi)容。
5、斜體字標(biāo)簽
<i>:這個(gè)標(biāo)簽用于將文本設(shè)置為斜體,相當(dāng)于英文中的italic。
<p><i>這是斜體的文本</i></p>
<em>:與<i>標(biāo)簽類似,<em>標(biāo)簽也用于表示斜體文本。
<p><em>這是強(qiáng)調(diào)的文本</em></p>
但在HTML5中,<em>標(biāo)簽被賦予了語(yǔ)義,用來表示強(qiáng)調(diào)的文本內(nèi)容。
6、刪除字標(biāo)簽
<del>:這個(gè)標(biāo)簽用于表示刪除的文本,常用于表示不再準(zhǔn)確或已過時(shí)的內(nèi)容。比如原價(jià)與現(xiàn)價(jià)。
<p>原價(jià):<del>100元</del></p>
<p>現(xiàn)價(jià):80元</p>
運(yùn)行之后是這樣子的:
在上述示例中,原價(jià)為100元,但已被刪除,因此使用標(biāo)簽將其包圍起來。這樣,瀏覽器會(huì)顯示刪除線來表示該文本已被刪除。
7、文本格式化標(biāo)簽 < div> < span>
< div> 標(biāo)簽用來布局,但是一行只能放一個(gè)< div> //大盒子,塊元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>這是一個(gè)div</div>
<div>這是一個(gè)div</div>
<div>
<p>這是一個(gè)div</p>
</div>
<p>
<div>云端源想</div>
</p>
</body>
</html>
如上圖控制臺(tái)所示(打開控制臺(tái)的方式:F12):<div>標(biāo)簽里面可以包含<p>標(biāo)簽,<p>標(biāo)簽,里面不可以放<div>標(biāo)簽。
< span> 標(biāo)簽用來布局,一行上可以多個(gè) < span>//小盒子,行元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<span>1234</span>
<span>5678</span>
</body>
</html>
8、其它字體標(biāo)簽
<mark>:這個(gè)標(biāo)簽用于突出顯示文本,通常用于表示高亮的部分。
<small>:這個(gè)標(biāo)簽用于表示小號(hào)文本,通常用于表示版權(quán)聲明或法律條款等次要信息。
<ins>:這個(gè)標(biāo)簽用于表示插入的文本,常用于表示新增的內(nèi)容。
<sub> 和 <sup>:這兩個(gè)標(biāo)簽分別用于表示下標(biāo)和上標(biāo)文本,常用于數(shù)學(xué)公式或化學(xué)方程式中。
盡管上述標(biāo)簽可以直接在HTML中使用,但現(xiàn)代網(wǎng)頁(yè)設(shè)計(jì)越來越傾向于使用CSS來控制文本的樣式,因?yàn)镃SS提供了更多靈活性和控制能力。
使用CSS類和樣式規(guī)則可以更有效地管理網(wǎng)站的整體樣式,并且可以更容易地適應(yīng)不同設(shè)備和屏幕尺寸。
因此,如果您正在學(xué)習(xí)或更新您的網(wǎng)頁(yè)設(shè)計(jì)知識(shí),建議學(xué)習(xí)和使用CSS來控制字體和其他文本樣式,關(guān)于HTML的這些標(biāo)簽了解一下就可以了。
總之,字體是網(wǎng)頁(yè)設(shè)計(jì)中不可或缺的元素,它們就像是網(wǎng)頁(yè)的語(yǔ)言,傳遞著信息和情感。通過HTML字體標(biāo)簽的學(xué)習(xí)和應(yīng)用,我們可以讓我們的網(wǎng)頁(yè)“字”得其樂,讓每一位訪問者都能享受到更加美妙的網(wǎng)絡(luò)體驗(yàn)。不斷探索和實(shí)踐,讓我們的網(wǎng)頁(yè)在字體的世界里綻放光彩吧!
今天就先講到這里了,
更多前端開發(fā)基礎(chǔ)知識(shí)點(diǎn)擊文末閱讀原文查看哦!
記得關(guān)注【云端源想IT】一起學(xué)編程!
我們下期再見!
END
文案編輯|云端學(xué)長(zhǎng)
文案配圖|云端學(xué)長(zhǎng)
內(nèi)容由:云端源想分享
貫徹落實(shí)《中共廣西壯族自治區(qū)委員會(huì)組織部關(guān)于繼續(xù)抓好2022年“將〈紅色傳奇〉進(jìn)行到底”系列活動(dòng)的通知》的精神,決定在全市單位、社區(qū)、農(nóng)村、校園開展“將《紅色傳奇》進(jìn)行到底”征文、書法、繪畫、誦讀評(píng)比活動(dòng)。
一、參賽作品類別及相關(guān)要求
(一)征文作品
1.內(nèi)容要求
(1)著重圍繞《紅色傳奇》紀(jì)錄片和《紅色傳奇》《傳承紅色基因 爭(zhēng)做時(shí)代新人》等系列讀本的相關(guān)人物、事件、精神,結(jié)合清廉柳州建設(shè)等內(nèi)容進(jìn)行創(chuàng)作;
(2)文章體裁不限,要求主題鮮明、內(nèi)容充實(shí)、中心突出,符合社會(huì)主義核心價(jià)值觀;
(3)每位參賽者最多可提交1篇作品;
(4)必須由本人獨(dú)立撰寫,不能抄襲他人作品;
(5)小學(xué)組、中學(xué)組參賽作品需由指導(dǎo)老師在活動(dòng)主題網(wǎng)站報(bào)名頁(yè)面的“推薦意見”欄內(nèi)寫上100—200字的評(píng)語(yǔ)和推薦意見。
2.格式要求
(1)字?jǐn)?shù)要求
小學(xué)組(1—6年級(jí)):不超過800字;
中學(xué)組(7—12年級(jí)):800—1500字;
成人組:1500—2500字。
(2)提交作品為Word文檔,保存格式支持DOC、DOCX,大小不超過1MB;
(3)Word文件命名方式:姓名+標(biāo)題;
(4)Word文件格式要求:A4紙型,標(biāo)題采用二號(hào)小標(biāo)宋體,正文采用三號(hào)仿宋體,字間距標(biāo)準(zhǔn),行間距固定值29.5磅。
(二)書法作品
1.內(nèi)容要求
(1)著重圍繞《紅色傳奇》紀(jì)錄片和《紅色傳奇》《傳承紅色基因 爭(zhēng)做時(shí)代新人》等系列讀本的相關(guān)人物、事件、精神,結(jié)合清廉柳州建設(shè)等內(nèi)容進(jìn)行創(chuàng)作;
(2)作品分為軟筆書法、硬筆書法;
(3)每位參賽者最多可提交1件作品;
(4)作品必須由創(chuàng)作者獨(dú)立完成,不得代筆、挪用他人作品。
2.格式要求
(1)軟筆書法作品最大尺寸不超過四尺豎幅(68cm寬×136cm高),最小尺寸不小于四尺三開(45cm×68cm);
(2)硬筆書法作品最小不小于16開(21cm×28cm);
(3)提交的電子版作品圖片務(wù)必是清晰、無局部模糊、無遮擋、無暗角、無變形的JPG格式文件,大小在1M—5M;(如圖片出現(xiàn)以上問題評(píng)審組不予評(píng)審)
(4)JPG文件命名方式:姓名+標(biāo)題;
(5)獲獎(jiǎng)作品后期需提供可以達(dá)到出版要求的電子文件。(可掃描或用專業(yè)相機(jī)翻拍,文件大小需達(dá)到3M以上,分辨率需達(dá)到300DPI。)
(三)繪畫作品
1.內(nèi)容要求
(1)著重圍繞《紅色傳奇》紀(jì)錄片和《紅色傳奇》《傳承紅色基因 爭(zhēng)做時(shí)代新人》等系列讀本的相關(guān)人物、事件、精神,結(jié)合清廉柳州建設(shè)等內(nèi)容進(jìn)行創(chuàng)作;
(2)作品形式不限,要求作品主題明確、立意鮮明、導(dǎo)向正確。作品中不得出現(xiàn)任何形式的地圖;作品中凡出現(xiàn)或涉及國(guó)旗、黨旗、國(guó)徽、黨徽、軍旗等徽標(biāo)圖案時(shí)務(wù)必做到描繪準(zhǔn)確,不能歪曲、模糊、污染;作品如描繪的是歷史事件,所描繪的場(chǎng)景和人物服飾等需遵照歷史原貌,不得臆造和歪曲歷史;
(3)每位參賽者最多可提交1幅作品;
(4)作品必須由創(chuàng)作者獨(dú)立完成,不得代筆、挪用他人作品。
2.格式要求
(1)非國(guó)畫作品統(tǒng)一使用4開紙(44cm×59cm),國(guó)畫作品統(tǒng)一使用四尺三開宣紙(68cm×45cm);
(2)作品最大尺寸不超過80cm寬×150cm高,最小尺寸不小于4開(44cm×59cm);
(3)報(bào)名提交的電子版作品圖片務(wù)必是清晰、無局部模糊、無遮擋、無暗角、無變形的JPG格式文件,大小在1M—5M;(如圖片出現(xiàn)以上問題評(píng)審組不予評(píng)審)
(4)JPG文件命名方式:姓名+標(biāo)題;
(5)獲獎(jiǎng)作品后期需提供可以達(dá)到出版要求的電子文件。(可掃描或用專業(yè)相機(jī)翻拍,文件大小需達(dá)到3M以上,分辨率需達(dá)到300DPI。)
(四)誦讀作品
1.內(nèi)容要求
(1)參賽者從《紅色經(jīng)典誦讀書目》(可在活動(dòng)官方網(wǎng)站下載)中任選一篇作為誦讀的內(nèi)容,并將誦讀作品錄制成音頻上傳至活動(dòng)官方網(wǎng)站;
(2)每位參賽者最多可提交1個(gè)作品;
(3)作品必須由創(chuàng)作者獨(dú)立完成,不得代讀、挪用他人作品。
紅色經(jīng)典誦讀書目網(wǎng)址:http://gx.people.com.cn/GB/349603/396553/index.html。
(或長(zhǎng)按識(shí)別下方二維碼)
2.格式要求
(1)音頻為MP3格式,大小不超過20M,無需壓縮和打包音頻文件;
(2)MP3文件命名方式:姓名+標(biāo)題。
二、投送方式
1.投稿時(shí)間:即日起至2022年10月31日。
2.投送方式:參賽者通過登錄活動(dòng)主題網(wǎng)站進(jìn)行報(bào)名投稿,投稿網(wǎng)站地址:http://gx.people.com.cn/GB/349603/396553/index.html。
(或長(zhǎng)按識(shí)別下方二維碼)
3.在報(bào)名截止時(shí)間前,如需修改已提交的作品,可在活動(dòng)官方網(wǎng)站撤回重新上傳。
三、評(píng)比辦法
本次評(píng)選活動(dòng)采用初賽(縣級(jí))、復(fù)賽(市級(jí))、決賽(自治區(qū)級(jí))的三級(jí)賽制,由各級(jí)活動(dòng)組委會(huì)組織行業(yè)專家(作家、書法家、畫家、出版人、專業(yè)教師等)組成評(píng)審組,按照評(píng)審規(guī)則,逐級(jí)對(duì)本級(jí)評(píng)比的作品進(jìn)行分組線上評(píng)審。
四、獎(jiǎng)項(xiàng)設(shè)置
(一)征文類
1.小學(xué)組、中學(xué)組、成人組分別設(shè)特等獎(jiǎng)1名,一等獎(jiǎng)10名,二等獎(jiǎng)20名,三等獎(jiǎng)30名,優(yōu)秀獎(jiǎng)若干名。
2.小學(xué)組、中學(xué)組各設(shè)優(yōu)秀指導(dǎo)老師獎(jiǎng)11名。
(二)書法類
1.小學(xué)組、中學(xué)組、成人組分別設(shè)特等獎(jiǎng)1名,一等獎(jiǎng)10名,二等獎(jiǎng)20名,三等獎(jiǎng)30名,優(yōu)秀獎(jiǎng)若干名。
2.小學(xué)組、中學(xué)組各設(shè)優(yōu)秀指導(dǎo)老師獎(jiǎng)11名。
(三)繪畫類
1.小學(xué)組、中學(xué)組、成人組分別設(shè)特等獎(jiǎng)1名,一等獎(jiǎng)10名,二等獎(jiǎng)20名,三等獎(jiǎng)30名,優(yōu)秀獎(jiǎng)若干名。
2.小學(xué)組、中學(xué)組各設(shè)優(yōu)秀指導(dǎo)老師獎(jiǎng)11名。
(四)誦讀類
1.小學(xué)組、中學(xué)組、成人組分別設(shè)特等獎(jiǎng)1名,一等獎(jiǎng)10名,二等獎(jiǎng)20名,三等獎(jiǎng)30名,優(yōu)秀獎(jiǎng)若干名。
2.小學(xué)組、中學(xué)組各設(shè)優(yōu)秀指導(dǎo)老師獎(jiǎng)11名。
(五)優(yōu)秀組織獎(jiǎng)
設(shè)優(yōu)秀組織獎(jiǎng)若干名。
五、獎(jiǎng)勵(lì)辦法
(一)由自治區(qū)“將《紅色傳奇》進(jìn)行到底”系列活動(dòng)組委會(huì)頒發(fā)榮譽(yù)證書。
(二)獲獎(jiǎng)作品由廣西人民出版社結(jié)集出版(無稿酬)。
(三)書畫作品特等獎(jiǎng)和一等獎(jiǎng)獲獎(jiǎng)作品將被組委會(huì)永久收藏并頒發(fā)收藏證書。
六、版權(quán)聲明
主辦單位對(duì)參加活動(dòng)的作品有展覽、研究、攝影、錄像、出版及宣傳權(quán)。
七、其他事項(xiàng)
各地要根據(jù)新冠肺炎疫情常態(tài)化防控工作要求,遵守屬地管理原則,科學(xué)制定活動(dòng)疫情防控工作方案及應(yīng)急處置預(yù)案,安全有序推進(jìn)活動(dòng)的組織籌備。
圖文來源丨柳州市委組織部
值班編輯丨黃杏俏
責(zé)任編輯丨梁立明
責(zé)任監(jiān)制丨梁 洲
出品單位丨融水苗族自治縣融媒體中心
《醉美融水》APP、《秀美融水 風(fēng)情苗鄉(xiāng)》微信公眾號(hào)版權(quán)所有,未經(jīng)書面授權(quán),不得轉(zhuǎn)載、摘編或以其他方式使用該作品。
CSS in JS是一種解決css問題想法的集合,而不是一個(gè)指定的庫(kù)。從CSS in JS的字面意思可以看出,它是將css樣式寫在JavaScript文件中,而不需要獨(dú)立出.css、.less之類的文件。將css放在js中使我們更方便的使用js的變量、模塊化、tree-shaking。還解決了css中的一些問題,譬如:更方便解決基于狀態(tài)的樣式,更容易追溯依賴關(guān)系,生成唯一的選擇器來鎖定作用域。盡管CSS in JS不是一個(gè)很新的技術(shù),但國(guó)內(nèi)的普及程度并不高。由于Vue和Angular都有屬于他們自己的一套定義樣式的方案,React本身也沒有管用戶怎樣定義組件的樣式[1],所以CSS in JS在React社區(qū)的熱度比較高。
目前為止實(shí)現(xiàn)CSS in JS的第三方庫(kù)有很多:(http://michelebertoli.github.io/css-in-js/)。像JSS[2]、styled-components[3]等。在這里我們就不展開贅述了(相關(guān)鏈接已放在下方),這篇文章的重點(diǎn)是JS in CSS。
在上面我們提到CSS in JS就是把CSS寫在JavaScript中,那么JS in CSS我們可以推斷出就是可以在CSS中使用JavaScript腳本,如下所示??梢栽贑SS中編寫Paint API的功能。還可以訪問:ctx,geom。甚至我們還可以編寫自己的css自定義屬性等。這些功能的實(shí)現(xiàn)都基于CSS Houdini[4]。
.el {
--color: cyan;
--multiplier: 0.24;
--pad: 30;
--slant: 20;
--background-canvas: (ctx, geom) => {
let multiplier = var(--multiplier);
let c = `var(--color)`;
let pad = var(--pad);
let slant = var(--slant);
ctx.moveTo(0, 0);
ctx.lineTo(pad + (geom.width - slant - pad) * multiplier, 0);
ctx.lineTo(pad + (geom.width - slant - pad) * multiplier + slant, geom.height);
ctx.lineTo(0, geom.height);
ctx.fillStyle = c;
ctx.fill();
};
background: paint(background-canvas);
transition: --multiplier .4s;
}
.el:hover {
--multiplier: 1;
}
在如今的Web開發(fā)中,JavaScript幾乎占據(jù)了項(xiàng)目代碼的大部分。我們可以在項(xiàng)目開發(fā)中使用ES 2020、ES2021、甚至提案中的新特性(如:Decorator[5]),即使瀏覽器尚未支持,也可以編寫Polyfill或使用Babel之類的工具進(jìn)行轉(zhuǎn)譯,讓我們可以將最新的特性應(yīng)用到生產(chǎn)環(huán)境中(如下圖所示)。
JavaScript標(biāo)準(zhǔn)制定流程.png
而CSS就不同了,除了制定CSS標(biāo)準(zhǔn)規(guī)范所需的時(shí)間外,各家瀏覽器的版本、實(shí)戰(zhàn)進(jìn)度差異更是曠日持久(如下圖所示),最多利用PostCSS、Sass等工具來幫我們轉(zhuǎn)譯出瀏覽器能接受的CSS。開發(fā)者們能操作的就是通過JS去控制DOM與CSSOM來影響頁(yè)面的變化,但是對(duì)于接下來的Layout、Paint與Composite就幾乎沒有控制權(quán)了。為了解決上述問題,為了讓CSS的魔力不在受到瀏覽器的限制,Houdini就此誕生。
CSS 標(biāo)準(zhǔn)制定流程.png
我們上文中提到JavaScript中進(jìn)入提案中的特性我們可以編寫Polyfill,只需要很短的時(shí)間就可以講新特性投入到生產(chǎn)環(huán)境中。這時(shí),腦海中閃現(xiàn)出的第一個(gè)想法就是CSS Polyfill,只要CSS的Polyfill 足夠強(qiáng)大,CSS或許也能有JavaScript一樣的發(fā)展速度,令人可悲的是編寫CSS Polyfill異常的困難,并且大多數(shù)情況下無法在不破壞性能的情況下進(jìn)行。這是因?yàn)镴avaScript是一門動(dòng)態(tài)腳本語(yǔ)言[6]。它帶來了極強(qiáng)的擴(kuò)展性,正是因?yàn)檫@樣,我們可以很輕松使用JavaScript做出JavaScript的Polyfill。但是CSS不是動(dòng)態(tài)的,在某些場(chǎng)景下,我們可以在編譯時(shí)將一種形式的CSS的轉(zhuǎn)換成另一種(如PostCSS[7])。如果你的Polyfill依賴于DOM結(jié)構(gòu)或者某一個(gè)元素的布局、定位等,那么我們的Polyfill就無法編譯時(shí)執(zhí)行,而需要在瀏覽器中運(yùn)行了。不幸的是,在瀏覽器中實(shí)現(xiàn)這種方案非常不容易。
頁(yè)面渲染流程.png
如上圖所示,是從瀏覽器獲取到HTML到渲染在屏幕上的全過程,我們可以看到只有帶顏色(粉色、藍(lán)色)的部分是JavaScript可以控制的環(huán)節(jié)。首先我們根本無法控制瀏覽器解析HTML與CSS并將其轉(zhuǎn)化為DOM與CSSOM的過程,以及Cascade,Layout,Paint,Composite我們也無能為力。整個(gè)過程中我們唯一完全可控制的就是DOM,另外CSSOM部分可控。
CSS Houdini草案中提到,這種程度的暴露是不確定的、兼容性不穩(wěn)定的以及缺乏對(duì)關(guān)鍵特性的支持的。比如,在瀏覽器中的 CSSOM 是不會(huì)告訴我們它是如何處理跨域的樣式表,而且對(duì)于瀏覽器無法解析的 CSS 語(yǔ)句它的處理方式就是不解析了,也就是說——如果我們要用 CSS polyfill讓瀏覽器去支持它尚且不支持的屬性,那就不能在 CSSOM 這個(gè)環(huán)節(jié)做,我們只能遍歷一遍DOM,找到 <style> 或 <link rel="stylesheet"> 標(biāo)簽,獲取其中的 CSS 樣式、解析、重寫,最后再加回 DOM 樹中。令人尷尬的是,這樣DOM樹全部刷新了,會(huì)導(dǎo)致頁(yè)面的重新渲染(如下如所示)。
即便如此,有的人可能會(huì)說:“除了這種方法,我們也別無選擇,更何況對(duì)網(wǎng)站的性能也不會(huì)造成很大的影響”。那么對(duì)于部分網(wǎng)站是這樣的。但如果我們的Polyfill是需要對(duì)可交互的頁(yè)面呢?例如scroll,resize,mousemove,keyup等等,這些事件隨時(shí)會(huì)被觸發(fā),那么意味著隨時(shí)都會(huì)導(dǎo)致頁(yè)面的重新渲染,交互不會(huì)像原本那樣絲滑,甚至導(dǎo)致頁(yè)面崩潰,對(duì)用戶的體驗(yàn)也極其不好。
綜上所述,如果我們想讓瀏覽器解析它不認(rèn)識(shí)的樣式(低版本瀏覽器使用grid布局),然而渲染流程我們無法介入,我們也只能通過手動(dòng)更新DOM的方式,這樣會(huì)帶來很多問題,Houdini的出現(xiàn)正是致力于解決他們。
Houdini是一組底層API,它公開了CSS引擎的各個(gè)部分,如下圖所示展示了每個(gè)環(huán)節(jié)對(duì)應(yīng)的新API(灰色部分各大瀏覽器還未實(shí)現(xiàn)),從而使開發(fā)人員能夠通過加入瀏覽器渲染引擎的樣式和布局過程來擴(kuò)展CSS。Houdini是一群來自Mozilla,Apple,Opera,Microsoft,HP,Intel和Google的工程師組成的工作小組設(shè)計(jì)而成的。它們使開發(fā)者可以直接訪問CSS對(duì)象模型(CSSOM),使開發(fā)人員可以編寫瀏覽器可以解析為CSS的代碼,從而創(chuàng)建新的CSS功能,而無需等待它們?cè)跒g覽器中本地實(shí)現(xiàn)。
CSS Houdini-API
盡管當(dāng)前已經(jīng)有了CSS變量,可以讓開發(fā)者控制屬性值,但是無法約束類型或者更嚴(yán)格的定義,CSS Houdini新的API,我們可以擴(kuò)展css的變量,我們可以定義CSS變量的類型,初始值,繼承。它是css變量更強(qiáng)大靈活。
CSS變量現(xiàn)狀:
.dom {
--my-color: green;
--my-color: url('not-a-color'); // 它并不知道當(dāng)前的變量類型
color: var(--my-color);
}
Houdini提供了兩種自定義屬性的注冊(cè)方式,分別是在js和css中。
CSS.registerProperty({
name: '--my-prop', // String 自定義屬性名
syntax: '<color>', // String 如何去解析當(dāng)前的屬性,即屬性類型,默認(rèn) *
inherits: false, // Boolean 如果是true,子節(jié)點(diǎn)將會(huì)繼承
initialValue: '#c0ffee', // String 屬性點(diǎn)初始值
});
我們還可以在css中注冊(cè),也可以達(dá)到上面的效果
@property --my-prop {
syntax: '<color>';
inherits: false;
initial-value: #c0ffee;
}
這個(gè)API中最令人振奮人心的功能是自定義屬性上添加動(dòng)畫,像這樣:transition: --multiplier 0.4s;,這個(gè)功能我們?cè)谇懊娼榻B什么是js in css那個(gè)demo[8]用使用過。我們還可以使用+使syntax屬性支持一個(gè)或多個(gè)類型,也可以使用|來分割。更多syntax屬性值:
屬性值描述<length>長(zhǎng)度值<number>數(shù)字<percentage>百分比<length-percentage>長(zhǎng)度或百分比,calc將長(zhǎng)度和百分比組成的表達(dá)式<color>顏色<image>圖像<url>網(wǎng)址<integer>整數(shù)<angle>角度<time>時(shí)間<resolution>分辨率<transform-list>轉(zhuǎn)換函數(shù)<custom-ident>ident
Worklets是渲染引擎的擴(kuò)展,從概念上來講它類似于Web Workers[9],但有幾個(gè)重要的區(qū)別:
Worklet是一個(gè)JavaScript模塊,通過調(diào)用worklet的addModule方法(它是個(gè)Promise)來添加。比如registerLayout,registerPaint, registerAnimator 我們都需要放在Worklet中
//加載單個(gè)
await demoWorklet.addModule('path/to/script.js');
// 一次性加載多個(gè)worklet
Promise.all([
demoWorklet1.addModule('script1.js'),
demoWorklet2.addModule('script2.js'),
]).then(results => {});
registerDemoWorklet('name', class {
// 每個(gè)Worklet可以定義要使用的不同函數(shù)
// 他們將由渲染引擎在需要時(shí)調(diào)用
process(arg) {
return !arg;
}
});
Worklets的生命周期
Worklets lifecycle
Typed OM是對(duì)現(xiàn)有的CSSOM的擴(kuò)展,并實(shí)現(xiàn) Parsing API 和 Properties & Values API相關(guān)的特性。它將css值轉(zhuǎn)化為有意義類型的JavaScript的對(duì)象,而不是像現(xiàn)在的字符串。如果我們嘗試將字符串類型的值轉(zhuǎn)化為有意義的類型并返回可能會(huì)有很大的性能開銷,因此這個(gè)API可以讓我們更高效的使用CSS的值。
現(xiàn)在讀取CSS值增加了新的基類CSSStyleValue,他有許多的子類可以更加精準(zhǔn)的描述css值的類型:
子類描述CSSKeywordValueCSS關(guān)鍵字和其他標(biāo)識(shí)符(如inherit或grid)CSSPositionValue位置信息 (x,y)CSSImageValue表示圖像的值屬性的對(duì)象CSSUnitValue表示為具有單個(gè)單位的單個(gè)值(例如50px),也可以表示為沒有單位的單個(gè)值或百分比CSSMathValue比較復(fù)雜的數(shù)值,比如有calc,min和max。這包括子類 CSSMathSum, CSSMathProduct, CSSMathMin,CSSMathMax, CSSMathNegate 和 CSSMathInvertCSSTransformValue由CSS transforms組成的CSSTransformComponent列表,其中包括CSSTranslate, CSSRotate, CSSScale, CSSSkew, CSSSkewX, CSSSkewY, CSSPerspective 和 CSSMatrixComponent
使用Typed OM主要有兩種方法:
使用attributeStyleMap設(shè)置并獲取
myElement.attributeStyleMap.set('font-size', CSS.em(2));
myElement.attributeStyleMap.get('font-size'); // CSSUnitValue { value: 2, unit: 'em' }
myElement.attributeStyleMap.set('opacity', CSS.number(.5));
myElement.attributeStyleMap.get('opacity'); // CSSUnitValue { value: 0.5, unit: 'number' };
在線demo[10]
使用computedStyleMap
.foo {
transform: translateX(1em) rotate(50deg) skewX(10deg);
vertical-align: baseline;
width: calc(100% - 3em);
}
const cs = document.querySelector('.foo').computedStyleMap();
cs.get('vertical-align');
// CSSKeywordValue {
// value: 'baseline',
// }
cs.get('width');
// CSSMathSum {
// operator: 'sum',
// length: 2,
// values: CSSNumericArray {
// 0: CSSUnitValue { value: -90, unit: 'px' },
// 1: CSSUnitValue { value: 100, unit: 'percent' },
// },
// }
cs.get('transform');
// CSSTransformValue {
// is2d: true,
// length: 3,
// 0: CSSTranslate {
// is2d: true,
// x: CSSUnitValue { value: 20, unit: 'px' },
// y: CSSUnitValue { value: 0, unit: 'px' },
// z: CSSUnitValue { value: 0, unit: 'px' },
// },
// 1: CSSRotate {...},
// 2: CSSSkewX {...},
// }
開發(fā)者可以通過這個(gè)API實(shí)現(xiàn)自己的布局算法,我們可以像原生css一樣使用我們自定義的布局(像display:flex, display:table)。在Masonry layout library[11] 上我們可以看到開發(fā)者們是有多想實(shí)現(xiàn)各種各樣的復(fù)雜布局,其中一些布局光靠 CSS 是不行的。雖然這些布局會(huì)讓人耳目一新印象深刻,但是它們的頁(yè)面性能往往都很差,在一些低端設(shè)備上性能問題猶為明顯。
CSS Layout API 暴露了一個(gè)registerLayout方法給開發(fā)者,接收一個(gè)布局名(layout name)作為后面在 CSS中使用的屬性值,還有一個(gè)包含有這個(gè)布局邏輯的JavaScript類。
my-div {
display: layout(my-layout);
}
// layout-worklet.js
registerLayout('my-layout', class {
static get inputProperties() { return ['--foo']; }
static get childrenInputProperties() { return ['--bar']; }
async intrinsicSizes(children, edges, styleMap) {}
async layout(children, edges, constraints, styleMap) {}
});
await CSS.layoutWorklet.addModule('layout-worklet.js');
目前瀏覽器大部分還不支持
我們可以在CSS background-image中使用它,我們可以使用Canvas 2d上下文,根據(jù)元素的大小控制圖像,還可以使用自定義屬性。
await CSS.paintWorklet.addModule('paint-worklet.js');
registerPaint('sample-paint', class {
static get inputProperties() { return ['--foo']; }
static get inputArguments() { return ['<color>']; }
static get contextOptions() { return {alpha: true}; }
paint(ctx, size, props, args) { }
});
這個(gè)API讓我們可以控制基于用戶輸入的關(guān)鍵幀動(dòng)畫,并且以非阻塞的方式。還能更改一個(gè) DOM 元素的屬性,不過是不會(huì)引起渲染引擎重新計(jì)算布局或者樣式的屬性,比如 transform、opacity 或者滾動(dòng)條位置(scroll offset)。Animation API的使用方式與 Paint API 和Layout API略有不同我們還需要通過new一個(gè)WorkletAnimation來注冊(cè)worklet。
// animation-worklet.js
registerAnimator('sample-animator', class {
constructor(options) {
}
animate(currentTime, effect) {
effect.localTime = currentTime;
}
});
await CSS.animationWorklet.addModule('animation-worklet.js');
// 需要添加動(dòng)畫的元素
const elem = document.querySelector('#my-elem');
const scrollSource = document.scrollingElement;
const timeRange = 1000;
const scrollTimeline = new ScrollTimeline({
scrollSource,
timeRange,
});
const effectKeyframes = new KeyframeEffect(
elem,
// 動(dòng)畫需要綁定的關(guān)鍵幀
[
{transform: 'scale(1)'},
{transform: 'scale(.25)'},
{transform: 'scale(1)'}
],
{
duration: timeRange,
},
);
new WorkletAnimation(
'sample-animator',
effectKeyframes,
scrollTimeline,
{},
).play();
關(guān)于此API的更多內(nèi)容:(https://github.com/w3c/css-houdini-drafts/tree/main/css-animation-worklet-1)
允許開發(fā)者自由擴(kuò)展 CSS 詞法分析器。
解析規(guī)則:
const background = window.cssParse.rule("background: green");
console.log(background.styleMap.get("background").value) // "green"
const styles = window.cssParse.ruleSet(".foo { background: green; margin: 5px; }");
console.log(styles.length) // 5
console.log(styles[0].styleMap.get("margin-top").value) // 5
console.log(styles[0].styleMap.get("margin-top").type) // "px"
解析CSS:
const style = fetch("style.css")
.then(response => CSS.parseStylesheet(response.body));
style.then(console.log);
它將提供一些方法來測(cè)量在屏幕上呈現(xiàn)的文本元素的尺寸,將允許開發(fā)者控制文本元素在屏幕上呈現(xiàn)的方式。使用當(dāng)前功能很難或無法測(cè)量這些值,因此該API將使開發(fā)者可以更輕松地創(chuàng)建與文本和字體相關(guān)的CSS特性。例如:
Is Houdini ready yet
(https://ishoudinireadyyet.com/)
了解到這里,部分開發(fā)者可能會(huì)說:“我不需要這些花里胡哨的技術(shù),并不能帶收益。我只想簡(jiǎn)簡(jiǎn)單單的寫幾個(gè)頁(yè)面,做做普通的Web App,并不想試圖干預(yù)瀏覽器的渲染過程從而實(shí)現(xiàn)一些實(shí)驗(yàn)性或炫酷的功能。”如果這樣想的話,我們不妨退一步再去思考?;貞浵伦罱鲞^的項(xiàng)目,用于實(shí)現(xiàn)頁(yè)面效果所使用到的技術(shù),grid布局方式在考慮兼容老版本瀏覽器時(shí)也不得不放棄。我們想控制瀏覽器渲染頁(yè)面的過程并不是僅僅為了炫技,更多的是為了幫助開發(fā)者們解決以下兩個(gè)問題:
幾年過后再回眸,當(dāng)主流瀏覽器完全支持Houdini的時(shí)候。我們可以在瀏覽器上隨心所欲的使用任何CSS屬性,并且他們都能完美支持。像今天的grid布局在舊版本瀏覽器支持的并不友好的這類問題,那時(shí)我們只需要安裝對(duì)應(yīng)的Polyfill就能解決類似的問題。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。