CSS重構(gòu):樣式表性能調(diào)優(yōu)——讀書筆記

CSS重構(gòu):樣式表性能調(diào)優(yōu)

css同樣需要好好寫。

序言

  • 為什么要讀這本書?

其實(shí)這個問題說來話長,但是簡單的說。就是用團(tuán)隊(duì)年會拿的獎金買的書。而且這是我讀的第一本書。

而且,這是我讀的第一本有關(guān)css的紙質(zhì)書。因?yàn)樽鳛橐粋€前端,css總是被忽視一個技能。隨著nodejs以及很多js框架的誕生,前端由以前的被UI兼職,現(xiàn)在獨(dú)立出來,并且開始逐步搶占后端以及native端的底盤,我們越來越多去關(guān)注js的性能,設(shè)計模式,垃圾回收機(jī)制等等。

殊不知,CSS才是良好用戶體驗(yàn)的關(guān)鍵。

秉持這一觀點(diǎn)(僅代表個人),我推薦買了這本書。拿到手以后,薄薄的100多頁,然后興沖沖。。。

  • 是什么吸引我

這里我要引用書中的序言

人們常將前端技術(shù)HTML CSS 和JavaScript親切的稱為“三劍客”, 大抵說的是它們并肩而支撐起了數(shù)以億計的網(wǎng)站, 英勇、俠義之氣概不亞于桃園結(jié)義的劉關(guān)張, 但若將網(wǎng)站比作一個少女,HTML可視作她的身軀,CSS必然是伊人的著裝打扮,而JavaScript則是其言談舉止。胭脂粉易得,化妝之術(shù)難學(xué)。……改動一處樣式,結(jié)果頁面布局大亂,修改起樣式來如履薄冰,這哪里是哪里??!樣式明明加上了,可千呼萬喚就是不生效!伺候好一個瀏覽器,別家的又亂了,這還能按時發(fā)布嗎?!

簡單的文字,寫出了前端選手們的心聲啊。

重構(gòu)的原則

  1. 什么是重構(gòu)

重構(gòu)是指在不改變代碼行為的前提下,重寫代碼,使其更加簡潔、易于復(fù)用。

在國內(nèi)的大環(huán)境里,很多團(tuán)隊(duì)都急于嘗鮮,項(xiàng)目進(jìn)度飛快,需求上天入地、變化多端。重構(gòu)這個東西基本成了程序員的夢想?;蛘邠Q一句話說,不想重構(gòu)自己代碼的程序員不是一個好程序員。

為什么要重構(gòu)呢?

顯然,是因?yàn)楫?dāng)前的代碼不夠高效,且不利于維護(hù)。我們盡量提倡做小范圍的重構(gòu),但是現(xiàn)實(shí)經(jīng)常不如人意,很多基礎(chǔ)的架構(gòu)都冗余很多東西。那么問題來了。我們要重構(gòu),就要知道什么的是良好的架構(gòu)

下面我列舉書中提到的幾點(diǎn):

  • 優(yōu)秀的架構(gòu)是可預(yù)測的,就是當(dāng)其他人拿到你的代碼時,可以很快理解它是做什么用的
  • 優(yōu)秀的架構(gòu)可提升代碼復(fù)用性
  • 優(yōu)秀的架構(gòu)可擴(kuò)展
  • 優(yōu)秀的架構(gòu)可維護(hù)

如果我們重構(gòu)可以使得后來的架構(gòu)的達(dá)到以上目的,那么我們的重構(gòu)就是值得的。否則,不要輕易去重構(gòu)。

  1. 什么時候可以去重構(gòu)代碼

如果我們平時在修復(fù)bug,或者在開發(fā)新功能時,重構(gòu)代碼是最好的選擇。只有不斷的去重構(gòu)代碼,代碼的質(zhì)量才能達(dá)到卓越。

但是,現(xiàn)實(shí)是殘酷的。很多時候,我所面臨的代碼里面有很多的依賴,重構(gòu)這些依賴就好比拆毛衣上的線,拆的越多,需要重構(gòu)的部分也就越多。這個時候,如果時間比較緊,先把工作做完是更好的選擇。

還有,就是最好不要不要把重構(gòu)的眼光放在一些無關(guān)痛癢的編碼風(fēng)格上,不要患有“不是我寫的癥”。

在一個技術(shù)團(tuán)隊(duì)中,一個優(yōu)秀的領(lǐng)導(dǎo)能理解重構(gòu)代碼的重要性,但是未必所有人都是這樣他們可能會持有一下觀點(diǎn):

  • 花時間重寫代碼,看不到功能上的變化,浪費(fèi)時間
  • 這些代碼還能繼續(xù)正常工作,沒有必要修復(fù)
  • 你應(yīng)該當(dāng)初就把代碼寫正確。

如果有人持有以上建議,而且你對自己重構(gòu)有信心并且,不會影響項(xiàng)目進(jìn)度,作者建議你去重構(gòu)。在這個地方,我個人覺得還是要保持謹(jǐn)慎。確認(rèn)自己的重構(gòu)是有效的,不要為了重構(gòu)而重構(gòu)。因?yàn)?,不成熟的?yōu)化,也是一件讓人頭疼的事情。

如何寫出更好的CSS

  1. 級聯(lián)

    級聯(lián)是瀏覽器選擇為元素用哪一種樣式的方法。

  2. 選擇器的優(yōu)先級

    樣式的優(yōu)先級(我暫且這么稱呼,書中用特指度來描述)決定你的哪一行css是在工作的。

    • 用權(quán)重相加的方式來計算優(yōu)先級

      一般而言,選擇器越特殊,它的優(yōu)先級越高。也就是選擇器指向的越準(zhǔn)確,它的優(yōu)先級就越高。

      通常我們用1表示標(biāo)簽名選擇器的優(yōu)先級,用10表示類選擇器的優(yōu)先級,用100標(biāo)示ID選擇器的優(yōu)先級,如果是屬性后面加了!important那么屬性將會變?yōu)闊o窮。

      舉例:

      • div.test1 .span var 優(yōu)先級 1+10 +10 +1
      • span#xxx .songs li 優(yōu)先級1+100 + 10 + 1
      • #xxx li 優(yōu)先級 100 +1

      參考:https://www.xuewangzhan.net/wenti/7686.html

    • 通過選擇器特指度來計算優(yōu)先級

      特指度是用來表示css識別元素的精確性,可以用(a, b, c, d)四個維度來表示

      a 若果用style屬性來表示css樣式,則a = 1 否則為0

      b b為id選擇器的數(shù)量

      c 類選擇器屬性選擇器,偽類選擇器的數(shù)量

      d 類型選擇器和偽元素的數(shù)量

      在計算特指度時,左邊選擇的特指度最高,若兩個值相等,需要比較右側(cè)緊挨著的變量的值。如果兩個選擇器的特指度都相等,那么在css文檔中排在后面的將生效。

    舉例: #nav-g > ul > li > a.nav-link

    1. 樣式不是用style來加載的所以a = 1
      1. 有一個id選擇器 b = 2
      2. 有一個類選擇器 c = 1
      3. 有三個類型選擇器 d為3

    最后就是,除了!important之外,行內(nèi)樣式的特指度是最高的。

    如果有兩個屬性都用!important,則規(guī)則集排在后面的生效

  3. 如何寫好css

    • 使用注釋,我個人的觀點(diǎn),注釋必須要有,但不宜過多,過多的注釋同樣會讓人產(chǎn)生誤解
    • 結(jié)構(gòu)一致,比如,有的人喜歡吧規(guī)則集寫在一行里,例如li {color: #fff; font-size: 10px; ...},不過我個人更喜歡每個規(guī)則一行,然后按照一定的次序?qū)⑺麄兣帕?/li>
    • 保持選擇器的簡單
      • 簡單的選擇器有利于樣式的重構(gòu),即使改變了dom的結(jié)構(gòu),但其任然可以正常工作
      • 簡單的選擇器,性能更好,瀏覽器在關(guān)聯(lián)規(guī)則表的時,通常會從右邊開始匹配,使用特指度更高的選擇器使得,樣式能夠快速的匹配。
    • js與css的選擇器分開,js最好去操作類名達(dá)到改變樣式的目的,除了一些特定的功能比如說隱藏。
    • 要使用有意義的命名
      • 命名不需要粒度太細(xì),否則就是過于模塊化,這樣的代碼顯得冗余,且沒有達(dá)到代碼復(fù)用的效果
  4. css的分類

    • 通用樣式:瀏覽器通常會自帶一些樣式,我們需要一個通用的樣式來將這些樣式覆蓋掉,以達(dá)到在不同的瀏覽器呈現(xiàn)統(tǒng)一的效果

    • 基礎(chǔ)樣式 因?yàn)樵卦跊]有設(shè)置樣式的情況下會繼承父容器的樣式,有一些樣式例如

      • color
      • font-family
      • Line-height

      不需要每次都去設(shè)置它們,我們只需要定義一個基礎(chǔ)的樣式。

      • 文檔元素<head></head> <link></link><title><base><meta>這些標(biāo)簽不會顯示所以不需要樣式
      • 區(qū)塊元素 <address> <article><aside><body><footer><header><nav><section>這些元素主要用來做布局用,所以要注意它們的盒模型屬性的設(shè)置
      • 標(biāo)題和文本元素 <h1>-<h6> <p><pre><figure><ficaption>這些元素用來展示文本,所以要注意文本相關(guān)的屬性
      • 錨點(diǎn)標(biāo)簽元素:link :visited :focus :hover :active,這些元素標(biāo)識了一些狀態(tài)可以去關(guān)注out-line等
      • 文本語義元素<abbr><b><cite><code><data><dfn><em><i><kbd><s><strong><time><u>等
      • 列表元素<ol>(有序)<ul>(無序)<dl>(定義列表)
      • 組合元素<div><main><spsan>
      • 表格
      • 表單
      • 多媒體
    • 組件樣式,包括組件的基本樣式以及其行為,例如不同狀態(tài),動畫等

    • 結(jié)構(gòu)化樣式

    • 功能樣式

    • 瀏覽器特定樣式

  5. 通過樣式的分類,我們可以更好的去組織我們的樣式,吧同類的樣式放在一起,從而使得我們的樣式文件更加容易去維護(hù)。

關(guān)于測試

這是一個永恒 的話題,下面列舉幾點(diǎn)

  • 確定好自己的項(xiàng)目需要運(yùn)行的范圍,然后定制合適的測試環(huán)境,例如當(dāng)前項(xiàng)目可以運(yùn)行在多大屏幕上,可以在哪些瀏覽器上使用。

  • 可以通過工具來查看,我們的css是否已經(jīng)準(zhǔn)確的掛載到dom樹上

  • 視覺回歸測試

    我之前以為視覺回歸測試就是傳說中“觀察法”,其實(shí)里面還是有一些學(xué)問的。

    • 測試重要的點(diǎn)
    • 保持測試粒度
    • 在不同的瀏覽器上測試
    • 使用Gemini工具測試
  • 指定編碼規(guī)范,現(xiàn)在有很多工具例如eslint,css-beauty等

  • 建立模式庫,有利于編碼規(guī)范,同樣可以建立對應(yīng)測試的模式庫。

重構(gòu)吧

了解了上述知識后,我們就可以來重構(gòu)我們的項(xiàng)目。

建立不同類型的css,將他們組織在不同的文件中

去除無用的id以及僵尸代碼。

重構(gòu)是一個持續(xù)的過程,我們無法做到一次絕對完美的重構(gòu),但是,只要一直去做,那將會得到更好的用戶體驗(yàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 筆記: 為什么使用CSS代替HTML屬性設(shè)置樣式 因?yàn)镠TML屬性在單獨(dú)使用時有一定的局限性,所以要配合CSS...
    z_3231閱讀 163評論 0 0
  • JS 一、javaScript 是什么?有什么作用? HTML:寫網(wǎng)頁的 人的身體 CSS: 美化頁面的 人的衣服...
    小湯源O閱讀 200評論 0 0
  • HTML:寫網(wǎng)頁的 人的身體 CSS: 美化頁面的 人的衣服 havaScript:行為 大腦靈魂 havaScr...
    Key_L閱讀 100評論 0 0
  • day04 JS 一、javaScript 是什么?有什么作用? H...
    李霜_9191閱讀 183評論 0 0
  • 一 JavaScript是什么?有什么作用? HTML:寫網(wǎng)頁 人的身體 css:美化頁面 人的衣...
    劉哲_1d91閱讀 125評論 0 0

友情鏈接更多精彩內(nèi)容