現代 CSS 解決方案:Modern CSS Reset

来源:https://www.cnblogs.com/coco1s/archive/2022/04/14/16143423.html
-Advertisement-
Play Games

在早年間(其實也不是很早),寫過幾篇關於 CSS Reset 的文章 - reset.css 知多少。 詳細描述了當時業界比較常用的,兩個 CSS reset 方案:reset.css 與 Normalize.css。 以更為推薦的 Normalize.css 為例,它的核心思想是: 統一了一些元素 ...


在早年間(其實也不是很早),寫過幾篇關於 CSS Reset 的文章 - reset.css 知多少

詳細描述了當時業界比較常用的,兩個 CSS reset 方案:reset.css 與 Normalize.css。

以更為推薦的 Normalize.css 為例,它的核心思想是:

  1. 統一了一些元素在所有瀏覽器下的表現,保護有用的瀏覽器預設樣式而不是完全清零它們,讓它們在各個瀏覽器下表現一致;
  2. 為大部分元素提供一般化的表現;
  3. 修複了一些瀏覽器的 Bug ,並且讓它們在所有瀏覽器下保持一致性;
  4. 通過一些巧妙的細節提升了 CSS 的可用性;
  5. 提供了詳盡的文檔讓開發者知道,不同元素在不同瀏覽器下的渲染規則;

如今,Normalize 已經出到了第八版 -- normalize.css V8.0.1,而隨之而變的是瀏覽器市場環境的巨大變化。

IE 已經逐漸退出歷史舞臺,處理各個瀏覽器之間巨大差異、不同相容性問題的日子像是一去不復返了。雖然今天不同廠商在對待標準仍然存在差異,一些細節上仍舊有出入,但是我們已經不需要再像過去般大肆地對瀏覽器預設樣式進行重置。

到今天,我們更多聽到現代 CSS 解決方案一詞。它除去頁面樣式最基本的呈現外,同時也關註用戶體驗可訪問性。這也可能是過去,我們在寫 CSS 的時候比較容易忽略的環節。

Modern CSS Reset

我最近比較喜歡的一個 CSS Reset 方案,源自於 -- Modern-CSS-Reset

它的核心觀點是:

  1. 重置合理的預設值
  2. 關註用戶體驗
  3. 關註可訪問性

整個 Reset 的源碼比較簡單:

/* Box sizing rules */
*,
*::before,
*::after {
  box-sizing: border-box;
}

/* Remove default margin */
body,
h1,
h2,
h3,
h4,
p,
figure,
blockquote,
dl,
dd {
  margin: 0;
}

/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
ul[role='list'],
ol[role='list'] {
  list-style: none;
}

/* Set core root defaults */
html:focus-within {
  scroll-behavior: smooth;
}

/* Set core body defaults */
body {
  min-height: 100vh;
  text-rendering: optimizeSpeed;
  line-height: 1.5;
}

/* A elements that don't have a class get default styles */
a:not([class]) {
  text-decoration-skip-ink: auto;
}

/* Make images easier to work with */
img,
picture {
  max-width: 100%;
  display: block;
}

/* Inherit fonts for inputs and buttons */
input,
button,
textarea,
select {
  font: inherit;
}

/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */
@media (prefers-reduced-motion: reduce) {
  html:focus-within {
   scroll-behavior: auto;
  }
  
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

其中一些比較有意思的點,單看盒子模型:

*,
*::before,
*::after {
  box-sizing: border-box;
}

Normalize.css 是不推薦這麼做的,大部分元素的 box-sizing 其實都是 content-box,但是,對於實際開發,全部元素都設置為 border-box 其實是更便於操作的一種方式。

再看看在用戶體驗可訪問性方面的一些做法:

html:focus-within {
  scroll-behavior: smooth;
}

scroll-behavior: smooth 意為平滑滾動,當然這裡是設置給了 html:focus-within 偽類,而不是直接給 html 賦予平滑滾動,這樣做的目的是只對使用鍵盤 tab 鍵切換焦點頁面時,讓頁面進行平滑滾動切換,帶來更好的使用體驗。

如果我們設置瞭如下 CSS:

html {
  scroll-behavior: smooth;
}

可能會起到一起副作用,譬如,當我們在頁面查找元素時候(使用 Ctrl + F、或者 Mac 的 Commond + F),這段 CSS 代碼可能會嚴重延緩我們的查找速度:

再看看這段代碼:

@media (prefers-reduced-motion: reduce) {
  html:focus-within {
   scroll-behavior: auto;
  }
  
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

我曾經在 使用 CSS prefers-* 規範,提升網站的可訪問性與健壯性 介紹過 prefers-reduced-motion

prefers-reduced-motion 規則查詢用於減弱動畫效果,除了預設規則,只有一種語法取值 prefers-reduced-motion: reduce,開啟了該規則後,相當於告訴用戶代理,希望他看到的頁面,可以刪除或替換掉一些會讓部分視覺運動障礙者不適的動畫類型。

規範原文:Indicates that user has notified the system that they prefer an interface that removes or replaces the types of motion-based animation that trigger discomfort for those with vestibular motion disorders.

vestibular motion disorders 是一種視覺運動障礙患者,翻譯出來是前庭運動障礙,是一種會導致眩暈的一類病癥,譬如一個動畫一秒閃爍多次,就會導致患者的不適。

使用方法,還是上面那段代碼:

.ele {
    animation: aniName 5s infinite linear;
}

@media (prefers-reduced-motion: reduce) {
    .ele {
        animation: none;
    }
}

如果我們有一些類似這樣的動畫:

在用戶開啟了 prefers-reduced-motion: reduce 時,就應該把這個動畫去掉。

而上述 Reset 中的那段代碼,正是用於當用戶開啟對應選項後,減弱頁面上的所有動畫效果。屬於對可訪問性的考慮。

結合實際環境

當然,結合實際環境,目前國內整體不太註重可訪問性相關的內容。

而且,許多業務根本無法拋棄一些老舊瀏覽器,仍然需要相容 IE 系列。

因此,對於現階段的 Reset 方案,可以靈活搭配:

  1. 如果你的業務場景仍然需要考慮一些老舊瀏覽器,依舊需要相容 IE 系列,Normalize.css 的大部分功能都還是非常好的選擇
  2. 如果你的業務場景只專註於 Chrome 或者是 Chromium 內核,Normalize.css 內的許多內容其實可能是一些實際中根本不會遇到或者用上的相容適配,可以進行必要的精簡
  3. 如果你的業務是全球化,面向的用戶不僅僅在國內,你應該開始考慮更多可訪問性相關的內容,上述的 Modern CSS Reset 可以借鑒一下

因此,更應該的情況是,根據實際的業務需要,吸收多個業界比較常見/知名的 Reset 方案形成自己業務適用的。

這裡再羅列一些常見及現代 CSS Reset 方案:

Reset 方案 簡介 Github Stars 數
normalize.css CSS Reset 的現代替代方案 47.1K
sanitize.css 提供一致的、跨瀏覽器的 HTML 元素預設樣式以及有用的預設樣式 4.8K
reseter.css Normalize.css 和 CSS Reset 的未來替代方案 981
Modern-CSS-Reset 小而美,重置合理的預設值的現代 CSS Reset 方案 2.4K

你會看到,其實大家都號稱自己是現代 CSS Reset 解決方案,但其實其內部做的 Reset 工作很多是我們根本用不上的。有人喜歡小而美,有人喜歡大而全,實際使用的時候需要具體取捨,魔改合併成適合自己的才是最好的。

最後

好了,本文到此結束,希望對你有幫助

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在HarmonyOS開發中List下拉刷新是一種很常見的問題,今天描述怎麼實現List下拉刷新的功能實現,主要分為“開發準備”,“代碼實現”,“運行效果” 1. 開發準備 我們需要學習以下知識點 1.1 【Harmony OS】【ARK UI】【Demo】載入動畫實現 1.2 PanGesture ...
  • 華為開發者聯盟與艾瑞咨詢聯合發佈《2022年移動應用趨勢洞察白皮書》,本白皮書主要分析移動應用行業發展現狀和趨勢,並對影音娛樂、通訊社交、電商生活、運動健康、出行導航等細分行業場景進行分析,把握移動應用細分行業發展特色和趨勢,為廣大開發者的開發和運營決策提供參考。 華為開發者聯盟一直致力於全方位聯接 ...
  • 初識前後端 在學習瞭解前後端的過程中,自己看到了這一篇好的文章,摘下了一些當下用的的內容,供複習參考。 什麼是前端開發? 前端開發主要涉及網站和 App,用戶能夠從 App 屏幕或瀏覽器上看到東西。簡單地說,能夠從 App 屏幕和瀏覽器上看到的東西都屬於前端。 網站和移動 App 的前端 **對於網 ...
  • 這幾天天天搞到這麼晚,我看今天的內容看起不多啊,不知道為什麼學著學著就到了這麼晚。今天的內容還是有點多哈,有點自我矛盾了,再次一一道來。 1. 首先今天先看到路由的概念,什麼叫做路由? 路由就是映射關係,在express中路由指的是客戶端請求和伺服器處理函數的映射關係,路由有三部分組成:請求類型、請 ...
  • 一、背景由來 cookie原來是用來網路請求攜帶用戶信息的,只不過在HTML5出現之前,前端沒有本地存儲的方法,只能使用cookie代替 localstorge、sessionStorge是html5提供的API,極大的方便了前端在客戶端存儲數據 二、那麼這三者有什麼區別呢? 1.存儲時間 cook ...
  • 定義 bind() 方法創建一個新的函數,在 bind() 被調用時,這個新函數的 this 被指定為 bind() 的第一個參數,而其餘參數將作為新函數的參數,供調用時使用。 由定義可知,函數調用bind()方法的時候,會返回一個新函數,並且this指向bind函數的第一個參數,簡單來表示。 fn ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. let、const、var的區別 (1)塊級作用域:塊作用域由 { }包括,let和const具有塊級作用域,var不存在塊級作用域。塊級作用域解決了ES5中的兩個問題: 內層變數可能覆蓋外層變數 用來計數的迴圈變數泄露為全局變數 ...
  • (1)安裝node.js,按照自己使用的系統情況選擇下載包,我用的windows系統,所以選擇了第一個 下載地址可以到官網:https://nodejs.org/en/download/ 安裝沒什麼可以說的,直接下一步就行,查看是否安裝命令:打開cmd視窗,執行 noed -v ,查看版本號,出現這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...