国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 3 種在任何瀏覽器中使用 CSS 網(wǎng)格的后備方案

3 種在任何瀏覽器中使用 CSS 網(wǎng)格的后備方案

時間:2023-09-06 02:30:01 | 來源:網(wǎng)站運營

時間:2023-09-06 02:30:01 來源:網(wǎng)站運營

3 種在任何瀏覽器中使用 CSS 網(wǎng)格的后備方案:如今,CSS Grid 在瀏覽器中已經(jīng)廣受支持 —— 支持 Grid 基本功能的瀏覽器占比約為 95%。不過有時我們無法忽略剩下的 5%,因為我們可能希望自己的 Web 應(yīng)用的布局在所有瀏覽器中看起來都一樣的棒,而且我們甚至還可能希望去使用一些支持度較低的 Grid 的新功能。

那我們應(yīng)該做什么?我們應(yīng)該避免在生產(chǎn)中使用 Grid 布局嗎?我們應(yīng)該拋棄使用舊版瀏覽器的用戶嗎?我們應(yīng)該等待功能得到更好的覆蓋嗎?當(dāng)然不,有很多后備方案可以幫助我們克服這些問題。

在本文中,我們將探討最重要的三種技術(shù)。它們將幫助我們在 Grid 布局上輕松兼容舊版瀏覽器,這樣我們就可以根據(jù)可用的瀏覽器功能,調(diào)整我們的網(wǎng)頁設(shè)計。這一切都將是漸進式適應(yīng)的。

在深入探討技術(shù)方面的內(nèi)容之前,我們需要制定一個策略。制定適當(dāng)?shù)牟呗允浅晒Φ年P(guān)鍵,因為這將使我們有方向感和一致性。

制定策略

Grid 中最常見的用處是構(gòu)建適合用戶屏幕分辨率的多維柵格布局。但當(dāng)柵格不可用時該怎么辦?除了 Grid 之外,還有什么東西可以幫助我們制作靈活且迅速響應(yīng)的布局?

我們可以嘗試使用 Flexbox 重現(xiàn)相同的布局,不過這樣做會增加過多的代碼。此外,F(xiàn)lexbox 也不是為了柵格布局而開發(fā)的功能,如果使用它,我們可能會遇到一些困難。

現(xiàn)在我們該怎么辦?解決方案非常簡單:作為后備方案,只需向用戶展示移動端的布局即可,而只有使用過時瀏覽器的桌面端用戶才會注意到這些改變。他們在我們的總用戶數(shù)量中占比非常低。你的站點對于所有人來說應(yīng)該都是可以使用且一致的,而這就是一個公平的權(quán)衡。

那么如何使用最新的 Grid 功能?直接采取相同的策略:嘗試回退到一個相似的布局。

總結(jié):我們的布局應(yīng)該逐步增強。使用較舊瀏覽器的用戶可能只能看到一個更簡單但可用的版式,而那些使用最新瀏覽器的用戶將獲得完整的用戶體驗。

讓我們來看一下可以使用的前 3 種后備工具。

1. 使用 CSS 特性查詢

讓我們從下面的這段描述開始了解:

特性查詢 是使用 CSS 的 at 規(guī)則 @supports 創(chuàng)建的。它給予 Web 開發(fā)者一種有效的方法去測試瀏覽器是否支持某個確定特性,而后提供基于測試結(jié)果生效的 CSS 。在此指南中你將學(xué)習(xí)如何使用特性查詢實現(xiàn)漸進式增強?!?— [MDN Web文檔](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Conditional_Rules/Using_Feature_Queries
如果你曾經(jīng)使用過媒體查詢,那么我想,你也會非常熟悉 @supports 的語法,畢竟兩者是很相似的。不過在這里我們使用 @supports 不是希望基于瀏覽器的視口大小來調(diào)整布局,而是希望基于 CSS 屬性的支持與否來定義指定的樣式。

根據(jù)我們的策略:

1.我們將使用 Flexbox 構(gòu)建移動布局版本,并將其用作默認版本。 2.通過使用 @supports,我們將檢查瀏覽器是否支持 Grid。如果支持,我們就會使用 Grid 來增強布局。

在此示例中,由于我們僅需關(guān)注標(biāo)準的 Grid 行為。在這里我們可以向 @supports 查詢基本的 display:grid 功能:

@supports (display: grid) { /* ... code here */}完整的例子如下:

<!DOCTYPE html><html lang="en"><head> <title>生產(chǎn)中的 Grid</title> <meta charset="UTF-8"/></head><body><style> #container { display: flex; flex-direction: column; gap: 10px; border: 1px solid #000; padding: 10px; } @supports (display: grid) { #container { display: grid; } @media (min-width: 768px) { #container { grid-template-columns: 100px 1fr 100px; } } } .side1 { padding: 10px; background-color: #CEB992; } .side2 { padding: 10px; background-color: #CEB992; } .content { padding: 10px; min-height: 400px; background-color: #5B2E48; } body { color: #FFF; font-weight: 500; }</style><div id="container"> <div class="side1"> 側(cè)邊欄 </div> <div class="content"> 主要內(nèi)容 </div> <div class="side2"> 側(cè)邊欄 </div></div></body></html>注意,我們并沒有斷言 Grid 特性 grid-template-columns。如果瀏覽器不支持該怎么辦?在這種情況下,Grid 將退回到默認的定位算法 —— 它將堆疊 div。在我們的示例中,該方法可以正常運行,因此我們不需要再去進行額外的工作。

讓我們看看結(jié)果,這是支持 Grid 的瀏覽器的桌面端視圖結(jié)果:

這是支持 Grid 的瀏覽器的移動端視圖的結(jié)果:

這是不支持 Grid 的瀏覽器的任何視圖下的結(jié)果:

布局沒有被破壞,仍然可用于所有瀏覽器引擎。只有從桌面端訪問它的用戶才能看到區(qū)別。

2. 以編程方式使用 CSS 功能查詢

有時,僅通過樣式表中的 CSS 特性查詢無法實現(xiàn)我們想要的功能。盡管它的功能強大,但也有局限性。因此我們可能需要基于瀏覽器功能,以編程的方式添加或刪除元素。那應(yīng)該如何實現(xiàn)呢?

幸運的是,可以在 JavaScript 以編程方式調(diào)用 CSS 功能。我們可以通過 CSS 對象模型接口 CSSSupportsRule 來訪問 @supports。

CSSSupportsRule 接口代表一個 CSS @supportsat-rule — [MDN Web文檔](https://developer.mozilla.org/en-US/docs/Web/API/CSSSupportsRule
讓我們看一下它的定義:

function supports(property: string, value: string): boolean;我們在一個假設(shè)的案例中使用看看。如果用戶使用的瀏覽器不支持 Grid 布局功能,它就會給用戶發(fā)出警告。不過我們可不能在生產(chǎn)環(huán)境中這樣做,這只是一個有趣的例子。

這是我們有條件地檢查是否不支持 Grid 的方式:

if (!CSS || !CSS.supports('display', 'grid')) { // ...}請注意,某些瀏覽器可能不支持 CSS.supports,因此我們還添加了空檢查。

讓我們來看一個有效的代碼示例:

<!DOCTYPE html><html lang="en"><head> <title>生產(chǎn)中的 Grid</title> <meta charset="UTF-8"/></head><body><style> #container { display: flex; flex-direction: column; gap: 10px; border: 1px solid #000; padding: 10px; } @supports (display: grid) { #container { display: grid; } @media (min-width: 768px) { #container { grid-template-columns: 100px 1fr 100px; } } } .side1 { padding: 10px; background-color: #CEB992; } .side2 { padding: 10px; background-color: #CEB992; } .content { padding: 10px; min-height: 400px; background-color: #5B2E48; } body { color: #FFF; font-weight: 500; }</style><script> (function warnSupport() { if (!CSS || !CSS.supports('display', 'grid')) { alert('Warning your Browser does not support the latests features. Consider switching to a newer one') } })();</script><div id="container"> <div class="side1"> 側(cè)邊欄 </div> <div class="content"> 主要內(nèi)容 </div> <div class="side2"> 側(cè)邊欄 </div></div></body></html>CSS.supports 是用于以編程方式創(chuàng)建后備布局的優(yōu)秀工具。如果我們必須處理非常復(fù)雜的布局,那么我們可能需要選用此方法而不是 CSS 特性查詢。有了這種程序化的后備方案,我們可以使用它來創(chuàng)建 Web 組件。

3. 屬性覆蓋

有時候,我們不需要 CSS 特性查詢之類的奇特功能。這時,我們就可以利用 CSS 屬性的工作原理:在 CSS 類中重新定義屬性時,最后一個有效的屬性會被視作要使用的屬性。

這是什么意思?為什么說它好用呢?我們可以通過覆蓋 CSS 屬性來定義后備樣式:

#container { display: flex; display: grid; /* 如果 Grid 不可用,則第二個屬性聲明將失效,且瀏覽器會應(yīng)用第一個屬性聲明的值 `flex` */}我們可以以更簡單的方式重寫先前的 CSS 特性查詢示例:

<!DOCTYPE html><html lang="en"><head> <title>生產(chǎn)中的 Grid</title> <meta charset="UTF-8"/></head><body><style> #container { display: flex; display: grid; flex-direction: column; gap: 10px; border: 1px solid #000; padding: 10px; } @media (min-width: 768px) { #container { grid-template-columns: 100px 1fr 100px; } } .side1 { padding: 10px; background-color: #CEB992; } .side2 { padding: 10px; background-color: #CEB992; } .content { padding: 10px; min-height: 400px; background-color: #5B2E48; } body { color: #FFF; font-weight: 500; }</style><script> (function warnSupport() { if (!CSS || !CSS.supports('display', 'grid')) { alert('Warning your Browser does not support the latests features. Consider switching to a newer one') } })();</script><div id="container"> <div class="side1"> 側(cè)邊欄 </div> <div class="content"> 主要內(nèi)容 </div> <div class="side2"> 側(cè)邊欄 </div></div></body></html>這種后備方案雖然簡單但是功能強大。在許多情況下它很有用 —— 畢竟我們可能無法對所有要使用的 Grid 功能都進行查詢。

讓我們用它從最新的 Grid 功能之一:subgrid 進行回退吧。我們應(yīng)該如何使用呢?

讓我們想象一下需要對嵌套的 Grid 模板列使用 subgrid 的場景,劃重點:

#content { grid-template-columns: inherit; grid-template-columns: subgrid;}在此示例中,當(dāng)不支持 subgrid 時候,它將僅繼承父級的 Grid 定義。這將創(chuàng)建一個大致相似的布局。

這只是一個簡單的例子。 我們可以將 grid-template-columns 微調(diào)到某些固定大小,或者在我們的特定情況下最適合的大小。

這是完整的示例:

<!DOCTYPE html><html lang="en"><head> <title>Grid 案例</title> <meta charset="UTF-8"/></head><body><style> body { color: white; text-align: center; box-sizing: content-box; margin: 20px; } .palette-1 { background-color: #CEB992; } .palette-2 { background-color: #471323; } .palette-3 { background-color: #73937E; } .palette-4 { background-color: #5B2E48; } .palette-5 { background-color: #585563; } #container { padding: 10px; background-color: #73937E; height: 500px; width: calc(100vw - 60px); display: grid; grid-template-rows: repeat(8, 1fr); grid-template-columns: max-content 1fr 1fr 1fr; row-gap: 1rem; } .item { padding: 20px; } .content-main { grid-column: span 3; } #content { background-color: #73937E; grid-column: 1 / -1; display: grid; grid-template-columns: inherit; grid-template-columns: subgrid; column-gap: 1rem; }</style><div id="container"> <div id="content"> <div class="content-left item palette-5"> 標(biāo)題 </div> <div class="content-main item palette-4"> </div> </div> <div id="content"> <div class="content-left item palette-5"> 另一個標(biāo)題 </div> <div class="content-main item palette-4"> </div> </div></div></script></body></html>至于結(jié)果:







如你所見,結(jié)果看起來是完全一致的,但其實只是非常相似而已,這就是我們的目標(biāo)。隨著越來越多的瀏覽器采用 subgrid,更多的用戶都可以看到布局的像素級完美版本!

結(jié)論

Grid 和 Flexbox 旨在解決不同的情況。我們無法一直使用 Flexbox 構(gòu)建所有布局,因為仍然有少數(shù)瀏覽器不支持它。

從 Flexbox 升級到 Grid 并不意味著布局在舊設(shè)備上突然失效。在本文中,我們探討了構(gòu)建漸進式布局有多么容易和有趣。正如我們在一開始所看到的那樣,制定一項如何進行的策略非常重要。

這些策略不僅僅是為了添加基本的 Grid 功能。只要我們提供合理的后備方案,我們就可以利用諸如 subgrid 之類的最新功能。

我希望這能鼓勵你在需要時去生產(chǎn)環(huán)境中逐漸應(yīng)用 Grid?,F(xiàn)在,我們不必再躲在 Flexbox 后面了!

如果發(fā)現(xiàn)譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改并 PR,也可獲得相應(yīng)獎勵積分。文章開頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。

掘金翻譯計劃 是一個翻譯優(yōu)質(zhì)互聯(lián)網(wǎng)技術(shù)文章的社區(qū),文章來源為 掘金 上的英文分享文章。內(nèi)容覆蓋 Android、iOS、前端后端、區(qū)塊鏈、產(chǎn)品、設(shè)計、人工智能等領(lǐng)域,想要查看更多優(yōu)質(zhì)譯文請持續(xù)關(guān)注 掘金翻譯計劃、官方微博本站專欄。

關(guān)鍵詞:方案,使用,任何,瀏覽

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉