如何和何時使用 CSS 的權重設置 !important (建議:永不使用!)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。?

特別聲明:此篇文章由David根據Louis Lazaris的英文文章原名《!important CSS Declarations: How and When to Use Them》進行翻譯,整個譯文帶有我們自己的理解與思想,如果譯得不好或不對之處還請同行朋友指點。如需轉載此譯文,需注明英文出處:http://coding.smashingmagazine.com/2010/11/02/the-important-css-declaration-how-and-when-to-use-it以及作者相關信息

——作者:Louis Lazaris

——譯者:David

早在90年代中期到后期起草的?CSS1規范中就介紹過!important,它能夠幫助開發者和用戶在修改樣式表的時候輕松覆蓋原本的權重。一直以來!important的用法幾乎沒變,只在CSS2.1中有一點變化,并且在CSS3規范中沒有對它做任何添加和修改。

Adding !important in Developer Tools

讓我們來看一下!important是什么,以及在什么時候使用,如果你遇到類似情況,你就應該使用它。

層疊的概述

在我們對!important的正確用法進行探討之前,讓我們為本節的內容做個鋪墊。之前,Smashing Magazine已經對CSS權重進行過深入的闡釋。所以,如果你想詳細了解CSS的層疊和權重關系就請讀讀這篇文章。

CSS權重早期在W3cplus中已進行翻譯,如果您閱讀英文有點吃力,可以閱讀譯文《你應該知道的一些事情——CSS權重》

——大漠

下面這個提綱描述了CSS文檔是如何確定給不同的樣式分配不同的權重的。在CSS規范中提及的關于層疊的一個大體概括:

  • 找到所有作用于元素和屬性的聲明
  • 一個樣式是否作用于元素依賴于這個樣式的權重和如下所示樣式來源的順序,下面這個列表中越靠前的權重越小:
    1. 用戶代理聲明(譯注:如瀏覽器默認樣式)
    2. 用戶聲明(譯注:如用戶瀏覽器選項設置或通過開發人員調試工具修改)
    3. 開發者聲明(譯注:如頁面中引用的CSS)
    4. 帶有!important的開發者聲明
    5. 帶有!important的用戶聲明
  • 樣式的應用依賴具體的情況,一個更加具體的選擇器往往會比一個籠統選擇器獲得更大的權重。
  • 樣式的應用依賴樣式出現的順序(即,后面的會覆蓋前面的)

從這個提綱中,你可能已經明白!important會如何改變權重以及它在層疊中扮演一個什么樣的角色。接下來讓我們看一下!important更多的細節。

語法和描述

!important為開發者提供了一個增加樣式權重的方法。應當注意的是!important是對整條樣式的聲明,包括這個樣式的屬性和屬性值(感謝Brad Czerniak指出其中的差別)。這里有個簡單的代碼示例可以清晰地說明!important是如何應用于原本的樣式中的:

#example {font-size: 14px !important;	
}#container #example {font-size: 10px;
}	

在上面的代碼示例中,由于使用了!important,id為“example”的元素字號將被設置為14px。

如果不使用!important,第二個樣式聲明的代碼塊很自然地比第一個的權重要大,原因有二:在樣式表中第二個代碼塊要比第一個出現的晚(即,它位列第二);第二個代碼塊有更大的權重(是由兩個id,#container #example組合而成,而不是只有一個id,#example。但是因為第一個代碼塊里面包含了!important,所以對于字號設置來說它有更大的權重。

見CSS權重與繼承中關于權重的計算方法,如下圖:

Adding !important in Developer Tools

——譯者:David

關于!important應該注意的一些地方:

  1. 當!important第一次在CSS1中被介紹時是這樣規定的,即一個由開發者聲明的!important樣式要比一個由用戶聲明的!important樣式獲得更大的權重。為了提高訪問性,在CSS2?中它被顛倒了過來。
  2. 如果!important被用于一個簡寫的樣式屬性,那么這條簡寫的樣式屬性所代表的子屬性都會被作用上!important。
  3. 關鍵字!important必須放在一行樣式的末尾并且要放在該行分號前,否則就沒有效果。 (不過分號前的空格不會影響它)
  4. 如果因為一些特殊原因,你不得不在一個代碼塊中聲明兩個同樣的屬性,那么請把!important加在第一個屬性后面,因為這樣做會讓所有瀏覽器中第一個屬性的權重更大,而IE6除外(這是一個只有IE6才有的hack,但是不會影響你的CSS)
  5. 在IE6和IE7中如果你使用不同的單詞替代!important(像!hotdog),這條CSS樣式依然會獲得更大的權重,但是其他瀏覽器卻會忽略它。

針對第二點,譯者作出如下標注:

.e{margin: 0 !important;}

那么就等價于

.e{margin-top: 0 !important; margin-right: 0 !important; margin-bottom: 0 !important; margin-left: 0 !important;
}

——譯者:David

何時該使用!important

使用任何技術的利弊都視情況而定。下面是我個人對如何有效使用!important的一些觀點。

永不使用

非到萬不得已不要用!important。如果你是出于懶惰使用!important,為了避免例行的調試而濫用它,那么你(或者是那些后繼開發你項目的人)將會深受其害。

如果你并非濫用只是有偶爾用一下!important,同樣,你很快就會發現你的樣式會難以維護。正如上面我們討論過的,本來,CSS會根據層疊和權重產生正常的作用順序。但當你使用了!important就擾亂了原本的順序,讓更多的權重給了正常情況下本不應該獲得這么多權重的樣式。

如果你從不使用!important,那么這標志著你真正理解了CSS并且證明你在編寫代碼前經過深思熟慮。

正如古老的格言所說“永遠不要說‘永不’”,所以接下來我們還是要來討論!important的一些合理的用法。

幫助測試可訪問性

正如前面提到過的,用戶樣式中可以包含!important聲明,允許用戶根據自己的特殊需求來給具體的CSS樣式增加權重以幫助他們閱讀和訪問內容。

有特殊需求的用戶可以把!important加到像font-size這樣的打印屬性上來加大字體,或者為了提高網頁的對比度而把它加到與顏色相關的樣式上。

下面這張Smashing Magazine首頁的截圖,展示的正是借助FireFox的開發人員工具把正常大小的文本用用戶自定義樣式覆蓋后的效果:

Adding !important in Developer Tools

在這個案例中,文本大小是隨瀏覽器窗口大小可調節的,樣式中并沒有使用!important,所以用戶定義的樣式會忽略權重而覆蓋開發者的樣式。然而,如果body正文的文本大小是開發者使用!important來設置的,就算用戶用更加具體的選擇器定義了樣式也不能覆蓋這個文本大小的設置。因此,即使在用戶樣式的作用下,甚至是開發者自己濫用!important的情況下,這條包含!important的樣式不僅解決了問題,還保持了文本大小的可調節性。

暫時解決緊急問題

總會有這樣的情況發生——某個客戶的線上網站出現了CSS的bug,你必須快速修復。在大多數情況下你應該會用Firebug或者其他的開發者工具來調試你的CSS代碼并且最終修復它。但是,如果這個bug發生在IE6或者是其他沒有提供調試工具的瀏覽器上的時候,你可能需要使用!important來完成快速修復。

當你用這個臨時修復的辦法讓網站繼續上線以后(這樣可以先擺平客戶),你再花些時間用不破壞層疊且可維護性高的方法來修復這個bug也為時未晚。當你找到更好的解決方案你就可以替換掉線上的!important部分,而且客戶對此毫不知情。

用Firebug或者其他開發者工具覆寫樣式

我們可以使用Firebug或者Chrome開發者工具(譯注:兩者均可用F12喚出)查看頁面元素,在不影響真正的CSS樣式的情況下可以自由地編輯樣式,測試效果,調試bug等等。下面這張截圖展示的就是在Chrome開發者工具中看到的Smashing Magazine的一些樣式:

Adding !important in Developer Tools

圖中紅框內帶有刪除線的樣式表明它已經被后面的樣式覆蓋掉了。為了讓這條樣式再次作用,你得禁用后面的樣式。你也可以把選擇器寫得更加具體以增加權重,但是這樣會讓整個代碼塊的權重都增加,這并不是我們想要的。

!important可以被加在單行樣式的后面從而讓已經被覆蓋的樣式重新作用。這樣的話,你不用大量修改你真正的樣式就可以調試你的CSS,直到你找到問題所在。

下圖所示是在上圖那條相同的樣式后面加了!important。你可能已經注意到之前的刪除線不見了,因為現在這條樣式要比之前覆蓋它的那條有更大的權重:

Adding !important in Developer Tools

覆寫用戶生成內容中的行內樣式

CSS開發中一個讓人頭疼的問題,就是當我們遇到用戶生成內容中有行內樣式的情況,這種情況多發生在一些使用了所見即所得網頁編輯器的CMS系統中。在CSS層疊中,行內樣式會覆蓋常規樣式。然而,我們并不想看到那些本該被我們定義好的CSS樣式作用的元素卻被用戶生成內容中的行內樣式改變。此時你就可以用!important來避免這種問題,因為,一條被開發者加了!important的樣式會覆蓋行內樣式。

?

你可以給只在打印時生效的樣式加上!important,雖然不是所有情況下都需要這樣做,而且正如我們之前提到的那些原因一樣也不建議這么做。但是,這樣可以讓你在不用重復編寫選擇器的情況下就能覆蓋具體的樣式。

打印樣式即打印機在打印網頁時所使用的樣式,關于打印樣式的細節可以閱讀這篇文章

——譯者:David

關于單獨設計的博客頁面

如果你曾經接觸過設計個人博客頁面的技術(許多設計師反對將 “藝術指導”用于這種技術,確實如此),像Heart Directed中展示的那樣,你會發現有一種需求要求每個單獨的文章都要有它自己獨立的樣式,抑或你需要使用行內樣式。你可以用這篇文章中給出的代碼為一個個人頁面編寫它自己的樣式。

!important在這個時候可以派上用場,為了在你的站點里創建一個獨一無二的頁面,你可以輕松覆蓋默認的樣式而不必擔心原本的CSS權重。

總結

如果你遇到了特殊的需求,或者你想覆蓋用戶代理(譯注:即瀏覽器)和開發者的默認樣式,提高頁面可訪問性,你最好慎重使用!important。你要對你的CSS在考慮周全的同時盡可能地避免使用!important。甚至在上面提到的許多能用到!important的地方它也不總是必要的。

盡管如此,!important在CSS中還是有用的。如果你接手一個項目,而這個項目之前的開發人員正好使用了!important,那么你在修復一些問題的時候我們今天所討論的將會派上用場。

擴展閱讀

  1. !important rules in the CSS2.1 spec?10
  2. !important Declarations on SitePoint’s CSS Reference
  3. CSS Specificity And Inheritance on Smashing Magazine
  4. Everything You Need to Know About !important CSS Declarations
  5. What are the implications of using “!important” in CSS?
  6. When Using !important is The Right Choice

譯者手語:初次翻譯前端技術博文,整個翻譯依照原文線路進行,并在翻譯過程略加了個人對技術的理解。如果翻譯有不對之處,還煩請同行朋友指點。謝謝!

關于David

2009年開始接觸前端開發,2011年組建創業團隊——[五維互動],2012年團隊被“收編”并更名[創影互動],遂只身來上海發展,現在就職于FlipScript。歡迎交流共勉:騰訊微博、個人博客。

英文原文:http://coding.smashingmagazine.com/2010/11/02/the-important-css-declaration-how-and-when-to-use-it

轉自:https://www.w3cplus.com/css/the-important-css-declaration-how-and-when-to-use-it.html

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

獨立組件開發打包

組件單獨打包 先在src下面新建hymenucsg.js文件 然后在build下的webpack.base.conf.dist.js里面 設置入口文件hymenucsg: ./src/hymenucsg.js,//csg 最后運行打包命令:npm run dist:dev 之后會在dist下面生成組件的js和css文件 使用: html中引入js和css …

廣州科目三電子考需注意哪些問題?

廣州駕考科目三從4月1日起開始試行電子評判與人工評判相結合的新制度,即電子路考,多數學員對新制度表示不適應,那么,科目三電子路考需要注意哪些問題? 從4月1日開始,科目三考試將試行計算機輔助與人工評判相結合的制度…

解決 VUE: 本地運行和服務器上運行樣式不一致,run、build 運行時樣式有出入

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 我的情況: 我遇到 2 種情況,一個是表格的分頁樣式有變化。另一個是導航菜單樣式有變化。 2. 解決&#xff…

Ubuntu鏈接服務器

本篇文章介紹,如何在Ubuntu系統下連接遠程Ubuntu系統并傳輸文件。 一. 連接遠程Ubuntu服務器。 1. 打開命令行,輸入 : sudo apt-get update , 對系統進行更新。 2. 安裝 OpenSSH Server,輸入 : sudo apt-get install …

開發中的“軟”與“硬”:高畫質移動游戲開發之道

摘要:游戲的效果不僅與游戲引擎的渲染相關,與硬件優化也有千絲萬縷的聯系。一款基于芯片優化的移動游戲界面,甚至可以堪比視頻游戲的視覺效果。高通半導體事業部資深經理劉曉光從軟硬件兩個層面分享了移動游戲開發之道。 在今年的Unity亞洲開…

解決 VUE: [Vue warn]: Do not use built-in or reserved HTML elements as component id: xx

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 新增一個組件,運行無問題,但F12報錯: vue.esm.js?efeb:591 [Vue warn]: Do not use built-in o…

Linux系統重置和修改root密碼

Linux系統經常會出現忘記root密碼的情況,寫下此隨筆,以便記憶和學習。 一、重置root密碼的步驟如下: 1.如果系統是開機狀態,重啟一下。進到下面這個界面按字母“e”鍵。 2.找到 linux16這一行,將下圖紅框中的內容修改為…

KETTLE 使用教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Kettle的建立數據庫連接、使用kettle進行簡單的全量對比插入更新:kettle會自動對比用戶設置的對比字段,若目標表…

為什么你應該參與到開源項目中

試圖描述開源并不是一件容易的事——很多圖書作家,社區領袖和主持人對于開源社區的工作原理以及它是否對新人程序員有幫助持不同意見試圖描述開源并不是一件容易的事——很多圖書作家,社區領袖和主持人對于開源社區的工作原理以及它是否對新人程序員有幫…

根據庫位獲取倉庫id

通過location獲取warehouse location.get_warehouse() 轉載于:https://www.cnblogs.com/brucexl/p/11425603.html

AI:初學者如何從零學習人工智能?看完你就懂了

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 此文是想要進入人工智能這個領域、但不知道從哪里開始的初學者最佳的學習資源列表。 一、機器學習 有關機器學習領域的最佳介紹&#…

Ubuntu下Navicat 配置

創建快捷方式: 1. 創建navicat.desktop文件 2.內容如下: [Desktop Entry]EncodingUTF-8NameNavicat PremiumCommentThe Smarter Way to manage dadabaseExec/bin/sh "/home/fit/Downloads/navicat112_premium_en_x64/start_navicat"Icon/home/fit/Downloads/navicat1…

歷史上最知名的15位計算機科學家

基于維基百科上超過11,000位歷史人物的數據,麻省理工學院媒體實驗室創建出了一種名為“歷史人氣指數(HPI)”的參數。以下列出了15個歷史上最知名的計算機科學家,我們來看一下他們的“HPI”分數。麻省理工學院媒體實驗室推出了一個…

想要轉人工智能,程序員該如何學習?(學習路線、知識體系)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 對于程序員來說,碼農之路并不是一帆風順。對于每一個入行IT業的社會青年來說,誰不是抱著想要成為最高峰的技術大…

js 的匿名函數

var sum function(x,y){alert(xy); }; 像上面這種,function后面沒有函數名的函數就叫做匿名函數。以上是將匿名函數賦值給了sum變量。 還有一種寫法: alert((function(x,y){return xy; })(2,3));//結果為5 當單獨運行一個匿名函數時會報錯,比…

科目三并不難 盤點科目三技巧

科目三難不難?相信很多學員都會有這個疑問,其實,找駕校網可以負責任的告訴你,只要掌握了科目三考試技巧,通過科目三的機會將會大大增加。下面就請看科目三技巧,幫你輕松通過駕校科目三考試。   科目三考試…

健康腎臟有“六怕”

補腎”一詞大家并不陌生,甚至有人呢拿它當成功課來做。但其實,保護腎臟是日常生活中的小習慣就可以做到的,盲目的補腎則可能會傷腎!今天我們就來看看,腎臟都有哪“六怕”。 腎臟一怕:只重補腎,忽視腎臟健…

【轉載】矩陣求導、幾種重要的矩陣及常用的矩陣求導公式

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/daaikuaichuan/article/details/80620518 一、矩陣求導 一般來講,我們約定x(x1,x2,...xN)…

AI 人工智能學習路線

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 相關視頻資料下載見:https://blog.csdn.net/qwxwaty/article/details/80800701 階段一、人工智能基礎 - 高等數…

mysql多條數據合并一條之后取出重復值

mysql多條數據合并一條用,逗號分隔 GROUP_CONCAT(equipment_type) as type mysql多條數據合并一條用,逗號分隔并且去除重復值 GROUP_CONCAT(distinct equipment_type) as type 這里的distinct必須放在開頭 轉載于:https://www.cnblogs.com/zjj1990/p/11452951.html