国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

論 CSS 中的邏輯

PiscesYE / 3615人閱讀

摘要:天生缺乏邏輯性的問題導(dǎo)致了預(yù)處理器的出現(xiàn)。這會導(dǎo)致圈復(fù)雜度問題。圈復(fù)雜度對于來說可能是一種比較高階的原則,但如果我們通過它來考量那些蘊含在我們寫的選擇器中的邏輯性,那我們也許就能寫出更加優(yōu)秀的代碼。

  

本文在征得原作者 @csswizardry 同意的情況下,翻譯自他博客中的文章:Cyclomatic Complexity: Logic in CSS。最初發(fā)布于我的個人博客:咀嚼之味
另外呢,@hax前輩對本文的原作者的理論嗤之以鼻。所以加一句:盡信書,則不如無書。各位看官自己掂量著吧~

在過去的很長一段時間中,我們都說 CSS 是不帶有任何邏輯的,意思是在 CSS 中沒有控制流,也沒有某種類似于其他編程語言的方式來組織 CSS。CSS 天生缺乏邏輯性的問題導(dǎo)致了預(yù)處理器的出現(xiàn)。然而業(yè)界卻對 CSS 預(yù)處理器褒貶不一,支持預(yù)處理器的人認(rèn)為這彌補了 CSS 缺失的特性;而反對預(yù)處理器的人則認(rèn)為 CSS 的設(shè)計初衷就不應(yīng)該帶有邏輯性,他們認(rèn)為根本不應(yīng)該引入預(yù)處理器這個概念。

然而,一種獨特的思考方法最近突然蹦入了我的腦袋。它讓我感到 CSS 確實擁有邏輯性!很少有人真正那么想過,這大概也是我們一直認(rèn)為 CSS 的邏輯性匱乏的最大原因吧。

我發(fā)現(xiàn)我們可以將復(fù)合選擇器理解為:主體部分 + 條件部分。首先來看一個例子:

div.sidebar .login-box a.btn span {
    /*...*/
}

在這個復(fù)合選擇器由主體部分是 span,而條件部分是 IF (inside .btn) AND IF (on a) AND IF (inside .login-box) AND IF (inside .sidebar) AND IF (on div)

也就是說,一個選擇器的每一部分都是一個 if 語句,需要在解析選擇器時被滿足(或者不滿足)。有了這種微妙的而又全新的認(rèn)識,如今我們回頭再看看自己曾經(jīng)寫出的 CSS 代碼,我們將會意識到選擇器寫的好或者壞,會對效率產(chǎn)生直接的影響。我們真的會寫出下面這段邏輯嗎?(偽代碼):

@if exists(span) {
  @if is-inside(.btn) {
    @if is-on(a) {
      @if is-inside(.login-box) {
        @if is-inside(.sidebar) {
          @if is-on(div) {
            # Do this.
          }
        }
      }
    }
  }
}

也許不會。這看上去太不直接,也太啰嗦了。我們也許只需要這么寫:

@if exists(.btn-text) {

  # Do this.

}

每當(dāng)為選擇器添加一層限制,其實我們也就是添加了額外的一個 if 語句。這會導(dǎo)致圈復(fù)雜度問題(Cyclomatic Complexity)。

圈復(fù)雜度

在軟件工程中,圈復(fù)雜度是一種程序復(fù)雜性的一種度量標(biāo)準(zhǔn),它一般計算程序中的控制流的數(shù)量(如 if, else, while 等)。程序中存在越多的控制流,則圈復(fù)雜度就越高。我們自然想要保證圈復(fù)雜度能夠盡量地低,因為圈復(fù)雜度越高:

代碼就越難推導(dǎo)

更多潛藏著的、可能會導(dǎo)致失敗的問題

代碼更難以修改、維護以及復(fù)用

你需要考慮更多代碼執(zhí)行的結(jié)果與其副作用

編寫測試代碼的難度也會更高

從圈復(fù)雜度的角度來思考 CSS 的解析過程,我們可以看到瀏覽器在渲染樣式之前需要做許多的決定。我們寫的選擇器中的 if 語句越多,這個選擇器的圈復(fù)雜度就越高,這也意味著我們寫的選擇器越糟糕,為了使得這一條選擇器規(guī)則滿足,就有需要匹配更多的條件。同時,我們寫的選擇器也會缺乏清晰度和復(fù)用性,因為引入了過多不必要的 if 語句會導(dǎo)致不準(zhǔn)確的匹配(false positive)。

相比于將 span 嵌套于 .btn 內(nèi)部并寫一大堆限制條件,更好地做法應(yīng)該是創(chuàng)建一個新的類 .btn-text 來描述這個 span。這樣做更加直截了當(dāng),同時也更為簡潔和健壯(越多的 @if 語句導(dǎo)致選擇器規(guī)則越不容易被滿足)。

值得注意的是瀏覽器解析你寫的選擇器的方式:從右向左。如果你在寫你的選擇器時,第一個想到的問題是:“這是一個 span 元素嗎?” 那你通常就會把選擇器寫的過于冗繁。你應(yīng)該從另一個角度思考,寫出清晰準(zhǔn)確的選擇器規(guī)則,徹底摒棄那些冗余的條件語句。

請不要寫過于寬泛的規(guī)則,導(dǎo)致你寫的選擇器在匹配開始時就選中大量的 DOM 元素——然后不得不逐步通過更多的條件語句來刪減匹配的對象。從選擇器的規(guī)則解析的一開始就匹配盡量少的元素才是一種更棒的方法。

圈復(fù)雜度對于 CSS 來說可能是一種比較高階的原則,但如果我們通過它來考量那些蘊含在我們寫的選擇器中的邏輯性,那我們也許就能寫出更加優(yōu)秀的代碼。

一些易于遵守的小規(guī)則,

讓你的選擇器最簡化:每一次你想要為選擇器添加規(guī)則時,你都在添加額外的 if 語句。將這些 if 語句大聲地讀出來,仔細(xì)考慮它們是否有添加的必要。你需要時刻保持你寫的選擇器足夠合理與簡潔。

保證圈復(fù)雜度最小化: 使用像 Parker 這樣的工具來測試你寫的選擇器的圈復(fù)雜度(參考文檔:Identifiers Per Selector)

如果你不需要這個檢驗條件,那就不要把它放進選擇器: 有時在 CSS 中使用嵌套結(jié)構(gòu)是有必要的,可在大多數(shù)時候并不是,你甚至不能完全相信Inception Rule。

從右邊考慮選擇器如何編寫: 從需要匹配的那類元素開始,寫盡量少的額外的 CSS 代碼來完成一次正確的匹配。

寫選擇器時擁有明確的目的性: 確保你寫的選擇器確實是你想要的,而不是那些碰巧能使得頁面正常顯示的代碼。

你的選擇器是你的 CSS 結(jié)構(gòu)最基本的組成部分,一定要確保你寫的代碼足夠合理而簡練。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/111074.html

相關(guān)文章

  • 鳥瞰前端 , 再性能優(yōu)化

    摘要:前端性能優(yōu)化的涉及點從服務(wù)器到協(xié)議再到宿主環(huán)境本身都要有比較深刻的認(rèn)識,業(yè)界目前主要還是以雅虎總結(jié)出來條前端性能優(yōu)化的黃金軍規(guī)為參考。 歡迎大家前往騰訊云技術(shù)社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~ 導(dǎo)語 : 從事前端有6年+的時間了,從最開始的美工到重構(gòu)再到偏向js邏輯開發(fā)的前端開發(fā),一直在前端這個行業(yè)里面摸索和學(xué)習(xí),我現(xiàn)在將自己這些年的一個心得體會來個系統(tǒng)性的梳理寫成一篇關(guān)于性能優(yōu)化...

    voidking 評論0 收藏0
  • JS函數(shù)式編程 - 函子和范疇

    摘要:而且我們不需要了解的特別深,函數(shù)式編程很多概念是從范疇論映射過來的。了解范疇論相關(guān)概念有助于我們理解函數(shù)式編程。函子函子是用來將兩個范疇關(guān)聯(lián)起來的。 在前面幾篇介紹了函數(shù)式比較重要的一些概念和如何用函數(shù)組合去解決相對復(fù)雜的邏輯。是時候開始介紹如何控制副作用了。 數(shù)據(jù)類型 我們來看看上一篇最后例子: const split = curry((tag, xs) => xs.split(ta...

    JouyPub 評論0 收藏0
  • webpack多頁應(yīng)用架構(gòu)系列(十五):前端如何在后端渲染開發(fā)模式下夾縫生存

    摘要:回到純靜態(tài)頁面開發(fā)階段,讓頁面不需要后端渲染也能跑起來。改造開始本文著重介紹如何將靜態(tài)頁面改造成后端渲染需要的模板。總結(jié)在后端渲染的項目里使用多頁應(yīng)用架構(gòu)是絕對可行的,可不要給老頑固們嚇唬得又回到傳統(tǒng)前端架構(gòu)了。 本文首發(fā)于Array_Huang的技術(shù)博客——實用至上,非經(jīng)作者同意,請勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000820338...

    dinfer 評論0 收藏0
  • webpack多頁應(yīng)用架構(gòu)系列(十五):前端如何在后端渲染開發(fā)模式下夾縫生存

    摘要:回到純靜態(tài)頁面開發(fā)階段,讓頁面不需要后端渲染也能跑起來。改造開始本文著重介紹如何將靜態(tài)頁面改造成后端渲染需要的模板。總結(jié)在后端渲染的項目里使用多頁應(yīng)用架構(gòu)是絕對可行的,可不要給老頑固們嚇唬得又回到傳統(tǒng)前端架構(gòu)了。 本文首發(fā)于Array_Huang的技術(shù)博客——實用至上,非經(jīng)作者同意,請勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000820338...

    dingda 評論0 收藏0

發(fā)表評論

0條評論

PiscesYE

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<