> 웹 프론트엔드 > HTML 튜토리얼 > 번역: BEM을 중첩하시겠습니까?

번역: BEM을 중첩하시겠습니까?

WBOY
풀어 주다: 2016-12-05 13:26:27
원래의
1294명이 탐색했습니다.

원본 링크: http://csswizardry.com/2016/11/nesting-your-bem/

이 글을 시작하기 전에 이 글은 제안이나 새로운 "실천 가이드"가 아니라는 점을 말씀드리고 싶습니다. 이것은 단지 내 자신의 환상 중 일부일 뿐입니다.

저는 [BEM](http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/)의 지지자이자 후원자입니다. 그리고 그것은 수년 동안 지속되었습니다. 기대가 되는 일이 좀 재미있네요. 물론, 그것은 나에게 많은 것을 제공합니다:

* **소프트 캡슐화** 이는 이름 충돌을 줄이는 데 도움이 됩니다.
* **사용자 정의 CSS** 이는 DOM 노드가 서로 어떻게 연관되어 있는지 이해하는 데 도움이 됩니다.
* **대상 선택** 이는 하위 트리 간의 충돌을 줄이고 너무 많은 노드를 캡처하는 것을 방지하는 데 도움이 됩니다.
* **관리 스타일의 특수성** 이것이 큰 하이라이트입니다.
* **엄격한 구현 규칙** 이는 주어진 컨텍스트 외부에서 클래스를 사용하는 것을 방지합니다.

마지막 주장은 절반만 사실이라는 점만 빼면...

BEM은 `.widget__title`과 같은 클래스가 `.widget` 내에서만 사용될 수 있다고 알려줍니다. 그러나 이는 단지 계약의 조항일 뿐이다. 개발자는 `.model` 안에 `.widget_title`을 넣어도 계속 작동할 수 있습니다. 그 이유는 다음과 같습니다.

* 이전에 BEM을 본 적이 없거나 구현 방법을 모릅니다.
* 그들은 게으르고 알아내면 안 되지만 `.modal` 내에서 .widget_title을 재사용할 수 있습니다. `스타일을 하고 나면 5분 일찍 작업을 완료할 수 있습니다

그들은 그렇게 할 수 있고 효과가 있습니다. 모든 것이 여전히 올바르게 표시됩니다. BEM은 단지 규정일 뿐이고 규정에는 만장일치의 동의가 필요하므로 이로 인해 추가 오류가 발생하지 않습니다.

이를 우회하려면 다음과 같이 CSS를 작성할 수 있습니다.

```
.widget { }

.widget .widget__title { }
```

이제 개발자는 `.modal` 내에서 `.widget_title`을 사용할 수 없습니다. CSS에 `wideget_title`을 `.widget` 안에 넣어야 작동한다고 알려주었기 때문입니다. 이제 우리는 이러한 사항을 시행하기 시작하여 남용을 방지할 것입니다.

여기에는 또 다른 문제가 있습니다: 중첩

## CSS에 중첩


오랫동안 저는 CSS에 중첩하는 것이 좋지 않다고 [적극적으로 주장](http://cssguidelin.es/#specity)해 왔습니다. 그 이유는 다음과 같습니다.

* 기능을 추가합니다(항상 관리해야 함).
* 저장 위치에 대한 종속성을 도입합니다(유연하지 않은 시스템의 표시).
* 이동성이 떨어집니다(즉, 마음대로 이동할 수 없음). ;
* 취약성 증가(중첩은 잘못된 선택자가 발생할 가능성이 높다는 것을 의미합니다).

요약하자면, [CSS 선택기를 짧게 유지하세요](http://csswizardry.com/2012/05/keep-your-css-selectors-short/).

그러나 중첩된 BEM을 사용하는 경우 중첩이 실질적인 이점을 제공한다는 것을 알 수 있습니다. 하지만 이러한 결함을 어떻게 처리해야 할까요?

## 특이성

일반적으로 항상 낮은 특이성을 유지하는 것이 중요합니다. 그것은 절대적으로 사실이며 훌륭한 조언입니다. 그러나 여기에는 우리가 알고 있는 것과 약간의 차이가 있습니다. 사람들이 모든 경우에 특이성을 처리해야 한다고 말할 때, 실제로 의미하는 바는 일관성을 유지해야 하며 선택자 간에 차이가 거의 없어야 한다는 것입니다.

이론적으로(하지만 시도하지 마세요) 항목의 유일한 선택자는 ID 선택자입니다. 이는 특이성을 잘 관리합니다. 특이성은 일반적으로 높지만 적어도 모두 일관되고 동일합니다.

일관성 문제를 처리하는 방법에 대해 이야기할 때 [특이성 맵](http://csswizardry.com/2014/10/the-Specificity-graph)을 참조합니다. /) 최대한 평평하게.

다음 CSS 구성요소 시리즈를 살펴보면:

```

.nav-primary { }

.nav-primary__item { }

.nav-primary__link { }

.마스트헤드 { }

.masthead__media { }

.masthead__text { }

.masthead__title { }

.하위 콘텐츠 { }

.sub-content__title { }

.sub-content__title--추천 { }

.sub-content__img { }

```

…우리는 각 클래스가 정확히 동일한 특이성을 가지고 있음을 발견했습니다. 이것은 멋진 평면 특이성 플롯입니다:

<그림>![특이도가 낮고 평탄한 그래프](http://p0.qhimg.com/t01298e8f9265d223bb.png)

[더 큰 이미지 보기](http://csswizardry.com/wp-content/uploads/2016/11/graph-specificity-01.png)< 무화과>

이러한 클래스를 다음과 같이 중첩하면:

```

.nav-primary { }

.nav-primary .nav-primary__item { }

.nav-primary .nav-primary__link { }

.마스트헤드 { }

.masthead .masthead__media { }

.masthead .masthead__text { }

.masthead .masthead__title { }

.하위 콘텐츠 { }

.sub-content .sub-content__title { }

.sub-content .sub-content__title--추천 { }

.sub-content .sub-content__img { }
```

…우리가 보는 특이성 플롯은 다음과 같습니다.

<그림>![특이도의 변화를 보여주는 그래프](http://p0.qhimg.com/t01afba20a956d400fc.png)

[더 큰 이미지 보기](http://csswizardry.com/wp-content/uploads/2016/11/graph-specificity-02.png)< 무화과>

맙소사! 스파이크는 프로젝트에서 서로 매우 가까운 선택기 간의 특이성의 변동을 나타내기 때문에 정확히 피하고 싶은 것입니다.

여기서 중첩의 특이성 단점을 시각화하고 있습니다. 이를 피할 수 있습니까? 어떻게?

## 첫 수업 링크

첫 번째 클래스(Block)를 다음과 같이 자체 클래스에 연결하려면 다음과 같이 하세요.

```
.nav-primary.nav-primary { }

.nav-primary .nav-primary__item { }

.nav-primary .nav-primary__link { }

.masthead.masthead { }

.masthead .masthead__media { }

.masthead .masthead__text { }

.masthead .masthead__title { }

.sub-content.sub-content { }

.sub-content .sub-content__title { }

.sub-content .sub-content__title--추천 { }

.sub-content .sub-content__img { }
```

…부작용 없이 모든 중첩 요소와 구체적으로 일치하도록 만들 수 있습니다.

* DOM에서 이 블록의 위치를 ​​알 필요가 없으므로 가능한 변경 위치에 따라 특이성을 높이지 않습니다.
* 다른 다른 또는 특정 요소에 연결하지 않습니다. 수업. 이는 Block 클래스가 여전히 매우 가볍다는 것을 의미합니다.

이러한 특이성 증가는 전적으로 그 자체이며 이제 다음과 같은 특이성 지도가 표시됩니다.

<그림>![특이도는 더 높지만 여전히 평평한 그래프](http://p0.qhimg.com/t01cecef3a98ac52bbf.png)

[더 큰 이미지 보기](http://csswizardry.com/wp-content/uploads/2016/11/graph-specificity-03.png)< 무화과>

첫 번째 사진보다 키가 크지만 여전히 매우 부드럽습니다. 비록 우리의 특이성이 두 단계 높음에도 불구하고 여전히 잘 관리되고 있습니다. 선택기 구성 요소에는 특별한 가중치가 없습니다.

## Sass로 단순화

더 쉽게 중첩하고 연결하기 위해 전처리를 사용할 수 있습니다. 이 경우 Sass는 다음과 같습니다.

우리 모두는 Sass에서 일반 선택자를 중첩하는 방법에 대해 잘 알고 있어야 합니다.

```
.nav-primary {

.nav-primary__item { }

.nav-primary__link { }

}
```

이는 우리가 예상한 대로 다음과 같은 결과를 가져옵니다.

```
.nav-primary { }

.nav-primary .nav-primary__item { }

.nav-primary .nav-primary__link { }
```

그런데 첫 번째 클래스를 그 자체에 빠르고 효율적으로 연결하려면 어떻게 해야 할까요? 이렇게:

```
.nav-primary {

{&} { }

.nav-primary__item { }

.nav-primary__link { }

}
```

``{&}`를 사용하면 현재 클래스를 자체 클래스에 연결할 수 있습니다. 이는 모든 Block 스타일(이 경우 `.nav-primary`)이 여기에 있음을 의미합니다.

```
.nav-primary {

{&} { /* 블록 스타일 */ }

}
```

[Sassmeister에 대한 간단한 예 보기](http://www.sassmeister.com/gist/a14e5b242ee6b20932dd44df0a3d215c)

## 실제 결과

이제 우리는 선택자를 DOM의 올바른 부분 밖으로 적극적으로 옮기는 경우 실제로 선택자를 사용하도록 강제하고 적극적으로 방지하는 상황에 처해 있습니다. 이는 다른 개발자들이 BEM의 작동 방식을 모르거나 모든 것이 제대로 보일 때까지 주변을 어지럽히는 경향이 있는 환경에서 작업하는 데 도움이 됩니다.

모든 클래스를 관리하는 구체성도 있습니다(늘어났지만)

### 결함

우리는 일반적으로 항상 피하려고 노력해야 하는 몇 가지 특이성을 추가하고 있습니다.

## 사용 사례

이 기술을 확장하려면 시작하기 전에 몇 가지 주요 사용 사례를 식별해야 합니다. 내 마음 속에 가장 먼저 떠오른 것은 그리드 시스템이었습니다. 개발자들은 `.grid` 상위 클래스 외에 `.grid__item` 클래스를 사용하려고 시도하는 것을 보았습니다. 따라서 이 기술을 사용하려면 여기에서 시작하겠습니다.

```
.grid.grid { }

.grid .grid__item { }
```

## 사용할 것인가, 사용하지 않을 것인가?

잘 모르겠습니다. 처음에 말했듯이 이것은 제가 적극 권장하거나 약속하는 기술이 아닙니다. 특히 다른 개발자가 CSS를 너무 쉽게 남용하는 환경에 있는 개발자를 위해 참고용으로 제시하고 싶었습니다.

하지만 제가 말하고 싶은 것은 BEM을 중첩했다면 돌아가서 첫 번째 클래스를 연결하여 특이성 지도를 평면화하라는 것입니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿