成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CSS @property,讓不可能變可能

開發 前端
本文主要講講 CSS 非常新的一個特性,CSS @property,它的出現,極大地增強的 CSS 的能力!

根據 MDN -- CSS Property[1],@property CSS at-rule 是 CSS Houdini API 的一部分, 它允許開發者顯式地定義他們的 CSS 自定義屬性,允許進行屬性類型檢查、設定默認值以及定義該自定義屬性是否可以被繼承。

CSS Houdini 又是什么呢,CSS Houdini 開放 CSS 的底層 API 給開發者,使得開發者可以通過這套接口自行擴展 CSS,并提供相應的工具允許開發者介入瀏覽器渲染引擎的樣式和布局流程中,使開發人員可以編寫瀏覽器可以解析的 CSS 代碼,從而創建新的 CSS 功能。當然,它不是本文的重點,不過多描述。

CSS Property 如何使用呢?我們將通過一些簡單的例子快速上手,并且著重介紹它在 CSS 動畫中起到的關鍵性的作用,對 CSS 動畫帶來的巨大提升。

示例

正常而言,我們定義和使用一個 CSS 自定義屬性的方法是這樣的:

  1. :root { 
  2.     --whiteColor: #fff; 
  3.  
  4. p { 
  5.     color: (--whiteColor); 

而有了 @property 規則之后,我們還可以像下述代碼這樣去定義個 CSS 自定義屬性:

  1. <style> 
  2. @property --property-name { 
  3.   syntax: '<color>'
  4.   inherits: false
  5.   initial-value: #fff; 
  6.  
  7. p { 
  8.     color: var(--property-name); 
  9. </style> 

簡單解讀下:

  • @property --property-name 中的 --property-name 就是自定義屬性的名稱,定義后可在 CSS 中通過 var(--property-name) 進行引用
  • syntax:該自定義屬性的語法規則,也可以理解為表示定義的自定義屬性的類型
  • inherits:是否允許繼承
  • initial-value:初始值

其中,@property 規則中的 syntax 和 inherits 描述符是必需的。

當然,在 JavaScript 內定義的寫法也很簡單,順便一提:

  1. <script> 
  2. CSS.registerProperty({ 
  3.   name"--property-name"
  4.   syntax: "<color>"
  5.   inherits: false
  6.   initialValue: "#c0ffee" 
  7. }); 
  8. </script> 

支持的 syntax 語法類型

syntax 支持的語法類型非常豐富,基本涵蓋了所有你能想到的類型。

  • length
  • number
  • percentage
  • length-percentage
  • color
  • image
  • url
  • integer
  • angle
  • time
  • resolution
  • transform-list
  • transform-function
  • custom-ident (a custom identifier string)

syntax 中的 +、#、| 符號

定義的 CSS @property 變量的 syntax 語法接受一些特殊的類型定義。

  • syntax: '
  • syntax: '
  • syntax: '':接受單個長度或者以空格分隔的長度值列表

OK,鋪墊了這么多,那么為什么要使用這么麻煩的語法定義 CSS 自定義屬性呢?CSS Houdini 定義的自定義變量的優勢在哪里?下面我們一一娓娓道來。

使用 color syntax 語法類型作用于漸變

我們來看這樣一個例子,我們有這樣一個漸變的圖案:

  1. <div></div> 
  1. div { 
  2.     background: linear-gradient(45deg, #fff, #000); 

我們改造下上述代碼,改為使用 CSS 自定義屬性:

  1. :root { 
  2.     --colorA: #fff; 
  3.     --colorB: #000; 
  4. div { 
  5.     background: linear-gradient(45deg, var(--colorA), var(--colorB)); 

得到的還是同樣的一個漸變圖:

我們再加上一個過渡效果:

  1. :root { 
  2.     --colorA: #fff; 
  3.     --colorB: #000; 
  4. div { 
  5.     background: linear-gradient(45deg, var(--colorA), var(--colorB)); 
  6.     transition: 1s background; 
  7.      
  8.     &:hover { 
  9.         --colorA: yellowgreen; 
  10.         --colorB: deeppink; 
  11.     } 

看看鼠標 Hover 的時候,會發生什么:

 å›¾ç‰‡

雖然我們設定了 1s 的過渡動畫 transition: 1s background,但是很可惜,CSS 是不支持背景漸變色的直接過渡變化的,我們得到的只是兩幀之間的之間變化。

使用 CSS @property 進行改造

OK,接下來我們就是有本文的主角,使用 Houdini API 中的 CSS 自定義屬性替換原本的 CSS 自定義屬性。

簡單進行改造一下,使用 color syntax 語法類型:

  1. @property --houdini-colorA { 
  2.   syntax: '<color>'
  3.   inherits: false
  4.   initial-value: #fff; 
  5. @property --houdini-colorB { 
  6.   syntax: '<color>'
  7.   inherits: false
  8.   initial-value: #000; 
  9. .property { 
  10.     background: linear-gradient(45deg, var(--houdini-colorA), var(--houdini-colorB)); 
  11.     transition: 1s --houdini-colorA, 1s --houdini-colorB; 
  12.      
  13.     &:hover { 
  14.         --houdini-colorA: yellowgreen; 
  15.         --houdini-colorB: deeppink; 
  16.     } 

我們使用了 @property 語法,定義了兩個 CSS Houdini 自定義變量 --houdini-colorA 和 --houdini-colorB,在 hover 變化的時候,改變這兩個顏色。

需要關注的是,我們設定的過渡語句 transition: 1s --houdini-colorA, 1s --houdini-colorB,在這里,我們是針對 CSS Houdini 自定義變量設定過渡,而不是針對 background 設定過渡動畫,再看看這次的效果:

 å›¾ç‰‡

Wow,成功了,漸變色的變化從兩幀的逐幀動畫變成了補間動畫,實現了從一個漸變色過渡到另外一個漸變色的效果!而這,都得益于 CSS Houdini 自定義變量的強大能力!

CodePen Demo -- CSS Houdini 自定義變量實現漸變色過渡動畫[2]

使用 CSS @property 實現漸變背景色過渡動畫

在上述的 DEMO 中,我們利用了 CSS Houdini 自定義變量,將原本定義在 background 的過渡效果嫁接到了 color 之上,而 CSS 是支持一個顏色變換到另外一個顏色的,這樣,我們巧妙的實現了漸變背景色的過渡動畫。

在之前我們有討論過在 CSS 中有多少種方式可以實現漸變背景色過渡動畫 -- 巧妙地制作背景色漸變動畫![3],到今天,我們又多了一種實現的方式!

  1. @property --colorA { 
  2.   syntax: '<color>'
  3.   inherits: false
  4.   initial-value: fuchsia; 
  5. @property --colorC { 
  6.   syntax: '<color>'
  7.   inherits: false
  8.   initial-value: #f79188; 
  9. @property --colorF { 
  10.   syntax: '<color>'
  11.   inherits: false
  12.   initial-value: red; 
  13. div { 
  14.     background: linear-gradient(45deg, 
  15.         var(--colorA), 
  16.         var(--colorC), 
  17.         var(--colorF)); 
  18.     animation: change 10s infinite linear; 
  19.  
  20. @keyframes change { 
  21.     20% { 
  22.         --colorA: red; 
  23.         --colorC: #a93ee0; 
  24.         --colorF: fuchsia; 
  25.     } 
  26.     40% { 
  27.         --colorA: #ff3c41; 
  28.         --colorC: #e228a0; 
  29.         --colorF: #2e4c96; 
  30.     } 
  31.     60% { 
  32.         --colorA: orange; 
  33.         --colorC: green; 
  34.         --colorF: teal; 
  35.     } 
  36.     80% { 
  37.         --colorA: #ae63e4; 
  38.         --colorC: #0ebeff; 
  39.         --colorF: #efc371; 
  40.     } 

图片

完整的代碼可以戳這里:

CodePen Demo -- CSS Houdini 自定義變量實現漸變色過渡動畫2[4]

conic-gradient 配合 CSS @property 實現餅圖動畫

OK,上面我們演示了 syntax 為 color 語法類型的情況。在文章一開頭,我們還列舉了非常多的 syntax 類型。

下面我們嘗試下其他的類型,使用 percentage 百分比類型或者 angle 角度類型,實現一個餅圖的 hover 動畫。

如果我們還是使用傳統的寫法,利用角向漸變實現不同角度的餅圖:

  1. <div></div> 
  1. .normal { 
  2.     width: 200px; 
  3.     height: 200px; 
  4.     border-radius: 50%; 
  5.     background: conic-gradient(yellowgreen, yellowgreen 25%, transparent 25%, transparent 100%);  
  6.     transition: background 300ms; 
  7.      
  8.     &:hover { 
  9.         background: conic-gradient(yellowgreen, yellowgreen 60%, transparent 60.1%, transparent 100%);  
  10.     } 

將會得到這樣一種效果,由于 conic-gradient 也是不支持過渡動畫的,得到的是一幀向另外一幀的直接變化:

 å›¾ç‰‡

好,使用 CSS Houdini 自定義變量改造一下:

  1. @property --per { 
  2.   syntax: '<percentage>'
  3.   inherits: false
  4.   initial-value: 25%; 
  5.  
  6. div { 
  7.     background: conic-gradient(yellowgreen, yellowgreen var(--per), transparent var(--per), transparent 100%);  
  8.     transition: --per 300ms linear; 
  9.      
  10.     &:hover { 
  11.         --per: 60%; 
  12.     } 

看看改造后的效果:

 å›¾ç‰‡

CodePode Demo -- conic-gradient 配合 CSS @property 實現餅圖動畫[5]

以往使用純 CSS 非常復雜才能實現的效果,如果可以輕松的達成,不得不感慨 CSS @property 強大的能力!

syntax 的 | 符號

順便演示一下定義 Houdini 自定義變量時 syntax 的一些稍微復雜點的用法。

在 conic-gradient 中,我們可以使用百分比也可以使用角度作為關鍵字,上述的 DEMO 也可以改造成這樣:

  1. @property --per { 
  2.   syntax: '<percentage> | <angle>'
  3.   inherits: false
  4.   initial-value: 25%; 
  5. ... 

表示,我們的自定義屬性即可以是一個百分比值,也可以是一個角度值。

除了 | 符號外,還有 + 和 # 號分別表示接受以空格分隔、和以逗號分隔的屬性,感興趣的可以自行嘗試。

使用 length 類型作用于一些長度變化

掌握了上述的技巧,我們就可以利用 Houdini 自定義變量的這個能力,去填補修復以前無法直接過渡動畫的一些效果了。

過去,我們想實現這樣一個文字下劃線的 Hover 效果:

  1. p { 
  2.     text-underline-offset: 1px; 
  3.     text-decoration-line: underline; 
  4.     text-decoration-color: #000; 
  5.     transition: all .3s; 
  6.      
  7.     &:hover { 
  8.         text-decoration-color: orange; 
  9.         text-underline-offset: 10px; 
  10.         color: orange; 
  11.     } 

因為 text-underline-offset 不支持過渡動畫,得到的結果如下:

 å›¾ç‰‡

使用 Houdini 自定義變量改造,化腐朽為神奇:

  1. @property --offset { 
  2.   syntax: '<length>'
  3.   inherits: false
  4.   initial-value: 0; 
  5. div { 
  6.     text-underline-offset: var(--offset, 1px); 
  7.  text-decoration: underline; 
  8.  transition: --offset 400ms, text-decoration-color 400ms; 
  9.      
  10.     &:hover { 
  11.         --offset: 10px; 
  12.         color: orange; 
  13.  text-decoration-color: orange; 
  14.     } 

可以得到絲滑的過渡效果:

 å›¾ç‰‡

CodePen Demo - Underlines hover transition(Chrome solution with Houdini)[6]

實戰一下,使用 CSS @property 配合 background 實現屏保動畫

嗯,因為 CSS @property 的存在,讓以前需要非常多 CSS 代碼的工作,一下子變得簡單了起來。

我們嘗試利用 CSS @property 配合 background,簡單的實現一個屏保動畫。

我們利用 background 可以簡單的得到這樣一個圖形,代碼如下:

  1. html, body { 
  2.     width: 100%; 
  3.     height: 100%; 
  4. body { 
  5.     background-image: 
  6.         radial-gradient( 
  7.             circle at 86% 7%, 
  8.             rgba(40, 40, 40, 0.04) 0%, 
  9.             rgba(40, 40, 40, 0.04) 50%, 
  10.             rgba(200, 200, 200, 0.04) 50%, 
  11.             rgba(200, 200, 200, 0.04) 100% 
  12.         ), 
  13.         radial-gradient( 
  14.             circle at 15% 16%, 
  15.             rgba(99, 99, 99, 0.04) 0%, 
  16.             rgba(99, 99, 99, 0.04) 50%, 
  17.             rgba(45, 45, 45, 0.04) 50%, 
  18.             rgba(45, 45, 45, 0.04) 100% 
  19.         ), 
  20.         radial-gradient( 
  21.             circle at 75% 99%, 
  22.             rgba(243, 243, 243, 0.04) 0%, 
  23.             rgba(243, 243, 243, 0.04) 50%, 
  24.             rgba(37, 37, 37, 0.04) 50%, 
  25.             rgba(37, 37, 37, 0.04) 100% 
  26.         ), 
  27.         linear-gradient(rgb(34, 222, 237), rgb(135, 89, 215)); 

效果如下,還算可以的靜態背景圖:

在往常,我們想讓它動起來,其實是需要費一定的功夫的,而現在,通過 CSS @property,對我們希望進行動畫的一些元素細節進行改造,可以得到非常不錯的動畫效果:

  1. body, 
  2. html { 
  3.     width: 100%; 
  4.     height: 100%; 
  5.  
  6. @property --perA { 
  7.   syntax: '<percentage>'
  8.   inherits: false
  9.   initial-value: 75%; 
  10.  
  11. @property --perB { 
  12.   syntax: '<percentage>'
  13.   inherits: false
  14.   initial-value: 99%; 
  15.  
  16. @property --perC { 
  17.   syntax: '<percentage>'
  18.   inherits: false
  19.   initial-value: 15%; 
  20.  
  21. @property --perD { 
  22.   syntax: '<percentage>'
  23.   inherits: false
  24.   initial-value: 16%; 
  25.  
  26. @property --perE { 
  27.   syntax: '<percentage>'
  28.   inherits: false
  29.   initial-value: 86%; 
  30.  
  31. @property --angle { 
  32.   syntax: '<angle>'
  33.   inherits: false
  34.   initial-value: 0deg; 
  35.  
  36. body { 
  37.     background-image:  
  38.         radial-gradient( 
  39.             circle at var(--perE) 7%, 
  40.             rgba(40, 40, 40, 0.04) 0%, 
  41.             rgba(40, 40, 40, 0.04) 50%, 
  42.             rgba(200, 200, 200, 0.04) 50%, 
  43.             rgba(200, 200, 200, 0.04) 100% 
  44.         ), 
  45.         radial-gradient( 
  46.             circle at var(--perC) var(--perD), 
  47.             rgba(99, 99, 99, 0.04) 0%, 
  48.             rgba(99, 99, 99, 0.04) 50%, 
  49.             rgba(45, 45, 45, 0.04) 50%, 
  50.             rgba(45, 45, 45, 0.04) 100% 
  51.         ), 
  52.         radial-gradient( 
  53.             circle at var(--perA) var(--perB), 
  54.             rgba(243, 243, 243, 0.04) 0%, 
  55.             rgba(243, 243, 243, 0.04) 50%, 
  56.             rgba(37, 37, 37, 0.04) 50%, 
  57.             rgba(37, 37, 37, 0.04) 100% 
  58.         ), 
  59.         linear-gradient(var(--angle), rgb(34, 222, 237), rgb(135, 89, 215)); 
  60.     animation: move 30s infinite alternate linear; 
  61.  
  62. @keyframes move { 
  63.     100% { 
  64.         --perA: 85%; 
  65.         --perB: 49%; 
  66.         --perC: 45%; 
  67.         --perD: 39%; 
  68.         --perE: 70%; 
  69.         --angle: 360deg; 
  70.     } 

效果如下(因為 Gif 上傳大小限制,加快了速率,截取了其中一部分,簡單做個示意):

 å›¾ç‰‡

整體的效果還是挺不錯的,完整的 Demo 你可以戳這里:

CodePen Demo -- CSS @property PureCSS Wrapper[7]

參考文獻:

CSS Properties and Values API Level 1[8]

最后

好了,本文到此結束,介紹了 CSS Houdini API 中的 CSS @property 部分,并且利用它實現了一些以往無法簡單實現的動畫效果,希望對你有幫助 :)

更多精彩 CSS 技術文章匯總在我的 Github -- iCSS[9] ,持續更新,歡迎點個 star 訂閱收藏。

如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

參考資料

[1]MDN -- CSS Property:

https://developer.mozilla.org/zh-CN/docs/Web/CSS/@property

[2]CodePen Demo -- CSS Houdini 自定義變量實現漸變色過渡動畫:

https://codepen.io/Chokcoco/pen/eYgyWLB?editors=1100

[3]巧妙地制作背景色漸變動畫!:

https://github.com/chokcoco/iCSS/issues/10

[4]CodePen Demo -- CSS Houdini 自定義變量實現漸變色過渡動畫2:

https://codepen.io/Chokcoco/pen/Bapmzbd

[5]CodePode Demo -- conic-gradient 配合 CSS @property 實現餅圖動畫:

https://codepen.io/Chokcoco/pen/QWdqMvo

[6]CodePen Demo - Underlines hover transition(Chrome solution with Houdini):

https://codepen.io/Chokcoco/pen/jOymJZR

[7]CodePen Demo -- CSS @property PureCSS Wrapper:

https://codepen.io/Chokcoco/pen/VwPxMBP

[8]CSS Properties and Values API Level 1:

https://drafts.css-houdini.org/css-properties-values-api-1/#at-property-rule

[9]Github -- iCSS:

https://github.com/chokcoco/iCSS

 

責任編輯:姜華 來源: iCSS前端趣聞
相關推薦

2016-03-14 14:45:18

中華網

2014-07-17 10:38:30

大數據

2021-02-21 14:05:02

區塊鏈比特幣安全

2016-09-01 16:37:24

2012-04-10 08:58:26

小米

2019-01-02 06:26:02

API應用程序編程接口應用安全

2013-12-13 10:01:16

諾基亞安卓手機

2023-12-05 07:19:43

CAP定理分布式

2023-05-09 08:59:09

ChatGPT程序員裁員

2024-01-24 13:08:00

2025-04-17 09:00:00

架構聊消息微信

2012-03-24 21:26:56

2018-07-26 08:13:31

根服務器網絡TCP

2013-07-02 09:26:11

IntelCEO代工

2009-11-05 09:34:00

虛擬化終結者

2021-05-31 09:42:39

谷歌隱私網絡安全

2011-12-22 21:08:14

HTC

2017-04-24 08:58:23

5GWiFi網絡

2017-12-19 14:15:27

程序員愿望加班
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费色网址 | 欧美激情亚洲 | 国产成人99久久亚洲综合精品 | 亚洲午夜av久久乱码 | 蜜桃视频在线观看免费视频网站www | 色五月激情五月 | 欧美在线一区二区三区四区 | 国产91黄色 | 国产精品视频观看 | 久久伊人精品一区二区三区 | 久久久女女女女999久久 | 91网视频| 黄色大片毛片 | 国产一区免费 | 91麻豆精品一区二区三区 | 一区二区三区视频免费看 | 亚洲91 | 91九色视频 | 韩国av一区二区 | 欧美激情久久久 | 精品国产亚洲一区二区三区大结局 | 国产精品久久久久久一区二区三区 | 亚洲不卡一 | 一区二区三区日韩精品 | 五月网婷婷 | 久久精品国产v日韩v亚洲 | 免费视频一区二区 | 国产激情一区二区三区 | 午夜网| 污片在线免费观看 | 91在线精品一区二区 | 国产精品久久久久久久久动漫 | 伊人网站在线观看 | 在线视频中文字幕 | 久久99精品国产自在现线小黄鸭 | 99久久国产 | 天天澡天天狠天天天做 | 成人精品鲁一区一区二区 | 亚洲三区视频 | 国产一区中文字幕 | 精品国产一区二区三区日日嗨 |