摘要:自定義屬性可以方便的實現很多功能例如主題變化。最近我一直在嘗試利用自定義屬性和網格的組合能實現什么神奇的效果,我需要在不同的斷點處重新定義和屬性。太多的可能性了瀏覽器支持目前,全球的瀏覽器都支持自定義屬性及以下版本是明顯的例外。
我在工作中使用CSS Grid已經有幾個月了,我非常喜歡它在頁面布局時給我的靈活性。這么長時間以來,我們一直沒有一個真正的網格布局解決方案——用浮動和flexbox總是有各種各樣的限制。但現在,我真的無法想象沒有Grid的CSS!
最近我還注意到的一件事就是CSS自定義屬性。CSS自定義屬性的工作方式有點像SASS和其他預處理器中的變量,主要的區別在于其它方法都是在瀏覽器中編譯后生成,還是原本的CSS寫法。CSS自定義屬性是真正的動態變量,可以在樣式表中或使用javascript即時更新,這使得它們具有更多的可能性。如果你熟悉JavaScript,我喜歡把預處理器變量和CSS自定義屬性之間的區別想象成與const和let之間的區別相似——它們都有不同的用途。
CSS自定義屬性可以方便的實現很多功能(例如主題變化)。最近我一直在嘗試利用CSS自定義屬性和CSS網格的組合能實現什么神奇的效果,我需要在不同的斷點處重新定義grid-template-rows和grid-template-columns屬性。下面的代碼中有一個例子,我使用SASS變量定義了頁面在不同的寬度下不同的列寬值,這些值將傳遞到grid-template-rows屬性中。我對grid-gap屬性也做了同樣的操作,這樣頁面寬度不同時元素之間的間距也是不同的:
$wrapper: 1200px; $col: 1fr; $gutter: 20px; $wrapper-l: 90%; $col-l: calc((1000px - (13 * 40px)) / 12); $gutter-l: 40px; $col-xl: calc((1200px - (13 * 50px)) / 12); $gutter-xl: 50px; body { background-color: lighten(grey, 30%); } .wrapper { max-width: $wrapper; margin: 20px auto; @media (min-width: 1300px) { max-width: $wrapper-l; } } .grid { display: grid; padding: $gutter; grid-template-columns: 1fr repeat(12, $col) 1fr; grid-template-rows: repeat(2, minmax(150px, auto)); grid-gap: $gutter; border: 1px solid grey; background: white; width: auto; @media (min-width: 1300px) { grid-template-columns: 1fr repeat(12, $col-l) 1fr; grid-gap: $gutter-l; padding: $col-l; } @media (min-width: 1500px) { grid-template-columns: 1fr repeat(12, $col-xl) 1fr; grid-gap: $gutter-xl; padding: $col-xl; } } .grid__item { border: 1px solid blue; } .grid__item--heading { grid-column: 2 / 11; }
點擊查看上圖的全部代碼和實時效果
就如你所看到的,基本上必須在媒體查詢中再次寫出整個代碼塊來改變樣式,因為變量一旦定義就固定了。(我當然可以使用mixin,但是最終效果是一樣的——一大塊代碼。)
使用CSS自定義屬性,可以減少代碼量,因為我只需更新媒體查詢中的變量,瀏覽器就會重新計算網格。十行(sass)代碼可能看起來不是一個巨大的節省,但代碼的可讀性要高得多,因為不必在好幾個地方添加媒體查詢來處理我們的新變量,我只需在該組件的代碼開頭聲明它們,并且無需擔心是否已替換了正在使用的哪個值:
:root { --wrapper: 1200px; --col: 1fr; --gutter: 20px; @media (min-width: 1300px) { --wrapper: 90%; --col: calc((1000px - (13 * 40px)) / 12); --gutter: 40px; } @media (min-width: 1500px) { --wrapper: 90%; --col: calc((1200px - (13 * 50px)) / 12); --gutter: 50px; } } body { background-color: lighten(grey, 30%); } .wrapper { max-width: var(--wrapper); margin: 20px auto; } .grid { display: grid; padding: var(--gutter); grid-template-columns: 1fr repeat(12, var(--col)) 1fr; grid-template-rows: repeat(2, minmax(150px, auto)); grid-gap: var(--gutter); border: 1px solid grey; background: white; width: auto; } .grid__item { border: 1px solid blue; } .grid__item--heading { grid-column: 2 / 11; } .grid__item--body { grid-column: 2 / 8; grid-row: 2 / span 1; } .grid__item--media { background: hotPink; grid-column: 11 / 14; grid-row: 1 / span 2; }
點擊查看全部代碼和實時效果
我發現使用CSS Grid的一個特點是,語法非常冗長,而且并不容易快速、輕松地看到正在發生的事情,特別是在復雜的網格中。但是在這個例子中,使用CSS自定義屬性,可以為網格項的大小和坐標設置變量,并且只寫一次grid-column和grid-row屬性。對我來說,這比每次都寫出完整的屬性要清楚得多,而且很容易一目了然地看到網格項的位置。
這里有一個隨機動態改變自定義變量的DEMO,在這個示例中,我使用javascript循環網格項,并在每次單擊按鈕時使用隨機值更新變量。沒有添加類或額外的CSS。
在這個的示例DEMO中,使用用戶輸入的值動態更改網格項。這里要更新的只是x和y坐標的三個變量以及網格項的大小。
太多的可能性了!
瀏覽器支持
目前,全球88%的瀏覽器都支持CSS自定義屬性——Internet Explorer 11及以下版本是明顯的例外。這與對CSS Grid網格布局的支持大致相同,這意味著要使用特性查詢來區分支持與不支持的瀏覽器。
可以這樣使用@supports聲明來測試對css自定義屬性的支持:
@supports(--css: variables) { .my-div { --size: 2; --posX: 3; grid-column: var("--posX") / span var("--size"); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109749.html
摘要:自定義屬性可以方便的實現很多功能例如主題變化。最近我一直在嘗試利用自定義屬性和網格的組合能實現什么神奇的效果,我需要在不同的斷點處重新定義和屬性。太多的可能性了瀏覽器支持目前,全球的瀏覽器都支持自定義屬性及以下版本是明顯的例外。 我在工作中使用CSS Grid已經有幾個月了,我非常喜歡它在頁面布局時給我的靈活性。這么長時間以來,我們一直沒有一個真正的網格布局解決方案——用浮動和flex...
摘要:自定義屬性可以方便的實現很多功能例如主題變化。最近我一直在嘗試利用自定義屬性和網格的組合能實現什么神奇的效果,我需要在不同的斷點處重新定義和屬性。太多的可能性了瀏覽器支持目前,全球的瀏覽器都支持自定義屬性及以下版本是明顯的例外。 我在工作中使用CSS Grid已經有幾個月了,我非常喜歡它在頁面布局時給我的靈活性。這么長時間以來,我們一直沒有一個真正的網格布局解決方案——用浮動和flex...
摘要:瀏覽器兼容性網格布局從開始收到支持,微軟在會更新對網格布局的支持。微軟的瀏覽器和有一種比較舊的實現,所以有不少限制,我們會簡單介紹新的實現方式和老的實現方式之間的區別,這樣你能知道如何規避他們。 原文地址:Getting to know CSS Grid Layout 原文作者:Chris Wright 譯者:華翔 校對者:珂珂、干干 翻譯 | CSS網格(CSS Grid)布局入...
摘要:重復網格區域的名稱導致內容跨越這些單元格。中間一排將由兩個區域,一個是空單元格,一個區域組成。你可以使用任意數量的相鄰的點來聲明單個空單元格。只要這些點之間沒有空隙隔開,他們就代表一個單獨的單元格。? CSS Grid 布局是 CSS 中最強大的布局系統。與 flexbox 的一維布局系統不同,CSS Grid 布局是一個二維布局系統,也就意味著它可以同時處理列和行。通過將 CSS 規則應用...
摘要:簡評網格模塊是創建網站模型的絕佳工具。如果你對網格完全陌生,你可能要瀏覽一下我的分鐘介紹網格的文章。每一行代表一行,每一個字符,,,代表一個網格元素。無論標簽在標記中是如何放置的,我們都能隨意轉換。這被稱為源代碼的獨立性,這是的一大進步。 簡評:CSS 網格模塊是創建網站模型的絕佳工具。它是我嘗試過的任何其他系統中最快讓你體驗布局的工具。 我們的網格 我們將從模仿一個經典網站的非常基本...
閱讀 1833·2021-09-22 15:23
閱讀 3255·2021-09-04 16:45
閱讀 1842·2021-07-29 14:49
閱讀 2767·2019-08-30 15:44
閱讀 1523·2019-08-29 16:36
閱讀 1037·2019-08-29 11:03
閱讀 1504·2019-08-26 13:53
閱讀 503·2019-08-26 11:57