前端之CSS編碼規範

2020-08-13 10:14:47

前言

專案啓動時 css 應該注意哪些問題

檔名規範

檔名建議用小寫字母加中橫線的方式。爲什麼呢?因爲這樣可讀性比較強,看起來比較清爽,像鏈接也是用這樣的方式,例如

    // 地址: github的地址
    https://github.com/wangjeaf/ckstyle-node

那爲什麼變數名不用小寫字母加小劃線的方式,如:family_tree,而是推薦用駝峯式的familyTree?C語言就喜歡用這種方式命名變數,但是由於因爲下劃線比較難敲(shift + -),所以一般用駝峯式命名變數的居多。

引入css檔案的link可以不用帶type=「text/css」,如下程式碼

<link rel="stylesheet" href="test.css">

因爲link裏面最重要的是rel這個屬性,可以不要type,但是不能沒有rel。

js也是同樣道理,可以不用type,如下程式碼

<script src="test.js"></script>

沒有相容性問題。

 

屬性書寫順序

屬性的書寫順序對於瀏覽器來說沒有區別,除了優先順序覆蓋之外。但是如果順序保持一致的話,掃一眼可以很快地知道這個選擇器有什麼型別的屬性影響了它,所以一般要把比較重要的屬性放前面。比較建議的順序是這樣的:

你可能會覺得我平時差不多就是這麼寫的,那麼說明你有一個比較好的素養。並且我覺得規則不是死,有時候可以靈活,就像你可能會用transform寫居中,然後把left/top/transform挨在一起寫了,我覺得這也是無可厚非的,因爲這樣可以讓人一眼看出你要幹嘛。

 

不要使用樣式特點命名

有些人可能喜歡用樣式的特點命名,例如:

.red-font{
    color: red;
		}
.p1{
    font-size: 18px;
		}
.p2{
    font-size: 16px;
		}

然後你在它的html裏面就會看到套了大量的p1/p2/bold-font/right-wrap之類的類名,這種是不可取的,假設你搞了個red-font,下次UI要改顏色,那你寫的這個類名就沒用了,或者是在響應式裏面在右邊的排版在小屏的時候就會跑到下面 下麪去,那你取個right就沒用了。有些人先把UI整體瞄了一下,發現UI大概用了3種字號18px/16px/14px,於是寫3個類p1/p2/p3,不同的字號就套不同的類。這乍一看,好像寫得挺通用,但是當你看他的html時,你就瘋掉了,這些p1/p2/p3的類加起寫了有二三十個,密密麻麻的。我覺得如果要這樣寫的話還不如藉助標題標籤如下:

.house-info h2{
    font-size: 18px;
		}
.house-info h3{
    font-size: 16px;
		}

因爲把它的字號加大了,很可能是一個標題,所以爲什麼不直接用標題標籤,不能僅僅擔心因爲標題標籤會有預設樣式。

類的命名應當使用它所表示的邏輯意義,如signup-success-toast、request-demo、agent-portrait、 company-logo等等。

如果有些樣式你覺得真的特別通用,那可以把它當作一個類,如clearfix,或者有些動畫效果,有幾個地方都要用到,我覺得這種較爲複雜並且通用的可以單獨作爲一個類。但是還是趨向於使用意義命名。

 

不要使用hack

有些人在寫css的時候使用一些hack的方法註釋,如下:

.agent-name{
    float: left;
    _margin: 10px;
    //padding: 20px;
	}

這種方法的原理是由於//或者_開頭的css屬性瀏覽器不認識,於是就被忽略,分號是屬性終止符,從//到分號的內容都被瀏覽器忽略,但是這種註釋是不提倡的,要麼把.css檔案改成.less或者.scss檔案,這樣就可以愉快地用//註釋了。

還有一些專門針對特定瀏覽器的hack,如*開頭的屬性是對IE6的hack。不管怎麼樣都不要使用hack。

 

選擇器的效能

選擇器一般不要寫超過3個,有些人寫sass或者less喜歡套很多層,如下:

.listings-list{
    ul{
        li{
            .bed-bath{
                p{
                     color: #505050;
                }
            }
        }
    }}

一個容器就套一層,一層一層地套下來,最底層套了七八層,這麼長的選擇器的效能比較差,因爲Chrome裏面是用遞回從最後一個選擇器一直匹配到第一個,選擇器越多,匹配的時間就越長,所以時間會比較長,並且程式碼的可讀性也比較差,爲看到最裏面的p標籤的樣式是哪個的我得一層層地往上看,看是哪裏的p。程式碼裏面縮進了7、8層看起來也比較累。

一般只要寫兩三個比較重要的選擇器就好了,不用每個容器都寫進去,重要的目標元素套上class或者id。

最後一個選擇器的標籤的應該少用,因爲如果你寫個.container div{}的話,那麼頁面上所有的div第一次都匹配中,因爲它是從右往左匹配的,這樣的寫的好處是html不用套很多的類,但是擴充套件性不好,所以不要輕易這樣用,如果要用需要仔細考慮,如果合適才使用,最起碼不能濫用。

 

避免選擇器誤選

有時候會出現自己的樣式受到其他人樣式的影響,或者自己的樣式不小心影響了別人,有可能是因爲類的命名和別人一樣,還有可能是選擇器寫的範圍太廣,例如有人在他自己的頁面寫了:

* {
    box-sizing: border-box;
	}

結果導致在他個頁面的公用彈框樣式掛了。一方面不要寫*全域性匹配選擇器,不管從效能還是影響範圍來說都太大了,例如在一個有3個子選擇器的選擇器:

.house-info .key-detail .location{}

在三個容器裏面,*都是適用的,並且有些屬性是會繼承的,像font-size,會導致這三個容器都有font-size,然後一層層地覆蓋。

還有一種情況是濫用了:first-child、:nth-of-type這種選擇器,使用這種選擇器的後果是擴充套件性不好,只要html改了,就會導致樣式不管用了,或者影響到了其它無關元素。但是並不是說這種選擇器就不能用,只要用得好還是挺方便的,例如說在所有的li裏面要讓最後一個li的margin-left小一點,那麼可以這麼寫:

.listing-list li:last-child{
    margin-left: 10px;
}

這可能比你直接套一個類強。但是不管怎麼樣,不能濫用,合適的時候才使用,而不是僅僅爲了少寫類名。

 

減少覆蓋

覆蓋是一種常用的策略,也是一種不太優雅的方式,如下程式碼,爲了讓每個house中間的20px的間距,但是第一個house不要有間距:

.house{
    margin-top: 20px;
}
.house:first-child{
    margin-top: 0;
}

其實可以改成這樣:

.house + .house{
    margin-top: 20px;
}

只有前面有.house的.house才能 纔能命中這個選擇器,由於第一個.house前面沒有,所以無法命中,這樣看起來程式碼就簡潔多了。

還有這種情況,如下程式碼所示:

.request-demo input{
    border: 1px solid #282828;
}
.request-demo input[type=submit]{
    border: none;
}

其實可以藉助一個:not選擇器:

.request-demo input:not([type=sbumit]){
    border: 1px solid #282828;
}

這樣看起來程式碼也優雅了很多。

有一種覆蓋是值得的,那就是響應式裏面小屏的樣式覆蓋大屏,如下:

@media (min-width: 1025px){
     .container{
         width: 1080px;
         margin: 0 auto;
    }}

我一開始是就是這麼寫的,爲了遵循減少覆蓋原則,但是後來發現這種實踐不好,程式碼容易亂,寫成覆蓋的好處在於可以在瀏覽器明顯地看到,小屏的樣式是覆蓋了哪個大屏的樣式,這個在大屏的時候又是怎麼樣的。

 

少用!important

important用來覆蓋屬性,特別是在css裏面用來覆蓋style裡的屬性,但是important還是少用爲妙。有時候你爲了偷懶直接寫個!important,以爲這個的優先順序是最高的了,往往螳螂捕蟬,黃雀在後,很可能過不了多久又要再寫一個優先順序更高的覆蓋掉,這樣就略顯尷尬了。所以能少用還是少用。如果要覆蓋還是先通過增加新增選擇器權重的方式。

 

排版規範

不管是js/css,縮排都調成4個空格,如果你用的sublime,在軟體的右下角有一個Tab Size,選擇Tab Size 4,然後再把最上面的Indent Using Spaces勾上,這樣,當你打一個tab鍵縮排的時候就會自動轉換成4個空格。如果你使用vim,新增或者編輯~/.vimrc檔案新增一行:

:set tabstop=4 也會自動把縮排改成4個空格,其它編輯器自行查詢設定方法。因爲\t在不同的編輯器上顯示長度不一樣,而改成空格可以在不同人的電腦上格式保持一致。

多個選擇器共用一個樣式集,每個選擇器要各佔一行,如下:

.landing-pop,
.samll-pop-outer,
.signup-success{   
    display: none;
}

每個屬性名字冒號後面要帶個空格,~、>、+選擇器的前後也要帶一個空格:

.listings &gt; li{
    float: left;
}

 

正確使用background和img

顯示一張圖片有兩種方式,可以通過設定CSS的background-image,或者是使用img標籤,究竟什麼時候用哪種呢?

如果是頭圖等直接展示的圖片還是要img標籤,如果是做爲背景圖就使用background,因爲使用img可以寫個alt屬性增強seo,而背景圖那種本身不需要seo。雖然background有一個一個background-position: center center很好,但是頭圖那種還是使用img吧,自己去居中吧,不然做不了seo

 

響應式的規範

響應式開發最不好不要雜合使用rem,文字字號要麼全部使用rem,要麼不要用,也不要使用transform: scale去縮小,因爲被縮小的字號看起來會有點奇怪,別人都是14px,而你變成了13.231px,小了一點。響應式的原則一般是保持中間或者兩邊間距不變,然後縮小主體內容的寬度。

 

少用inline-block佈局

有些人喜歡用inline-block,特別是剛開始學切圖的人,因爲block會換行,而inline-block不會換行還具有盒模型,因此inline-block用得很順手,而float比較複雜,還要處理清除浮動之類的問題。如下佈局:

應該寫li,然後讓li float,如果你讓li display:inline-block也可以達到目的。但是inline-block用得多了可能會有一些奇怪的問題,你通常要在一個inline-block的元素裏面套block的元素,inline-block是行內元素,而block是塊級元素,這兩者終究有點差別。這種應該用float/flex會更自然,如果你float用順手了你會發現比inline-block好多了,並且更加專業。如果你沒怎麼用過flex ,那你可以嘗試換一下使用flex,如果你沒怎麼用過float,可以嘗試用一下。只有你的切圖方式多樣化了,你切起圖來才能 纔能比較靈活。