패스트캠퍼스 강의를 정리한 내용입니다.
"The RED : 견고한 UI 설계를 위한 마크업 가이드 by 정찬명"
id | class, [attr] | type, ::element |
---|---|---|
0 | 0 | 0 |
type 선택자 : HTML 요소를 직접 선택하는 것
::element : 가상 요소 선택자
element | 선택자 특이성 점수 |
---|---|
a | 0,0,1 → 001 |
.a | 0,1,0 → 010 |
#a | 1,0,0 → 100 |
#a a | 1,0,1 → 101 |
#a.a a | 1,1,1 → 111 |
#a#b[href]::before | 2,1,1 → 211 |
CSS 선택자 점수 그래프
*두번째 그래프와 같이 낮고 평평한 것이 좋음
이미지 출처 : https://csswizardry.com/2014/10/the-specificity-graph/
CSS 선택자 사용 현황 분석 사이트 : https://cssstats.com/
CSS 선택자 명세 : https://www.w3.org/TR/selectors/
CSS 선택자 특이성 점수 계산 사이트 : https://specificity.keegan.st/
작명 규칙을 잘못 관리한 사례
1. 의미를 파악할 수 없는 작명
<style>
.bx {...}
.cnt {...}
.mt {...}
</style>
<style>
.content {...}
.button {...}
.top {...}
</style>
<style>
//reset.css
a { text-decoration: none; }
//local.css
.module a { text-decoration: underline; }
#special.module a { text-decoration: none; } 😱
#another#special.module a { text-decoration: underline; } 😱
</style>
<style>
.block {...}
.block__element {...}
.block__element--modifier {...}
.block--modifier {...}
</style>
블록 이름의 단어가 두 개 연달아 들어갈 때 키워드를 연결하는 방법
다른 라이브러리와 클래스가 중첩되는 것을 사전에 방지하기 위해 이름 공간을 위한 접두어 사용 추천
→ 예를 들어 modal이나 btn이라는 클래스 이름을 작성할 경우, 부트스트랩과 같이 해당 클래스를 사용 중인 다른 라이브러리와 함께 사용할 수 없음
// 접두어를 추가해 camelCase로 작성한 예
<style>
.lzModal {...}
.lzModal__title {...}
.lzBtn {...}
.lzBtn--small {...}
</style>
1. '블록'이 요소 또는 변형을 반드시 요구하는 것은 아님
// 단순 블록 사용 가능
<button class="btn">
2. '변형(--)'은 블록 또는 요소의 스타일을 확장
'변형(--)'은 클래스 단독 사용 불가하므로 항상 블록 또는 요소와 함께 사용해야 함
// ❌ 변형 클래스 단독 사용
<button class="btn--submit">
// ⭕ 블록 이름 명시 후 변형 클래스 사용
<button class="btn btn--submit">
<em class="info__label info__label--warning">
3. '선택자 특이성'이 높아지는 중첩 구조, 타입 선택자는 BEM에서 안티 패턴으로 간주
<style>
/* ❌ BEM 안티 패턴으로 작성하여 특이성이 높아진 잘못된 사용 예 */
.photo {} /* 특이성 10 */
.photo img{} /* 특이성 11 */
.photo figcaption{} /* 특이성 11 */
</style>
4. 제어하려는 모든 요소에 클래스 이름을 부여하여 특이성 관리
<style>
/* ⭕ 올바른 사용 예 */
.photo {} /* 특이성 10 */
.photo__img{} /* 특이성 10*/
.photo__caption {} /* 특이성 10 */
</style>
5. 블록/요소 이름 생략 금지. 요소/변형 이름 중복 금지
<style>
.__elem {} /* 블록 이름 생략 ❌ */
.--modi {} /* 요소 이름 생략 ❌ */
.block__elem1__elem2{} /* element 이름 두번 작성 ❌ */
.block--modi1-modi1{} /* modifier 이름 두번 작성 ❌ */
</style>
BEM과 함께 많이 언급되므로 알아두면 좋음
BEM 참고 사이트
https://en.bem.info/
https://naradesign.github.io/bem-by-example.html