수색…


비고

CSS의 특수성은 광범위한 요소 집합에 대한 일반적인 형식 지정 규칙을 정의한 다음 특정 하위 집합에 대해 재정의 할 수 있도록하여 코드의 간결성을 높이려고합니다.

계단식

계단식 및 구체성은 함께 사용되어 CSS 스타일 지정 속성의 최종 값을 결정합니다. 또한 CSS 규칙 집합에서 충돌을 해결하기위한 메커니즘을 정의합니다.

CSS 로딩 순서

스타일은 다음 소스에서이 순서대로 읽습니다.

  1. 사용자 에이전트 스타일 시트 (브라우저 공급 업체가 제공 한 스타일)
  2. 사용자 스타일 시트 (사용자가 자신의 브라우저에서 설정 한 추가 스타일)
  3. 작성자 스타일 시트 (작성자는 웹 페이지 / 웹 사이트의 작성자를 의미 함)
    • 어쩌면 하나 이상의 .css 파일
    • HTML 문서의 <style> 요소에서
  4. 인라인 스타일 (HTML 요소의 style 속성에서)

브라우저는 요소를 렌더링 할 때 해당 스타일을 검색합니다.

충돌은 어떻게 해결됩니까?

하나의 CSS 규칙 집합 만 요소의 스타일을 설정하려고 할 때 충돌이 없으며 해당 규칙 집합이 사용됩니다.

충돌하는 설정이있는 여러 규칙 세트가 발견되면 먼저 Specificty 규칙을 사용하고 계단식 규칙을 사용하여 사용할 스타일을 결정합니다.

예 1 - 특이성 규칙

.mystyle { color: blue; }  /* specificity: 0, 0, 1, 0 */
div { color: red; }        /* specificity: 0, 0, 0, 1 */
<div class="mystyle">Hello World</div>

텍스트의 색은 무엇입니까? (대답을보기 위해 마우스를 올려주세요)

푸른

먼저 특이도 규칙이 적용되고 가장 높은 특이성을 갖는 규칙이 "이기다".

예제 2 - 동일한 선택자를 사용한 계단식 규칙

외부 CSS 파일

.class {
  background: #FFF;
}

내부 CSS (HTML 파일)

<style>
.class {
  background: #000;
}
<style>

이 경우 동일한 선택자가있는 경우 랭귀지가 실행되고 마지막으로로드 된 것이 "이기기"로 결정됩니다.

예제 3 - 특이성 규칙 이후의 계단식 규칙

body > .mystyle { background-color: blue; }   /* specificity: 0, 0, 1, 1 */
.otherstyle > div { background-color: red; }  /* specificity: 0, 0, 1, 1 */
<body class="otherstyle">
  <div class="mystyle">Hello World</div>
</body>

배경색은 무엇입니까?

빨간

특이성 규칙을 적용한 후에도 여전히 파란색과 빨간색간에 충돌이 있으므로 계단식 규칙이 특이성 규칙 위에 적용됩니다. 계단식은 동일한 .css 파일 내에서나 스타일 소스 모음에서든 규칙로드 순서를 확인합니다. 마지막으로로드 된 항목은 이전 항목보다 우선합니다. 이 경우 .otherstyle > div 규칙이 "wins"됩니다.

최종 메모

  • 선택기 특이성이 항상 우선합니다.
  • 스타일 시트 주문 휴식 끈.
  • 인라인 스타일은 모든 것을 능가합니다.

중요한 선언!

!important 선언은 규칙에 우선 순위를 부여하여 스타일 시트의 일반적인 특수성을 재정의하는 데 사용됩니다. 그 사용법은 다음과 같습니다 : property : value !important;

#mydiv {
    font-weight: bold !important;    /* This property won't be overridden
                                       by the rule below */
}

#outerdiv #mydiv {
    font-weight: normal;            /* #mydiv font-weight won't be set to normal
                                    even if it has a higher specificity because
                                    of the !important declaration above */
}

!important 의 사용을 피하는 것은 절대적으로 필요한 경우를 제외하고 강력하게 권장됩니다. 왜냐하면 스타일 시트에서 불확실성을 초래할 수있는 CSS 규칙의 자연스러운 흐름을 방해하기 때문입니다. 또한 중요한 요소가 여러 개있는 경우, 특정 요소에 대해 동일한 규칙에 여러 개의 !important 선언을 적용하면보다 높은 특이성을 갖는 선언이 적용됩니다.

!important 선언을 사용할 수있는 몇 가지 예가 있습니다 :

  • html 요소의 style 속성 내부에 작성된 요소의 인라인 스타일에 의해 규칙을 재정의해서는 안됩니다.
  • !important 사용하여 작성자 스타일을 재정 의하여 글꼴 크기의 크기를 늘리거나 줄이는 것과 같은 웹 접근성을 제어 할 수 있습니다.
  • inspect 요소를 사용하여 테스트 및 디버깅합니다.

참조 :

선택기 특이성 계산

각각의 개별 CSS 셀렉터는 고유 한 특이도 값을 가지고 있습니다. 서열의 모든 선택자는 서열의 전반적인 특이성을 증가시킨다. 선별자는 세 가지 다른 특이성 그룹 중 하나 인 A , BC 중 하나에 속합니다. 여러 셀렉터 시퀀스가 ​​특정 요소를 선택하면 브라우저는 전체적인 특수성이 가장 높은 시퀀스에 적용된 스타일을 사용합니다.

그룹 다음으로 이루어진 예제들
에이 ID 선택자 #foo
클래스 선택자
속성 선택자
가상 클래스
.bar
[title] , [colspan="2"]
:hover , :nth-child(2)
기음 유형 선택기
의사 요소
div , li
::before ::first-letter

그룹 A는 최종적으로 그룹 C 그룹 B,이어서 가장 구체적이다.

범용 선택기 ( * )와 결합 자 ( >~ )는 특별한 성향이 없습니다.

예 1 : 다양한 선택자 서열의 특이성

#foo #baz {}      /* a=2, b=0, c=0 */

#foo.bar {}       /* a=1, b=1, c=0 */

#foo {}           /* a=1, b=0, c=0 */

.bar:hover {}     /* a=0, b=2, c=0 */

div.bar {}        /* a=0, b=1, c=1 */

:hover {}         /* a=0, b=1, c=0 */

[title] {}        /* a=0, b=1, c=0 */

.bar {}           /* a=0, b=1, c=0 */

div ul + li {}    /* a=0, b=0, c=3 */

p::after {}       /* a=0, b=0, c=2 */

*::before {}      /* a=0, b=0, c=1 */

::before {}       /* a=0, b=0, c=1 */

div {}            /* a=0, b=0, c=1 */

* {}              /* a=0, b=0, c=0 */

예 2 : 브라우저에서 구체성을 사용하는 방법

다음 CSS 구현을 상상해보십시오.

#foo {
  color: blue;
}

.bar {
  color: red;
  background: black;
}

여기에는 color파란색으로 선언하는 ID 선택기와 color빨간색으로 , 검정색으로 background 을 선언하는 클래스 선택기가 있습니다.

ID가 #foo 이고 클래스가 .bar 는 두 선언에서 모두 선택됩니다. ID 선택자는 그룹 A 특이성을 가지며 클래스 선택자는 그룹 B 특이성을 갖는다. ID 셀렉터는 클래스 셀렉터의 수를 능가합니다. 이 때문에 color:blue; #foo 선택기 및 background:black; .bar 선택자에서 요소가 요소에 적용됩니다. ID 선택기의 특이성이 높을수록 브라우저는 .bar 선택기의 color 선언을 무시하게됩니다.

이제 다른 CSS 구현을 상상해보십시오.

.bar {
  color: red;
  background: black;
}

.baz {
  background: white;
}

여기에는 두 개의 클래스 선택자가 있습니다. 하나는 선언 color 빨간색과 같은 background 검은 색으로, 다른 하나는 선언 background 흰색으로.

.bar.baz 클래스를 가진 요소는이 두 선언의 영향을 받지만, .bar.baz 는 동일한 그룹 B 특이성을 가지고 있습니다. CSS의 계단식 자연은 우리를 위해이 문제를 해결합니다으로 .baz 정의 .bar , 우리의 요소는 빨간색으로 끝나는 color 에서 .bar 하지만, 흰색 background 에서 .baz .

예 3 : 특이성을 조작하는 방법

위의 예제 2의 마지막 스 니펫을 조작하여 .baz 클래스 선택기 대신에 .bar 클래스 선택기의 color 선언이 사용되도록 할 수 있습니다.

.bar {}        /* a=0, b=1, c=0 */
.baz {}        /* a=0, b=1, c=0 */

이를 달성하는 가장 일반적인 방법은 .bar 선택기 시퀀스에 적용 할 수있는 다른 선택기를 찾는 것입니다. 예를 들어 .bar 클래스가 span 요소에만 적용된 경우 .bar selector를 span.bar 수정할 수 있습니다. 이렇게하면 .baz 선택 .baz 없는 새 그룹 C 특수성이 .baz .

span.bar {}    /* a=0, b=1, c=1 */
.baz {}        /* a=0, b=1, c=0 */

그러나 .bar 클래스를 사용하는 모든 요소간에 공유되는 다른 공통 선택기를 항상 찾을 수있는 것은 아닙니다. 이 때문에 CSS는 선택자를 복제하여 특이성을 높일 수 있습니다. 그냥 .bar 대신에 .bar.bar 대신 사용할 수 있습니다 ( Selectors의 문법 참조 , W3C 권장 사항 ). 여전히 .bar 클래스의 요소를 선택하지만 이제는 그룹 B 특수성을 두 배로 늘 .bar .

.bar.bar {}    /* a=0, b=2, c=0 */
.baz {}        /* a=0, b=1, c=0 */

!important 및 인라인 스타일 선언

스타일 선언의 !important 플래그와 HTML style 속성으로 선언 된 style 은 모든 선택기보다 더 큰 특이성을 가진 것으로 간주됩니다. 이러한 요소가 존재하면 스타일에 영향을 미치는 스타일 선언은 특수성에 관계없이 다른 선언을 무효화합니다. 즉, 동일한 요소에 적용되는 동일한 속성에 대해 !important 플래그가 포함 된 선언이 두 개 이상있는 경우가 아니면 그런 다음, 일반 특이성 규칙이 서로 참조하여 해당 특성에 적용됩니다.

그것들은 특이성을 완전히 오버 라이딩하기 때문에, !important 의 사용은 대부분의 유스 케이스에서 눈살을 찌푸리게됩니다. 하나는 가능한 한 그것을 사용해야합니다. 장기적으로 CSS 코드를 효율적으로 유지 보수하기 위해서는 !important 를 사용하는 것보다 주변 선택기의 특이성을 높이는 !important 좋습니다.

드문 예외 중 하나는 !important 하지 않은 부분입니다 !important 즉, .hidden 또는 .background-yellow 클래스와 같은 일반 도우미 클래스를 구현할 때 항상 발생하는 하나 이상의 속성을 덮어 씁니다. 그리고 그때조차도, 당신이하는 일을 알아야합니다. 유지 보수 가능한 CSS를 작성할 때 마지막으로 원하는 것은 CSS 전체에 !important 플래그를 넣는 것입니다.

최종 메모

CSS 특이성에 대한 일반적인 오해는 그룹 A , BC 값이 서로 결합되어야한다는 것입니다 ( a=1, b=5, c=1 => 151). 이것은 사실이 아닙니다 . 이 경우 그룹 B 또는 C 선택기 20 개를 사용하면 각각 하나의 그룹 A 또는 B 선택기를 무시할 수 있습니다. 세 그룹은 개별적인 수준의 특수성으로 간주되어야합니다. 특이성은 단일 값으로 표현 될 수 없습니다.

CSS 스타일 시트를 만들 때 가능한 한 가장 낮은 특이성을 유지해야합니다. 다른 방법을 덮어 쓰려면 특이성을 좀 더 높게 만들어야 할 필요가 있다면 가능한 높게 만들고 낮게 만들어 높게 만듭니다. 다음과 같은 선택기가있을 필요는 없습니다.

body.page header.container nav div#main-nav li a {}

이것은 미래의 변경을 더 어렵게 만들고 그 CSS 페이지를 오염시킵니다.


당신은 여기 에 당신의 선택 자의 특이성을 계산할 수 있습니다.

보다 복잡한 구체화의 예

div {
    font-size: 7px;
    border: 3px dotted pink;
    background-color: yellow;
    color: purple;
}

body.mystyle > div.myotherstyle {
    font-size: 11px;
    background-color: green;
}

#elmnt1 {
    font-size: 24px;
    border-color: red;
}

.mystyle .myotherstyle {
    font-size: 16px;
    background-color: black;
    color: red;
}
<body class="mystyle">
    <div id="elmnt1" class="myotherstyle">
        Hello, world!
    </div>
</body>

텍스트의 테두리, 색상 및 글꼴 크기는 어떻게됩니까?

글꼴 크기 :

font-size: 24; , #elmnt1 룰 세트는 문제의 <div> 에 대해 가장 높은 특이성을 #elmnt1 때문에 여기에있는 모든 속성이 설정됩니다.

경계:

border: 3px dotted red; . 경계 색 red#elmnt1 규칙 집합에서 취해 #elmnt1 , 가장 높은 특이성을 가지고 있기 때문입니다. 테두리, 테두리 두께 및 테두리 스타일의 다른 속성은 div 규칙 집합에서 가져옵니다.

배경색:

background-color: green; . background-colordiv , body.mystyle > div.myotherstyle.mystyle .myotherstyle 규칙 세트에 설정됩니다. 특이성은 (0, 0, 1) 대 (0, 2, 2) 대 (0, 2, 0)이므로 가운데 하나가 "이깁니다".

색깔:

color: red; . 색상은 div.mystyle .myotherstyle 룰 세트에서 설정됩니다. 후자는 (0, 2, 0)과 "승리"의 높은 특이성을 가지고 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow