1. 程式人生 > >面試官:說說你對css效率的理解

面試官:說說你對css效率的理解

大家好,我是小雨小雨,致力於分享有趣的、實用的技術文章。
內容分為翻譯和原創,如果有問題,歡迎隨時評論或私信,希望和大家一起進步。
大家的支援是我創作的動力。

選擇器的優先順序

眾所周知,選擇器是有權重的,優先順序從低到高,如下所示:

  • 型別選擇器(例如,h1)和偽元素(例如,::before)
  • 類選擇器 (例如,.example),屬性選擇器(例如,[type="radio"])和偽類(例如,:hover)
  • ID 選擇器(例如,#example)
  • !important 此宣告將覆蓋任何其他宣告,不建議使用,除非以下幾種情況:
  1. 覆蓋內聯樣式
  2. 覆蓋優先順序絕對高的選擇器

選擇器解析

雖然我們平常寫css選擇器是從左到右書寫的:

根節點 .子節點 .孫節點{

}

但是,這只不過是為了方便使用者書寫,真正的解析順序是反過來的,也就是從子節點搜尋到根節點,原因很簡單,因為查詢次數將大大影響效率。一個個來說

由於css tree是樹結構,如果從根節點開始,那麼就是類似深度優先遍歷的查詢方式,一圖闢千言:

如果到最後一個子節點仍然找不到的話,就是回到之前的父節點,繼續查詢其他的子節點,其實看起來也沒毛病哈,那我們來個對比,看下css為什麼選擇從左到右解析。

一樣的圖,換了個解析方向:

很明顯的差別就是,我們的判斷條件提前了,先判斷孫節點是否匹配,只有匹配才會繼續深入,否則直接跳過,然後這就從多個多條線(深度優先遍歷)變成了多個單條線的問題,有點類似於從O(n2) => O(n)的意思,大大提高了元素匹配效率。

大白話解釋就是: 從右到左解析比從左到右解析減少了查詢失敗的次數和深度

還有一點就是公共樣式,對於公共樣式,其實就是多個相同的樣式,從子節點到根節點是完全相同的,也就是一條線即可

書寫高效css選擇器

  • 優先就是避免使用萬用字元匹配,這樣css從右到左的解析就白搭了,莫得用處了。就和從左到右一樣一樣的了。
  • 之前提到的選擇器優先順序ID選擇器是最高的,但這僅僅限於單獨用ID選擇器,如果你和其他選擇器混合使用的話,就發揮不到id選擇器的唯一高效性了。為什麼呢?因為從右到左解析呀,比如 #box .text,會先進行類選擇器的查詢,最後才是ID選擇器,所以ID選擇器就顯的沒那麼重要了。
  • 儘量少使用標籤結束,因為這會讓瀏覽器查詢很多個子節點,然後才能確定是否匹配,比如:.box a
    ,只要有a標籤就會進行查詢,但是其實我們只想給.box上的a設定樣式,我們可以給個更具體的類選擇器:.box .href,這樣就能匹配更少的元素啦
  • 還有就是經常說的避免選擇器超過三個,比如 .div1 .div2 .div3 .p .a 就可以優化為 .div1 .a,為啥這樣說的,因為查詢中也有條件進行判斷啊我們提供了一個子節點.a,並且是在.div1下的其實就夠了,他會沿著一條線查詢,知道跟節點,咱寫這麼多選擇器只會徒增判斷條件,沒卵用。。
  • 還有就是儘量寫得具體,可以使用>操作符等等
  • 選擇器上能縮寫的命名就儘量縮寫、相同父層級的選擇器合併,都可以適當減少css體積。
  • 使用CSS BEM書寫規範
  • 歡迎補充

最後

這次分享內容就到這了,比較短小,哈哈。

打算做完rollup之後,重拾基礎了,畢竟一切都是從根本一點點碼起來的,只有底子厚了,才能厚積薄發。

相關推薦

怎麼回答面試Spring的理解

spring呢,是pivotal公司維護的一系列開源工具的總稱,最為人所知的是spring mvc,事實上,他們都是基於spring framework,並且再其上繼續增強,為某一方面服務的java元件。最近spring framework 剛升級到5,非常不錯。比較常見的有

面試: 說說async的理解

大家好,我是小雨小雨,致力於分享有趣的、實用的技術文章。 內容分為翻譯和原創,如果有問題,歡迎隨時評論或私信,希望和大家一起進步。 分享不易,希望能夠得到大家的支援和關注。 TL;DR async是generator和promise的語法糖,利用迭代器的狀態機和promise來進行自更新! 如果懶

「每日一題」面試Promise的理解?可能是需要能手動實現各個特性

關注「鬆寶寫程式碼」,精選好文,每日一題 加入我們一起學習,day day up >作者:saucxs | songEagle >來源:原創 ## 一、前言 2020.12.23日剛立的flag,每日一題,題目型別不限制,可以是:演算法題,面試題,闡述題等等。 ![每日一題](https://r

面試說說css效率理解

大家好,我是小雨小雨,致力於分享有趣的、實用的技術文章。 內容分為翻譯和原創,如果有問題,歡迎隨時評論或私信,希望和大家一起進步。 大家的支援是我創作的動力。 選擇器的優先順序 眾所周知,選擇器是有權重的,優先順序從低到高,如下所示: 型別選擇器(例如,h1)和偽元素(例如,::before) 類選擇器

面試剛說喜歡研究新技術,那麼請說說 Blazor 的瞭解

閱讀本文大概需要 1.5 分鐘。 最近在幾個微信 .NET 交流群裡大家討論比較頻繁的話題就是這幾天自己的面試經歷。 面試官:“你剛說你喜歡研究新技術,那麼你對 Blazor 瞭解多少?”。 作為一位專注於 .NET 開發的軟體工程師,你好意思說你對 Blazor 一點也不解嗎?.NET 新技術也就是那

面試為什麼要離開之前的公司?

離職、跳槽是一件很正常的事。但是難免在面試時會被問到:“你為什麼要離開之前的公司?”首先,你要知道面試官這麼問的目的是什麼?面試官問這個問題,是想知道你離開之前公司的原因是否合理,是想知道你是否對公司忠誠、有熱情、感興趣,想考察你動機是否單純、是否只是把公司當成一個“避難所”

面試分析過SpringMVC的源碼嗎?

技術分享 rop 調用 直接 setview gate rem code 上傳 1. MVC使用 在研究源碼之前,先來回顧以下springmvc 是如何配置的,這將能使我們更容易理解源碼。 1.1 web.xml <servlet> <servle

【BAT面試題系列】面試了解樂觀鎖和悲觀鎖嗎?

次數 catch val util overflow info 基本概念 因此 問題 前言 樂觀鎖和悲觀鎖問題,是出現頻率比較高的面試題。本文將由淺入深,逐步介紹它們的基本概念、實現方式(含實例)、適用場景,以及可能遇到的面試官追問,希望能夠幫助你打動面試官。 目錄

面試看過Redis資料結構底層實現嗎?

面試中,redis也是很受面試官親睞的一部分。我向在這裡講的是redis的底層資料結構,而不是你理解的五大資料結構。你有沒有想過redis底層是怎樣的資料結構呢,他們和我們java中的HashMap、List、等使用的資料結構有什麼區別呢。 1. 字串處理(string) 我們都知道redis是用C語言寫

面試瞭解過Redis物件底層實現嗎

上一章我們講了Redis的底層資料結構,不瞭解的人可能會有疑問:這個和平時用的五大物件有啥關係呢?這一章我們就主要解釋他們所建立的聯絡。 看這個文章之前,如果對ziplist、skiplist、intset等資料結構不熟悉的話,建議先回顧一下上一章節:面試官:你看過Redis資料結構底層實現嗎? 0. 五

面試是如何使用JDK來實現自己的快取(支援高併發)?

需求分析 專案中經常會遇到這種場景:一份資料需要在多處共享,有些資料還有時效性,過期自動失效。比如手機驗證碼,傳送之後需要快取起來,然後處於安全性考慮,一般還要設定有效期,到期自動失效。我們怎麼實現這樣的功能呢? 解決方案 使用現有的快取技術框架,比如redis,ehcache。優點:成熟,穩定,功能強大;

面試有m個雞蛋,如何用最少的次數測出雞蛋會在哪一層碎?

假設你面前有一棟n層的大樓和m個雞蛋,假設將雞蛋從f層或更高的地方放扔下去,雞蛋才會碎,否則就不會。你需要設計一種策略來確定f的值,求最壞情況下扔雞蛋次數的最小值。 leetcode原題連結 乍一看這道題很抽象,可能有的人一看到這個題目從來沒做過,就懵逼了。其實不用慌張,再花裡胡哨的題目,最後都可以抽象成我們

面試連RESTful都不知道我怎麼敢要

目錄 01 前言 02 RESTful的來源 03 RESTful6大原則 1. C-S架構 2. 無狀態 3.統一的介面 4.一致的資料格式

面試系列-面試能給我解釋一下javascript中的this嗎?

一.前言   關於javascript中的this物件,可能已經被大家說爛了。   即使是這樣,我依然決定將這篇文章給水出來。畢竟全國在新型肺炎的影響下,公司沒法正常復工。   除了刷刷手機,還是要適當的學習一下。   廢柴是真不好當,勞逸結合才是王道。 二.正戲開始   面試官:你能給我解釋一下javasc

【原創】面試回去等通知吧!

這是why技術的第37篇原創文章 老規矩,先聊聊生活,上面這張圖片是我週一拍的。 週一晚上下班後發現公司樓下推著三輪車賣花的阿姨又開始買花了。整個路口只有她一個人在做生意,整條路上也沒有幾個人,大家都低著頭匆匆走著,繁花中帶著點憂傷。 於是,我去買了一把白玫瑰。 上週日把《霍亂時期的愛情》看完了,就剛好當

Java堆記憶體是執行緒共享的!面試確定嗎?

Java作為一種面向物件的,跨平臺語言,其物件、記憶體等一直是比較難的知識點,所以,即使是一個Java的初學者,也一定或多或少的對JVM有一些瞭解。可以說,關於JVM的相關知識,基本是每個Java開發者必學的知識點,也是面試的時候必考的知識點。 在JVM的記憶體結構中,比較常見的兩個區域就是堆記憶體和棧記憶

【原創】面試:談談mysql聯合索引的認識?

引言 本文預計分為兩個部分: (1)聯合索引部分的基礎知識 在這個部分,我們溫習一下聯合索引的基礎 (2)聯合索引部分的實戰題 在這個部分,列舉幾個我認為算是實戰中的代表題,挑出來說說。 正文 基礎 講聯合索引,一定要扯最左匹配!放心,我不扯有的沒的,幾句話懂個大概就行! 最左匹配 所謂最左原則指的就是如果你

面試知道哪些事務失效的場景?

前言 宣告式事務是Spring功能中最爽之一,可是有些時候,我們在使用宣告式事務並未生效,這是為什麼呢? 文章首發於微信公眾號【碼猿技術專欄】 今天陳某帶大家來聊一聊宣告事務的幾種失效場景。本文將會從以下兩個方面來說一下事務為什麼會失效? @Transactional介紹 @Transactional失效場

面試精通 Docker,那來詳細說說 Dockerfile 吧

接上一篇:30分鐘快速上手Docker,看這篇就對了! 一、 帶著問題學Dockerfile 1、疑問 我們都知道從遠端倉庫可以pull一個tomcat等映象下來,然後docker run啟動容器,然後docker exec -it 容器id /bin/bash進入容器,往webapps下仍我們的程式。等等這

面試經歷過資料庫遷移麼?有哪些注意點和難點?

前言 最近寫了很多資料庫相關的文章,大家基本上對資料庫也有了很多的瞭解,資料庫本身有所瞭解了,我們是不是應該回歸業務本身呢? 大家去了解過自己企業資料庫的部署方式麼?是怎麼部署的,又是部署在哪裡的?部署過程中可能會出現的問題有哪些? 是主從?還是雙主?有沒有分庫?大的表做了分表沒?等等...部署方式大概率也都