戲說前端之CSS編碼規範

来源:https://www.cnblogs.com/qidaoxueyuan/archive/2020/02/25/12361998.html
-Advertisement-
Play Games

前言 項目啟動時 css 應該註意哪些問題 文件名規範 文件名建議用小寫字母加中橫線的方式。為什麼呢?因為這樣可讀性比較強,看起來比較清爽,像鏈接也是用這樣的方式,例如 那為什麼變數名不用小寫字母加小劃線的方式,如:family_tree,而是推薦用駝峰式的familyTree?C語言就喜歡用這種方 ...


前言

項目啟動時 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 > 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,可以嘗試用一下。只有你的切圖方式多樣化了,你切起圖來才能比較靈活。
圖片


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

-Advertisement-
Play Games
更多相關文章
  • 先放圖 首先要引用的文件有: base.css https://www.cnblogs.com/chenyingying0/p/12363689.html jquery.js transition.js https://www.cnblogs.com/chenyingying0/p/12363649 ...
  • 首先曬出封裝好的dropdown.js (function($){ 'use strict';//使用嚴格模式 //構造函數形式 function Dropdown(elem,options){ //保存到this中才能公用 this.elem=elem; this.options=options; ...
  • 自己封裝好的showhide.js 包含無動畫、css3動畫、js動畫 包括:fade(淡入淡出) slideUpDown(上下滑動) slideLeftRight(左右滑動) fadeSlideUpDown(淡入淡出+上下滑動) fadeSlideLeftRight (淡入淡出+左右滑動) (fu ...
  • 一般是叫reset.css 我這邊命名成base.css 哎呀無所謂…… @charset "UTF-8"; /*css reset*/ /*清除內外邊距*/ body, h1, h2, h3, h4, h5, h6, p, hr, /*結構元素*/ ul, ol, li, dl, dt, dd, ...
  • transition相容性: 封裝一個js來驗證瀏覽器是否相容transition,以及選擇相容的寫法 以下是transition.js (function(){ //判斷transition屬性是否存在 //存在:空字元串 //不存在:undefined //console.log(documen ...
  • 在vue中,<input type="text" readonly="readonly" @click=""/>,點擊跳轉頁面。 在蘋果手機微信中,會滾動會頂部,才跳轉。滾動你喵呀。 經過各種測試,都不行,後來搜索了input的禁止輸入方法,發現: 換成這樣既可防止蘋果微信瀏覽器滾動,<input ...
  • 1.給元素的某個事件行為綁定方法,事件觸發,方法執行,此時方法中的this一般都是當前元素本身: <div id="div"></div> div.onclick = function() { console.log(this); //=><div id="div"></div> }; div.ad ...
  • 摘要 在React項目中,我們需要採用它的路由庫React-Router來進行頁面跳轉,React會根據路由URL來判斷是哪個頁面。常見的的URL有兩種顯示方式,一種是hashHistory的形式,形如:localhost:3000/#/free-lesson的路由,另一種是browserHisto ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...