CSS 演變歷程 Mask Clip
CSS 前端工程

CSS 的演變歷程,Mask & Clip

本站的主題是商業,創業,美食,葡萄酒,閱讀,網路科技。

這是我的 FB粉專 以及 IG,我比較常使用 Threads,歡迎大家追蹤互動~

關於 CSS mask & clip 相關,queue 好久了一直沒寫。在了解 CSS mask & clip 之前,larry 覺得可以先了解一下 CSS 的歷史。

https://developer.mozilla.org/zh-TW/docs/Glossary/W3C
首先,W3C 的每個標準都會有四個成熟過程 (stages of maturity):

  1. 工作草案(Working Draft、WD)
  2. 候選推薦標準(Candidate Recommendation、CR)
  3. 提案推薦標準(Proposed Recommendation、PR)
  4. W3C 推薦標準(W3C Recommendation、REC)

包含 CSS 規格文件也是用這四個文件狀態。另外,CSS 這個語言的演進,是用 “level” 多少來當單位, 例如

  • CSS 2.1 的全稱為 CSS level 2 revision 1
  • CSS 3 的全稱為 CSS level 3

就這幾十年的軟體發展來說,CSS 其實是一個相對年輕的語言。即使是算舊的 CSS 2.1,也是 2011 年 6 月才成為正式規格。
https://en.wikipedia.org/wiki/Cascading_Style_Sheets

“CSS 2.1 went to Proposed Recommendation on 12 April 2011. After being reviewed by the W3C Advisory Committee, it was finally published as a W3C Recommendation on 7 June 2011.”

接下來進到 CSS 3, 上面 wiki 提到

“Unlike CSS 2, which is a large single specification defining various features, CSS 3 is divided into several separate documents called “modules”.

與 CSS 2 不同,CSS 3 不是用一大張文件來定義所有的規格,而是將不同的功能用不同文件定義,每個文件稱之為 “module” (所以 CSS 3 是由很多 module 所組成)。

這樣就有趣了,還記得上方 W3C 的四個文件狀態 (WD,CR,PR,REC), CSS 3 的每個 module 有自己的文件狀態。(所以似乎也沒辦法定義 CSS 3 到底完成了沒 🙂

而且因為已經分 module 了,每個 module 自己提案、演進,所以也無法定義何謂 CSS 4。

Mask & Clip

回到 CSS mask & clip,主要規格文件是 CSS Masking Module Level 1 https://www.w3.org/TR/css-masking-1/

這邊附註一下,根據 W3C的文件

“When a new technology is added to CSS that is not an extension of something in an earlier CSS specification, it is published in a module that includes the indication ‘level 1’

新技術加入 CSS 時都是從 Level 1 開始,例如 Flexbox、CSS Grid 都是。但只要是模組化的文件,就算是 CSS 3。

回到上面的 CSS Masking Module Level 1,它還在 CR 階段,還沒到正式規格,這也說明了為什麼很多瀏覽器只是 partial support。

了解了以上背景之後,我們來看 mask & clip 用法本身。HTML5 Rocks 有一篇很好的文章 https://www.html5rocks.com/en/tutorials/masking/adobe/

Clip & Clip Path

HTML5 Rocks 文章提到 CSS 2.1 就有 clip 這寫法了,但上面 CSS Masking Module Level 1 文件提到 clip is deprecated,取而代之的是 clip-path

clip-path 的用法如上面 HTML5 Rocks 文章,在 SVG 裡宣告一個 <clipPath>,裡面畫你想要的形狀,將它的 id 當成參數餵給 clip-path,這樣有 clip-path CSS 的元件就會被 <clipPath> 給 mask。沒錯,它雖然是叫 clip-path,但其實就是在做一個 mask 的動作。

使用上如果你想要在元件的邊緣加上一點不規則形狀,或是你想要做一個非矩形的元件 (基本上 html 元件都是矩形),可以考慮用 clip-path

Mask

mask 的寫法上有兩種方式,第一,類似 CSS background image:

  • mask-image
  • mask-repeat
  • mask-position
  • mask-clip
  • mask-origin
  • mask-size

mask-image 可以使用一般圖檔,如 jpg, png, svg。與 background image 不同的是,mask source 可以有多個,如同濾鏡 (filter) 的概念,一層一層疊上去就是了。第二個寫法就是直接用 mask, 與 background 同,是一種縮寫。

HTML5 Rocks 文章最後介紹一個 mask-border,larry 認為還是用 clip-path 來取代吧。連 mask 跟 clip-path 都要查一下瀏覽器支援度了,何況是 mask-border

結論

CSS 的 clip-path 倒比較像是我們一般口語說的 mask,CSS mask 比較像是我們一般口語說的 filter,這是理解上需要注意的地方。最後記得 CSS Masking Module Level 1 仍然是 CR 狀態,要使用 clip 或 mask 時記得查一下瀏覽器支援度。

本站的主題是商業,創業,美食,葡萄酒,閱讀,網路科技。

這是我的 FB粉專 以及 IG,我比較常使用 Threads,歡迎大家追蹤互動~