목차
강력한
선택기는 특이성 수준이 높아지지 않고 적은 템플릿 로직과 BEM 클래스가 적은 템플릿 로직을 쓰는 데 도움이 될 수 있습니다.
웹 프론트엔드 CSS 튜토리얼 BEM 및 최신 CSS 선택기로 캐스케이드를 길들이십시오

BEM 및 최신 CSS 선택기로 캐스케이드를 길들이십시오

Mar 10, 2025 am 11:59 AM

Taming the Cascade With BEM and Modern CSS Selectors

bem. 프론트 엔드 개발의 거의 모든 기술과 마찬가지로 CSS를 BEM 형식으로 작성하면 분극이 발생할 수 있습니다. 그러나 트위터 소셜 서클에서는 더 인기있는 CSS 방법 중 하나 이상입니다.

나는 개인적으로 BEM이 좋다고 생각하고 당신이 그것을 사용해야한다고 생각합니다. 그러나 나는 또한 당신이 그것을 사용하지 않을지 이해할 수 있습니다.

BEM에 대한 귀하의 의견이 무엇이든, 그것은 몇 가지 이점을 제공합니다. 가장 큰 이점은 CSS 캐스케이드의 특정 충돌을 피하는 데 도움이된다는 것입니다. 적절하게 사용하면 BEM 형식으로 작성된 선택기는 동일한 특이성 점수 (0,1,0)를 가져야하기 때문입니다. 수년에 걸쳐, 나는 많은 대형 웹 사이트 (정부, 대학 및 은행을 생각)를위한 CSS를 디자인했으며 BEM이 실제로 빛나는 곳을 발견하게 한 큰 프로젝트입니다. CSS를 작성하는 것은 글을 쓰거나 편집하는 스타일이 웹 사이트의 다른 부분에 영향을 미치지 않는다고 확신 할 때 더 재미 있습니다.

실제로, 어떤 경우에는 특이성을 추가하는 것이 완전히 수용 가능한 것으로 간주됩니다. 예를 들면 다음과 같습니다. 그들의 특이성 점수는 0,2,0입니다. 다른 하나는 의사 요소 (예 :

)입니다. 특이성 점수는 0,1,1입니다. 그러나이 기사의 나머지 부분에서는 다른 특정 스프레드를 기대하지 않는다고 가정 해 봅시다. ? 그러나 나는 정말로 당신에게 BEM을 팔고 싶지 않습니다. 대신, 나는 더 강력한 캐스케이드 제어를 위해 현대식 CSS 선택기 (예 : ,

, 등)와 함께 사용하는 방법에 대해 이야기하고 싶습니다.

현대 CSS 선택기는 무엇입니까? :hover CSS 선택기 레벨 4 사양은 요소를 선택하는 강력하고 비교적 새로운 방법을 제공합니다. 제가 가장 좋아하는 것 중 일부에는 , :focus::before가 포함되어 있으며, 모든 현대식 브라우저에서 모두 지원되며 이제 거의 모든 프로젝트에서 사용하기에 안전합니다. ::after

는 기본적으로 특이성에 다른 영향을 미친다는 점을 제외하고는 기본적으로 동일합니다. 구체적으로, :is()의 특이성 점수는 항상 0,0,0입니다. 예, :has()조차도 구체적이지 않습니다. 동시에 :where()의 특이성은 매개 변수 목록에서 가장 구체적인 요소의 특이성입니다. 따라서 우리는 이미 사용할 수있는 두 개의 현대 선택기 사이의 캐스케이드 마감에 차이가 있습니다.

강력한

관계형 의사 클래스는 브라우저 지원을 빠르게 얻는 것입니다 (제 생각에는 그리드 이후 CSS의 가장 큰 새로운 기능). 그러나 글을 쓰는 시점에서

에 대한 브라우저 지원은 생산 환경에서 사용하기에 충분하지 않습니다. :is() 내 BEM에 의사 클래스를 추가하겠습니다 ...

아뇨! 그 특정 점수를 보셨습니까? BEM을 사용하면 선택기의 특정 점수가 0,1,0 인 이상적입니다. 0,2,0이 좋지 않은 이유는 무엇입니까? 유사한 확장 예제를 고려하십시오 :

두 번째 선택기가 소스 코드 시퀀스에 마침내 나타나더라도 첫 번째 선택기의 더 높은 특이성 (0,1,1)이 이기고

요소의 색상이 빨간색으로 설정됩니다. 즉, BEM이 올바르게 작성되었으며 선택한 요소가
<code>.something:not(a) {
  color: red;
}
.something--special {
  color: blue;
}</code>
로그인 후 복사
로그인 후 복사
기본 클래스와

modifier 클래스를 HTML에서 모두 적용한다고 가정합니다. .something--special 부적절하게 사용되면,이 의사 클래스는 예상치 못한 방식으로 캐스케이드에 영향을 줄 수 있습니다. 특히 더 크고 더 복잡한 코드베이스에서 나중에 문제를 일으킬 수있는 것은 이러한 불일치입니다. .something .something--special 오. 그래서 지금 무엇을해야합니까?

방금 말한 것을 기억하고

와 그 특이성은 0입니까? 우리는 이것을 활용할 수 있습니다 :

이 선택기의 첫 번째 부분은 일반적인 특이성 점수 0,1,0을 얻습니다. 그러나 와 그 안에있는 모든 것의 특이성은 0이며 선택기 특이성을 더 이상 증가시키지 않습니다.

: 여기서 ()는 우리가

를 둥지로써 허용합니다 내가하는 것만 큼 특이성에 관심이없는 사람들은 (그리고 아마도 많은 사람들이) 둥지를 잘 해왔습니다. 임의의 키보드 타이핑을 사용하면 이와 같은 CSS를 얻을 수 있습니다 (단순성을 위해 SASS를 사용한다는 점) : :where().

이 예에서는 구성 요소가 있습니다. "추천"카드 (/* ✅ 特异性分数:0,1,0 */ .something:where(:not(.something--special)) { /* 等 */ } 완고한 특정 광신자가 이것을 할 수 있습니다 :

나쁘지 않아요? 솔직히 이것은 CSS입니다. .something 그러나 HTML에도 단점이 있습니다. 숙련 된 BEM 저자는 조건부로 수정 자 클래스를 여러 요소에 적용하기 위해 복잡한 템플릿 로직이 필요하다는 것을 고통스럽게 알고있을 수 있습니다. 이 예에서 html 템플릿은 수정 자 클래스를 3 가지 요소 (, :where() 및 )에 조건부로 추가해야하지만 실제 예제에서는 더 많을 수 있습니다. 많은 if 진술이 있습니다.

선택기는 특이성 수준이 높아지지 않고 적은 템플릿 로직과 BEM 클래스가 적은 템플릿 로직을 쓰는 데 도움이 될 수 있습니다.

다음은 Sass의 동일한 내용입니다 (후행 대) :

다양한 아동 요소에 수정 자 클래스를 적용하는 대신이 방법을 선택 해야하는지 여부는 개인 선호도에 따라 다릅니다. 그러나 적어도
<code>.card { ... }

.card--featured {
  /* 等 */  
  .card__title { ... }
  .card__title { ... }
}

.card__title { ... }
.card__img { ... }</code>
로그인 후 복사
이제 우리는 선택의 여지가 있습니다!

BEM HTML이 없으면 어떻게해야합니까?

우리는 불완전한 세상에 살고 있습니다. 때로는 통제 할 수없는 HTML을 처리해야합니다. 예를 들어, HTML을 스타일링하는 데 필요한 타사 스크립트를 주입하십시오. 이 태그는 일반적으로 BEM 클래스 이름을 사용하여 작성되지 않으며 경우에 따라 이러한 스타일은 클래스를 전혀 사용하지 않고 ID입니다!

마찬가지로,

도이 문제를 해결하는 데 도움이 될 수 있습니다. 이 솔루션은 우리가 알고있는 DOM 트리의 클래스를 참조해야하기 때문에 약간 서투른 것입니다.

인용 부모 요소는 약간 위험하고 제한적이라고 느낍니다. 학부모 수업이 어떤 이유로 변경되거나 존재하지 않으면 어떻게됩니까? 더 나은 (그러나 아마도 똑같이 서투른) 솔루션은 대신 :where()를 사용하는 것입니다.

의 특이성은 선택기 목록에서 가장 구체적인 선택기와 같습니다.
<code>/* ❌ 特异性分数:0,2,0 */
.something:not(.something--special) {
  /* 所有 something 的样式,除了特殊的 something */
}</code>
로그인 후 복사
로그인 후 복사
따라서 위의 예에서와 같이

를 사용하지 않고 우리가 알고있는 클래스 (또는 희망!)를 언급하기 위해 :is()를 사용할 수 있습니다. :is()

항상 기존

는 우리가 :is() 요소를 선택하는 데 도움이되며, 에서 :where() 클래스의 존재는 셀렉터가 클래스와 동일한 특이성 점수 (0,1,0)를 사용하여

를 사용하여 선택기가 이것보다 더 구체적이지 않도록합니다.
<code>.something:not(a) {
  color: red;
}
.something--special {
  color: blue;
}</code>
로그인 후 복사
로그인 후 복사
그게 다야!

이것은 우리가 BEM 형식으로 CSS를 작성할 때 얻을 수있는 body 및 pseudo 클래스의 현대적인 특정 관리 기능을 활용하는 방법입니다. 가까운 시일 내에 Firefox (현재 글을 쓰는 시점에서 현재 로고 뒤에 지원됨)에 의해 지원되면 #widget:is()와 페어링하여 특이성을 취소 할 수 있습니다. .dummy-class 당신이 BEM을 완전히 명명하고 있는지 여부에 관계없이 선택기 특이성이 좋은 것이라는 데 동의 할 수 있기를 바랍니다! body

위 내용은 BEM 및 최신 CSS 선택기로 캐스케이드를 길들이십시오의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML, CSS 및 JavaScript로 애니메이션 카운트 다운 타이머를 만드는 방법 HTML, CSS 및 JavaScript로 애니메이션 카운트 다운 타이머를 만드는 방법 Apr 11, 2025 am 11:29 AM

프로젝트에 카운트 다운 타이머가 필요한 적이 있습니까? 그런 것은 플러그인에 도달하는 것이 당연하지만 실제로는 훨씬 더 많습니다.

HTML 데이터 속성 안내서 HTML 데이터 속성 안내서 Apr 11, 2025 am 11:50 AM

HTML, CSS 및 JavaScript의 데이터 속성에 대해 알고 싶었던 모든 것.

Sass를 더 빨리 만들기위한 개념 증명 Sass를 더 빨리 만들기위한 개념 증명 Apr 16, 2025 am 10:38 AM

새로운 프로젝트가 시작될 때, Sass 컴파일은 눈을 깜박이게합니다. 특히 BrowserSync와 짝을 이루는 경우 기분이 좋습니다.

당신이보고있는 동안, CSS 그라디언트가 더 좋아졌습니다 당신이보고있는 동안, CSS 그라디언트가 더 좋아졌습니다 Apr 11, 2025 am 09:16 AM

Lea Verou의 기능 목록을 주시 한 한 가지는 Conic-Gradient () Polyfill이 마지막 항목이었습니다.

WordPress 테마에서 VUE 구성 요소를 빌드하는 방법 WordPress 테마에서 VUE 구성 요소를 빌드하는 방법 Apr 11, 2025 am 11:03 AM

Inline-Template 지시문을 사용하면 기존 WordPress 마크 업에 대한 진보적 인 향상으로 풍부한 VUE 구성 요소를 구축 할 수 있습니다.

정적 양식 공급자의 비교 정적 양식 공급자의 비교 Apr 16, 2025 am 11:20 AM

"정적 양식 공급자"라는 용어를 동전하려고합시다. 당신은 당신의 HTML을 가져옵니다

PHP는 템플릿을위한 A-OK입니다 PHP는 템플릿을위한 A-OK입니다 Apr 11, 2025 am 11:04 AM

PHP 템플릿은 종종 서브 파 코드를 용이하게하는 데 나쁜 랩을 얻지 만, 그렇지 않아야합니다. PHP 프로젝트가 기본을 시행 할 수있는 방법을 살펴 보겠습니다.

세 가지 유형의 코드 세 가지 유형의 코드 Apr 11, 2025 pm 12:02 PM

새 프로젝트를 시작할 때마다 원하는 경우 세 가지 유형 또는 카테고리로보고있는 코드를 구성합니다. 그리고 나는 이러한 유형을 적용 할 수 있다고 생각합니다

See all articles