前端深入之css篇|你真的瞭解“權重”嗎?

来源:https://www.cnblogs.com/li-jp/archive/2019/09/29/11606523.html
-Advertisement-
Play Games

寫在前面 權重這個概念,相信對許多進行過前端開發的小伙伴來說肯定並不陌生,有時候一個樣式添加不上,我們就會一個 !important 懟上去,一切就好像迎刃而解了。但還有的時候,!important也並不能解決我們的問題,下麵請跟隨我來詳細瞭解一下css的權重吧! 探索權重 指某一因素或指標相對於某 ...


寫在前面

權重這個概念,相信對許多進行過前端開發的小伙伴來說肯定並不陌生,有時候一個樣式添加不上,我們就會一個 !important 懟上去,一切就好像迎刃而解了。但還有的時候,!important也並不能解決我們的問題,下麵請跟隨我來詳細瞭解一下css的權重吧!

探索權重

指某一因素或指標相對於某一事物的重要程度,其不同於一般的比重,體現的不僅僅是某一因素或指標所占的百分比,強調的是因素或指標的相對重要程度,傾向於貢獻度或重要性。

以上是摘自百度百科對“權重”的解釋。css中權重就相當於不同選擇器之間的排名,那麼權重是怎樣計算的呢?

  • 標簽選擇器 1
  • 類選擇器 10
  • id選擇器 100
  • 行內樣式 1000
  • !important ∞(正無窮)

這也就是為什麼我們更改樣式不起作用的時候喜歡用!important的原因了,因為放上去就是無窮大,仿佛所有樣式都可以正常使用了。但!important真的有這麼神奇嗎?不妨往下看。

簡單練習

分析以下代碼中文字的最終顏色。

<div class="myClass" id="myId" style="color:yellow; /* 權重1000 */">不是酸檸檬</div>
<style>
div{
    color: pink; /* 權重1 */
}
.myClass{
    color: red; /* 權重10 */
}
#myId{
    color: blue; /* 權重100 */
}
</style>
 

通過代碼,可以很清楚的瞭解到權重最大的是1000,所以當前文字應該現在為yellow黃色。

接下來我們加大難度試試。

<div class="myClass" id="myId" style="color:yellow; /* 權重1000 */">不是酸檸檬</div>
<style>
div{
    color: pink; /* 權重1 */
}
.myClass{
    color: red !important; /* 權重 ? */
}
#myId{
    color: blue !important; /* 權重 ?*/
}
</style>
 

這裡文字會顯示會顯示為blue藍色,因為此時類選擇器的權重是∞+10,id選擇器的權重是∞+100所以顯示為id選擇器的顏色。

那如果我就想讓他顯示紅色呢?我嘗試以下代碼

.myClass{
    color: red  !important !important; /* 權重 ? */
}
 

sorry,!important這樣用會造成報錯,!important的作用是給當前樣式加權重,但不能多次疊加。

深入思考

<div class="myClass" id="myId" style="color:yellow;">不是酸檸檬</div>
<button onclick="document.querySelector('#myId').style.color='green'">改變顏色</button>
<style>
div{
    color: pink;
}
.myClass{
    color: red !important; 
}
#myId{
    color: blue !important;
}
</style>
 

如果不點擊按鈕,那麼文字的顏色將會是id選擇器的顏色藍色,但是點擊按鈕後是要給元素添加顏色的,此時會顯示什麼顏色呢?

其實多思考以下就能想到,我們通過id找到了這個元素,然後修改他的顏色,所以本質上修改的是這個div的顏色,也就是行內元素,但是此時id選擇器的權重最大,所以點擊按鈕之後是不會修改成我們想要的綠色的。

那麼如果在js中修改時給綠色加權重呢,不妨試一下以下代碼

<button onclick="document.querySelector('#myId').style.color='green !important'">改變顏色</button>
 

sorry,!important也不能這樣使用,這不符合js的語法規則,所以無論如何點擊,顏色都不會改變的。

結論

通過以上實例,我們瞭解到了,簡單好用的!important在一些場景里也是不好用的,尤其是當你隨手拿來一個庫使用的時候,你瞭解不到它內部的權重分佈,所以樣式操作起來也不能夠得心應手。

當然你也不用糾結,一個優秀的庫或者框架都是很少使用!important的,當你發現你的樣式作用不上的時候,完全可以利用id選擇器來增加權重,實現你想要的效果。

!important雖好,也不要亂用哦~

結語

以上就是本文章的全部內容了,如果有不正確的地方歡迎指正。

感謝您的閱讀,如果感覺有用不妨點贊/轉發。

前端深入系列是一個踩坑系列,是由我本人對工作和學習中所遇到的問題和踩過的坑的一個探索與總結,在此記錄分享出去,同時也是對自我技能的一個反思和追問。

前端路漫,踩坑不斷。

前端深入系列持續更新中……

以上2019-9-27。


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

-Advertisement-
Play Games
更多相關文章
  • 1、form表單常用屬性練習 得到的效果是: ...
  • Cookie Cookie 是一種非常基礎的客戶端存儲方式,得到廣泛的支持 創建多個 cookie 的方法 當創建多個 cookie 時只能像這樣一個一個地創建,無法一次性創建多個 同一名字的 cookie 只能存在一個,因此再創建一個同名 cookie 相當於修改原有的 cookie 此時名為 的 ...
  • js的抖動 在 js 中 改變視窗大小 & 上下滾動滾動條 & 反覆向輸入框中輸入內容 ... , 如果綁定了相應的事件 , 這些事件的觸發頻率非常高, 嚴重影響用戶體驗和伺服器的性能 , 這種問題 在js中 就叫 js 的抖動 . 解決方法 : 防抖 & 節流 js的防抖 就是在 觸發事件 中設置 ...
  • 1、圖片和多媒體 (1) 圖片:img元素 src 屬性:圖片路徑; alt 屬性:圖片無法顯示時使用的替代文字; title:滑鼠懸停時顯示的文字 ; (2) 視頻:video元素 src 屬性:視頻路徑 ; controls 屬性:【布爾屬性】指定後,會顯示播放控制項; autoplay :【布爾 ...
  • axios是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,它可以在瀏覽器和node環境下運行,在github上已經有六七萬個星了,axios使用很方便,很多人在使用他,vue官方也推薦使用axios了,技術這東西還是隨主流吧,大家都用肯定有它的特長所在。 axios現在最 ...
  • 因為bootstrap自帶的固定列效果滿足不了公司需求,所以藉助fixed-table這個插件完成了iview固定列的效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>左右兩側固定列,中間內容可以橫向 ...
  • 公司最近有需求要做樹形式table。因為是前後端不分離項目,且之前已經引入了bootstrap table插件,現把實現方式分享一下: <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <meta http-equ ...
  • 1.html定義: html是一種超文本標記語言,“超文本”是指頁面可以包含圖片、鏈接、音樂、程式等非文字元素。 Html不是一種編程語言。 2.html5的新特性: 用於繪畫的canvas元素; 用於媒介回放的video和audio元素; 對本地離線存儲的更好支持; 新的特殊內容元素如articl ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...