巢狀深度

巢狀是一個非常強大的功能,但應謹慎使用。它可以非常容易和快速地發生,你開始巢狀並繼續將所有孩子包括在巢,巢,巢中。讓我來證明一下:

// SCSS
header {
  // [css-rules]

  .holder {
    // [css-rules]

    .dropdown-list {
      // [css-rules]

      ul {
        // [css-rules]

        li {
          margin: 1rem 0 0 1rem;
        }
      }
    }
  }
}

// CSS output of the last rule
header .holder .dropdown-list ul li {
  margin: 1rem 0 0 1rem;
}

問題

特異性

上面例子中的 li 有一個 margin 集。假設我們希望稍後在媒體查詢中覆蓋它。

@media (max-width: 480) {

  // will not work
  .dropdown-list ul li {
    margin: 0;
  }

  // will work
  header .holder .dropdown-list ul li {
    margin: 0;
  }
}

因此,通過巢狀太深,無論何時想要覆蓋某個值,都必須再次深入巢狀。更糟糕的是,這通常是使用規則 !important 的地方。

@media (max-width: 480) {

  // BIG NO-NO, don't do this
  .dropdown-list ul li {
    margin: 0 !important;
  }

為什麼 !important 規則是個壞主意

你應該以良好的方式編寫 SCSS,這些解決方案首先是不必要的。在這樣一個小問題上使用 !important 已經會讓你陷入一個兔子洞!

可重用性

這與特異性問題非常相似,但值得單獨指出。如果你設定類似按鈕或下拉選單的樣式,你可能希望在頁面上的其他位置重用這些樣式。

通過巢狀太深,你的樣式僅限於位於最外層父級(SCSS 頂部的元素)內的元素。這會導致你複製樣式並再次將它們貼上到其他位置。可能在另一個巢狀規則中。

你的樣式表將變得越來越大,越來越難以維護。

你應該有多深?

大多數 styleguides 將最大深度設定為 2.這是一般的好建議,因為很少有你想要深入巢狀的場合。大多數時候,2 就足夠了。