HTML/CSS 7.CSS Selector

정선용·2022년 3월 17일
0

7. Selector

7.1 selector?

style을 적용하고자하는 HTML 요소를 셀렉터로 특정하고 선택된 요소에 스타일을 정의

7.2 전체 셀렉터 (Universal Selector)

패턴Description
*HTML 문서 내의 모든 요소를 선택한다. html 요소를 포함한 모든 요소가 선택된다. (head 요소도 포함된다)
<head>
<style>
 /* 모든 요소를 선택 */
 * { color: red; }
</style>
</head>
<body>
<h1>Heading</h1>
<div>
 <p>paragraph 1</p>
 <p>paragraph 2</p>
</div>
<p>paragraph 3</p>
</body>

Heading

paragraph 1

paragraph 2

paragraph 3

7.3 태그 셀렉터 (Type Selector)

패턴Description
태그명지정된 태그명을 가지는 요소를 선택한다.
<head>
<style>
 /* 모든 p 태그 요소를 선택 */
 p { color: red; }
</style>
</head>
<body>
<h1>Heading</h1>
<div>
 <p>paragraph 1</p>
 <p>paragraph 2</p>
</div>
<p>paragraph 3</p>
</body>

Heading

paragraph 1

paragraph 2

paragraph 3

7.4 ID 셀렉터 (ID Selector)

패턴Description
#id 어트리뷰트 값id 어트리뷰트 값을 지정하여 일치하는 요소를 선택한다. id 어트리뷰트 값은 중복될 수 없는 유일한 값이다.
<head>
<style>
 /* id 어트리뷰트 값이 p1인 요소를 선택 */
 #p1 { color: red; }
</style>
</head>
<body>
<h1>Heading</h1>
<div class="container">
 <p id="p1">paragraph 1</p>
 <p id="p2">paragraph 2</p>
</div>
<p>paragraph 3</p>
</body>

Heading

paragraph 1

paragraph 2

paragraph 3

7.5 클래스 셀렉터 (Class Selector)

패턴Description
.class 어트리뷰트 값class 어트리뷰트 값을 지정하여 일치하는 요소를 선택한다. class 어트리뷰트 값은 중복될 수 있다.
<head>
<style>
 /* class 어트리뷰트 값이 container인 모든 요소를 선택 */
 /* color 어트리뷰트는 자식 요소에 상속된다. */
 .container { color: red; }
 /* not supported in IE */
 #p2 { color: initial; }
</style>
</head>
<body>
<h1>Heading</h1>
<div class="container">
 <p id="p1">paragraph 1</p>
 <p id="p2">paragraph 2</p>
</div>
<p>paragraph 3</p>
</body>

Heading

paragraph 1

paragraph 2

paragraph 3

여기서 p2는 container class에 포함되어있지만, p2 id지정자로 css를 지정해주었기 때문에 red color가 적용되지 않았다.

  • CSS 우선순위

    (0)속성 값 뒤에 !important 를 붙인 속성
    (1)HTML에서 style을 직접 지정한 속성
    (2)#id 로 지정한 속성
    (3).클래스, :추상클래스 로 지정한 속성
    (4)태그이름 으로 지정한 속성
    (5)상위 객체에 의해 상속된 속성

    클래스로 셀렉터는 재사용 측면에서 유용하다. container, 요소 성격에 대해 미리 스타일을 지정해놓고 클래스를 지정하여 사용할 수 있다.

    <head>
    <style>
      /* class 어트리뷰트 값이 text-center인 모든 요소를 선택 */
      .text-center { text-align: center; }
      /* class 어트리뷰트 값이 text-large인 모든 요소를 선택 */
      .text-large  { font-size: 200%; }
      /* class 어트리뷰트 값이 text-red인 모든 요소를 선택 */
      .text-red    { color: red; }
      /* class 어트리뷰트 값이 text-blue인 모든 요소를 선택 */
      .text-blue   { color: blue; }
    </style>
    </head>
    <body>
    <p class="text-center">Center</p>
    <p class="text-large text-red">Large Red</p>
    <p class="text-center text-large text-blue">Center Large Blue</p>
    </body>

    Center

    Large Red

    Center Large Blue

7.6 어트리뷰트 셀렉터 (Attribute Selector)

패턴Description
셀렉터[어트리뷰트]지정된 어트리뷰트를 갖는 모든 요소를 선택
셀렉터[어트리뷰트~=”값”]지정된 어트리뷰트의 값이 지정된 값을 (공백으로 분리된) 단어로 포함하는 요소를 선택한다.
셀렉터[어트리뷰트 |= ”값”]지정된 어트리뷰트의 값과 일치하거나 지정 어트리뷰트 값 뒤 연이은 하이픈(“값-“)으로 시작하는 요소를 선택한다.
셀렉터[어트리뷰트^=”값”]지정된 어트리뷰트 값으로 시작하는 요소를 선택한다.
셀렉터[어트리뷰트$=”값”]지정된 어트리뷰트 값으로 끝나는 요소를 선택한다.
셀렉터[어트리뷰트*=”값”]지정된 어트리뷰트 값을 포함하는 요소를 선택한다.
<head>
<style>
 /* a 요소 중에 href 어트리뷰트를 갖는 모든 요소 */
 a[href] { color: red; }
</style>
</head>
<body>
<a href="http://www.poiemaweb.com">poiemaweb.com</a><br>
<a href="http://www.google.com" target="_blank">google.com</a><br>
<a href="http://www.naver.com" target="_top">naver.com</a>
</body>
poiemaweb.com
google.com
naver.com
<head>
<style>
 /* h1 요소 중에 title 어트리뷰트 값에 "first"를 단어로 포함하는 요소 */
 h1[title~="first"] { color: orange; }
 /* p 요소 중에 lang 어트리뷰트 값이 "en"과 일치하거나 "en-"로 시작하는 요소 */
 p[lang|="en"] { color: red; }
 /* a 요소 중에 href 어트리뷰트 값이 "https://"로 시작하는 요소 */
 a[href^="https://"] { color: green; }
 /* a 요소 중에 href 어트리뷰트 값이 ".html"로 끝나는 요소 */
 a[href$=".html"] { color: skyblue; }
</style>
</head>
<body>
<h1 title="heading first">Heading first</h1>
<h1 title="heading-first">Heading-first</h1>
<h1 title="heading second">Heading second</h1>
<h1 title="heading third">Heading third</h1>
<p lang="en">Hello!</p>
<p lang="en-us">Hi!</p>
<p lang="en-gb">Ello!</p>
<p lang="us">Hi!</p>
href="https://www.test.com">http://www.test.com</a>
<a href="test.html">test.html</a><br>
</body>

Heading first

Heading-first

Heading second

Heading third

Hello!

Hi!

Ello!

Hi!

http://www.test.com
test.html
<head>
<style>
  /* div 요소 중에서 class 어트리뷰트 값에 "yong"를 포함하는 요소 */
  div[class*="yong"] { color: red; }
  /* div 요소 중에서 class 어트리뷰트 값에 "yong"를 단어로 포함하는 요소 */
  div[class~="yong"] { background-color: yellow; }
</style>
</head>
<body>
<div class="first_yong">The first div element.</div>
<div class="second">The second div element.</div>
<div class="yong">The third div element.</div>
<p class="yong">This is some text in a paragraph.</p>
</body>
The first div element.
The second div element.
The third div element.

This is some text in a paragraph.

7.7 복합 셀렉터 (Combinator)


html은 계층 구조를 갖는다고 했다. element tree, object화 하게 되면 Dom Tree로 포현된다. <>로 표현된 엘레멘트는 <br>등을 제외하고 여는태그, 닫는태그로 이루어져있고, 열고닫는 태그 사이에 포함된 엘레먼트들은 상위 엘레멘트의 하위에 속한다고하고, 자손요소(자식요소)라고 한다.
이는 레벨로 표현할 수 있으며 root로부터 하위 엘레먼트일수록 1level씩 증가한다.
자신의 1 level 상위에 속하는 요소를 부모 요소, 1 level 하위에 속하는 요소를 자손 요소(자식 요소), 자신보다 n level 하위에 속하는 요소는 후손 요소(하위 요소)라 함.

사용법내용
셀렉터A 셀렉터B후손 셀렉터는 셀렉터A의 모든 후손(하위) 요소 중 셀렉터B와 일치하는 요소를 선택
셀렉터A > 셀렉터B자손 셀렉터는 셀렉터A의 모든 자식 요소 중 셀렉터B와 일치하는 요소를 선택
셀렉터A + 셀렉터B인접 형제 셀렉터 : 형제(동위) 셀렉터는 형제 관계(동위 관계)에서 뒤에 위치하는 요소를 선택할 때 사용/셀렉터A의 형제 요소 중 셀렉터A 바로 뒤에 위치하는 셀렉터B 요소를 선택,와 B 사이에 다른 요소가 존재하면 선택되지 않는다.
셀렉터A ~ 셀렉터B일반 형제 셀렉터 : 형제(동위) 셀렉터는 형제 관계(동위 관계)에서 뒤에 위치하는 요소를 선택할 때 사용/ 셀렉터A의 형제 요소 중 셀렉터A 뒤에 위치하는 셀렉터B 요소를 모두 선택
  • 후손 셀렉터 (Descendant Combinator)
    example

    <head>
    <style>
      /* div 요소의 후손요소 중 p 요소 */
      div p { color: red; }
    </style>
    </head>
    <body>
    <h1>Heading</h1>
    <div>
      <p>paragraph 1</p>
      <p>paragraph 2</p>
      <span><p>paragraph 3</p></span>
    </div>
    <p>paragraph 4</p>
    </body>
  • 자식 셀렉터 (Child Combinator)

    <head>
    <style>
      /* div 요소의 자식요소 중 p 요소 */
      div > p { color: red; }
    </style>
    </head>
    <body>
    <h1>Heading</h1>
    <div>
      <p>paragraph 1</p>
      <p>paragraph 2</p>
      <span><p>paragraph 3</p></span>
    </div>
    <p>paragraph 4</p>
    </body>
  • 형제(동위) 셀렉터 (Sibling Combinator)

    • 인접 형제 셀렉터(Adjacent Sibling Combinator)
    <head>
      <style>
        /* p 요소의 형제 요소 중에 p 요소 바로 뒤에 위치하는 ul 요소를 선택한다. */
        p + ul { color: red; }
      </style>
    </head>
    <body>
      <div>A div element.</div>
      <ul>
        <li>Coffee</li>
        <li>Tea</li>
        <li>Milk</li>
      </ul>
    
      <p>The first paragraph.</p>
      <ul>
        <li>Coffee</li>
        <li>Tea</li>
        <li>Milk</li>
      </ul>
    
      <h2>Another list</h2>
      <ul>
        <li>Coffee</li>
        <li>Tea</li>
        <li>Milk</li>
      </ul>
    </body>
    • 일반 형제 셀렉터(General Sibling Combinator)

      <head>
        <style>
          /* p 요소의 형제 요소 중에 p 요소 뒤에 위치하는 ul 요소를 모두 선택한다.*/
          p ~ ul { color: red; }
        </style>
      </head>
      <body>
        <div>A div element.</div>
        <ul>
          <li>Coffee</li>
          <li>Tea</li>
          <li>Milk</li>
        </ul>
      
        <p>The first paragraph.</p>
        <ul>
          <li>Coffee</li>
          <li>Tea</li>
          <li>Milk</li>
        </ul>
      
        <h2>Another list</h2>
        <ul>
          <li>Coffee</li>
          <li>Tea</li>
          <li>Milk</li>
        </ul>
      </body>

7.8 가상 클래스 셀렉터 (Pseudo-Class Selector)

  • 링크 셀렉터(Link pseudo-classes), 동적 셀렉터(User action pseudo-classes)
  • UI 요소 상태 셀렉터(UI element states pseudo-classes)
  • 구조 가상 클래스 셀렉터(Structural pseudo-classes)
  • 부정 셀렉터(Negation pseudo-class)
  • 정합성 체크 셀렉터(validity pseudo-class)

7.9 가상 요소 셀렉터 (Pseudo-Element Selector)

pseudo-elementDescription
::first-letter콘텐츠의 첫글자를 선택한다.
::first-line콘텐츠의 첫줄을 선택한다. 블록 요소에만 적용할 수 있다.
::after콘텐츠의 뒤에 위치하는 공간을 선택한다. 일반적으로 content 프로퍼티와 함께 사용된다.
::before콘텐츠의 앞에 위치하는 공간을 선택한다. 일반적으로 content 프로퍼티와 함께 사용된다.
::selection드래그한 콘텐츠를 선택한다. iOS Safari 등 일부 브라우저에서 동작 않는다.

7.10 Selector 활용법

selector는 class방식으로만 작성하고 네이밍 규칙은 BEM 방식으로 하는 것이 대세룰이 되었고,
selector 학습 및 활용은 모든 셀렉터를 외우는 것이 아니라 BEM을 기본으로 한다.
BEM은 Block, Element, Modifier의 약자이며, class선택자방식만을 이용하고, 다음의 이점을 가지고 있는 CSS 사용 방법론이다.

  • BEM은 목적 또는 기능을 전달한다.
  • BEM은 구성 요소의 구조를 전달한다.
  • BEM은 선택자 특이성을 항상 낮은 수준으로 유지한다.

또한 BEM은 다음의 규칙을 가지고있는 CSS 방법론이다.

BEM은 어떻게 동작하는가?
BEM 클래스 이름은 최대 세 가지로 구성된다.

  • 블록(Block): 구성 요소의 가장 바깥쪽 상위 요소를 블록으로 정의한다.
  • 요소(Element): 구성 요소 안쪽에는 하나 또는 그 이상의 요소가 있을 수 있다.
  • 변경자(Modifier): 블록 또는 요소는 변경자를 이용하여 변형을 표시할 수 있다.

왜 class 위주로 선택자를 사용하는지에 대한 설명은 BEM의 이점에서 설명이 가능하다. 특이성을 낮은 수준으로 유지하고, 구성요소 구조를 전달, 시멘틱하기 때문이다.
그렇다면 이전에는 왜 여러 선택자가 있었고 요즘은 selector의 중요성이 낮아졌을까?

: 예전에는 html와 css를 분리해서 html을 최대한 건들지 않고 css만으로 디자인을 하는것이 중요했지만, 요즘은 웹프레임워크 위에서 html과 css를 묶어 컴포넌트로 다루는 방식으로 진화했고, html의 수정과 css의 수정이 한 곳에서 이루어지다보니 selector가 복잡할수록 오히려 html을 수정하는데 문제가 더 발생하기 때문에 요즘은 selector는 BEM방법론으로 사용하고 html을 최대한 건들지 않기위한 복잡한 셀렉터 사용은 사용비율이 낮아졌다.

참고)
css 학습 게임 사이트
BEM introduction
예제로 이해하는 BEM

profile
정선용

0개의 댓글