談談一些有趣的CSS題目(十一)-- reset.css 知多少?

来源:http://www.cnblogs.com/coco1s/archive/2017/01/04/6249038.html
-Advertisement-
Play Games

開本系列,談談一些有趣的 CSS 題目,題目類型天馬行空,想到什麼說什麼,不僅為了拓寬一下解決問題的思路,更涉及一些容易忽視的 CSS 細節。 解題不考慮相容性,題目天馬行空,想到什麼說什麼,如果解題中有你感覺到生僻的 CSS 屬性,趕緊去補習一下吧。 不斷更新,不斷更新,不斷更新,重要的事情說三遍 ...


開本系列,談談一些有趣的 CSS 題目,題目類型天馬行空,想到什麼說什麼,不僅為了拓寬一下解決問題的思路,更涉及一些容易忽視的 CSS 細節。

解題不考慮相容性,題目天馬行空,想到什麼說什麼,如果解題中有你感覺到生僻的 CSS 屬性,趕緊去補習一下吧。

不斷更新,不斷更新,不斷更新,重要的事情說三遍。

談談一些有趣的CSS題目(一)-- 左邊豎條的實現方法

談談一些有趣的CSS題目(二)-- 從條紋邊框的實現談盒子模型

談談一些有趣的CSS題目(三)-- 層疊順序與堆棧上下文知多少

談談一些有趣的CSS題目(四)-- 從倒影說起,談談 CSS 繼承 inherit

談談一些有趣的CSS題目(五)-- 單行居中,兩行居左,超過兩行省略

談談一些有趣的CSS題目(六)-- 全相容的多列均勻佈局問題

談談一些有趣的CSS題目(七)-- 消失的邊界線問題

談談一些有趣的CSS題目(八)-- 純CSS的導航欄Tab切換方案

談談一些有趣的CSS題目(九)-- 巧妙的實現 CSS 斜線

談談一些有趣的CSS題目(十)-- 結構性偽類選擇器

所有題目彙總在我的 Github

 

正文從這裡開始。 大部分的時候,作為前端,我們在寫 CSS 樣式之前,都知道需要添加一份 reset.css ,但是有深究過reset.css 每一句的人恐怕不多,其實其中也是有很多學問的,知己知彼,真正釐清它,對提高 CSS 大有裨益。

reset.css

先來看看早先 YUI 的一個版本的 reset.css,這是一份歷史比較悠久的 RESET 方案:

body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td {
    margin: 0;
    padding: 0;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}
fieldset, img {
    border: 0;
}
address, caption, cite, code, dfn, em, strong, th, var {
    font-style: normal;
    font-weight: normal;
}
ol, ul {
    list-style: none;
}
caption, th {
    text-align: left;
}
h1, h2, h3, h4, h5, h6 {
    font-size: 100%;
    font-weight: normal;
}
q:before, q:after {
    content: '';
}
abbr, acronym {
    border: 0;
}

首先,我們要知道 CSS RESET 的目的是什麼?是為了消除不同的瀏覽器在預設樣式上不同表現,但是到今天,現代瀏覽器在這方面的差異已經小了很多。

 

reset.css 存在的問題

看看第一段:

body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td {
    margin: 0;
    padding: 0;
}

這一條樣式的目的是在於,清除元素的預設 margin 和 padding 。

但是這一段代碼是充滿問題的。

  • 諸如 div 、dt、li 、th、td 等標簽是沒有預設 padding 和 margin 的;
  • 如果我現在問你 fieldset 是什麼標簽,可能沒幾個人知道,相似的還有如 blockquote 、acronym 這種很生僻的標簽,在 html 代碼中基本不會出現的,其實沒太大必要 RESET ,只會給每個項目徒增冗餘代碼;

上面的意思是,這一段代碼其實做了很多無用功!

要知道,CSS RESET 的作用域是全局的。我們都知道在腳本代碼中應該儘量避免濫用全局變數,但是在 CSS 上卻總是會忘記這一點,大量的全局變數會導致項目大了之後維護起來非常的棘手。

再看看這一段:

h1, h2, h3, h4, h5, h6 {
    font-size: 100%;
    font-weight: normal;
}
ol, ul {
    list-style: none;
}

這一段代碼,目的是統一了 h1~h6 的表現,取消了標題的粗體展示,取消了列表元素的項目點。

好像沒什麼問題,但是諸如 h1~h6、ol、ul 這些擁有具體語義化的元素,一旦去掉了它們本身的特性,而又沒有賦予它們本身語義化該有的樣式(經常沒有),導致越來越多人弄不清它們的語義,側面來說,這也是現在越來越多的頁面上 div 滿天飛,缺乏語義化標簽的一個重要原因。

YUI 版本的 reset 不管高矮胖瘦,一刀切的方式,看似將所有元素統一在同一起跑線上,實則是多了很多冗餘代碼,得不償失。

所以,YUI 的 reset.css 的諸多問題,催生出了另一個版本的 reset.css ,名為 Normalize.css。

 

Normalize.css

Normalize.css 有著詳盡的註釋,由於篇幅太長,可以點開網址看看,本文不貼出全部代碼。

normalize.css v5.0.0

Normalize.css 與 reset.css 的風格恰好相反,沒有不管三七二一的一刀切,而是註重通用的方案,重置掉該重置的樣式(例如body的預設margin),保留該保留的 user agent 樣式,同時進行一些 bug 的修複,這點是 reset 所缺乏的。

 

Normalize.css 做了什麼

Normalize.css 註釋完整,每一段代碼都說明瞭作用,總結來說,它做了以下幾個工作(摘自官網):

  1. Preserves useful defaults, unlike many CSS resets.
  2. Normalizes styles for a wide range of elements.
  3. Corrects bugs and common browser inconsistencies.
  4. Improves usability with subtle modifications.
  5. Explains what code does using detailed comments.

簡單翻譯一下,大概是:

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

真心建議各位抽時間讀一讀 Normalize.css 的源碼,加上註釋一共就 460 行,多瞭解瞭解各個瀏覽器歷史遺留的一些坑。

 

關於取捨

那麼,最後再討論下取捨問題。是否 Normalize.css 就真的比 reset.css 好呢?

也不見得,Normalize.css 中重置修複的很多 bug ,其實在我們的項目中十個項目不見得有一個會用得上,那麼這些重置或者修複,某種意義上而言也是所謂的冗餘代碼。

我覺得最重要的是,拒絕拿來主義,不要人云亦云,看見別人說這個 reset.css 好用,也不瞭解一下,拿來就上到項目中。又或者說寫代碼幾年了,知道每次都引用一個 reset ,卻從沒有去細緻瞭解其中每一句的含義。

 

關於維護

當團隊根據項目需要(可能混合部分了 reset 或者 normalize )編寫了一份適合團隊項目的 reset 之後,隨著不斷的迭代或者說是復用,很有可能這個版本的 reset.css 會逐漸添加許多其他的全局性的樣式,從而又重新陷入上面說的那些問題。

所以我覺得,reset.css 也是需要維護的,關於最佳的 reset.css ,沒有一勞永逸的方案,根據項目靈活配置,做出取捨微調,適量裁剪和修改後再使用。

最後,搞技術的同學還是應該要有所追求,不要滿足於消費別人的總結,一定要去源頭看看。

 

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


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

-Advertisement-
Play Games
更多相關文章
  • 前言:家裡的樹莓派吃灰很久,於是拿出來做個室內溫度展示也不錯。 板子是model b型。 使用Python開發,web框架是flask,溫度感測器是ds18b20 1 硬體連接 ds18b20的vcc連接樹莓派的vcc , gnd連接gnd,DS連接GPIO4 2 ssh登錄樹莓派查看ds18b20 ...
  • 前段時間在使用Compass時遇到了其為難處理的一個坑,現記錄到博客希望能幫助到各位。 一、問題: 利用Koala或者是gulp編譯提示如下,截圖為koala編譯提示錯誤: 二、解決辦法 從問題截圖上看提示是找不到.sass-cache文件夾下麵的一個文件夾(父級目錄名稱中帶有特殊字元很容易重現), ...
  • 我們都知道在javascript里是沒有塊級作用域的,而ES6添加了塊級作用域,塊級作用域能帶來什麼好處呢?為什麼會添加這個功能呢?那就得瞭解ES5沒有塊級作用域時出現了哪些問題。 ES5在沒有塊級作用域的情況下出現的問題: 一。在if或者for迴圈中聲明的變數會泄露成全局變數 二。內層變數可能會覆 ...
  • 實例 讓第二個元素收縮到其他元素的三分之一: 效果預覽 div:nth-of-type(2){flex-shrink:3;} 瀏覽器支持 表格中的數字表示支持該屬性的第一個瀏覽器的版本號。 緊跟在 -webkit-, -ms- 或 -moz- 後的數字為支持該首碼屬性的第一個版本。 屬性 flex- ...
  • 要求: 確保字元串的每個單詞首字母都大寫,其餘部分小寫。 這裡我自己寫了兩種方法,或者說是一種方法,另一個是該方法的變種。 第一種: 第一種方法我認為比較好理解一點。 第二種(這是基於第一種方法上的改動): 第二種方法減少了轉換對象,原理還是一樣的。 兩種方法的結果都是: ps:如有不足或錯誤請指出 ...
  • Function.prototype.toString這個原型方法可以幫助你獲得函數的源代碼, 比如: 輸出: 這個方法真是碉堡了…, 通過合適的正則, 我們可以從中提取出豐富的信息. 函數名 函數形參列表 函數源代碼 這些信息提供了javascript意想不到的靈活性, 我們來看看野生的例子吧. ...
  • <style> li{ list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;cursor: pointer; } </style>html代碼: <ul id="uls"> <li style="b ...
  • 頭:header 內容:content/container 尾:footer 導航:nav 側欄:sidebar 欄目:column 頁面外圍控制整體佈局寬度:wrapper 左右中:left right center 登錄條:loginbar 標誌:logo 廣告:banner 頁面主體:main ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...