본문 바로가기

프론트엔드(Front-End)/HTML&CSS&JavaScript

[CSS] CSS 기초 - CSS와 선택자(Selector)

WHAT’S CSS?

`HTML` 문서에 스타일 속성을 부여하는 데 전문성을 지닌 스크립트 언어

 

CSS의 적용 방법

`CSS`를 `HTML`에 적용하는 데에는 크게 세 가지 방법이 있습니다.

  1. 인라인 스타일 속성 : `<div style="border: 1px solid black;">텍스트</div>`
  2. html 내에서 스타일 속성 : `HTML`의 `<head>` 태그 안에 `<style>` 태그를 추가하여 안에 작성
  3. 외부 스타일 속성
/* 링크 태그로 적용하는 방법 */
/* 보통 로컬에서 직접 CSS를 만들어 적용시킬 때 하는 방법으로 href에 상대경로를 적음 */
<link rel="stylesheet" href="./main.css" />

/* import로 적용하는 방법 */
/* 아래와 같이 하는 건 css파일을 외부로 별도로 뺐을 때 이런 식으로 작성함 */
@import url("fineprint.css") print;
@import url("bluish.css") speech;
@import 'custom.css';
@import url("chrome://communicator/skin/");
@import "common.css" screen;
@import url('landscape.css') screen and (orientation:landscape);

/* 만약에 html 태그 내의 style 태그 내에 import 하고 싶으면 아래와 같이 
style 태그 안 쪽에 똑같이 하면 됨 import 하면 됨. */
<style>
@import url("fineprint.css");
</style>

 


CSS 선택자 (Selector)

일반 선택자

선택자 이름 선택자 설명 USAGE CSS ver.
전체 선택자 * html 전체 속성 등(테마 색상 등) * { } 2
타입 선택자 tag element tag = 선택자 div{ } 1
클래스 선택자 .class html 요소 class 속성 값을 기준 .class-name { } 1
ID 선택자 #id html 요소의 id 속성 값을 기준 #id { } 1


복합 선택자

선택자 이름 선택자 설명 USAGE CSS ver.
하위 선택자 공백 하위 요소 선택 div div { } 1
자식 선택자 > 직속 하위 요소 선택 div>a { } 2
인접 형제 선택자 + 인접한 형재 관계 일 때 div+div { } 2
일반 형제 선택자 ~ 형제(sibling)관계인 요소 선택 div ~ div 3

 

 

복합 선택자에서 적용 순서 따질 때 주의할 점

복합 선택자 중에서 하위선택자(공백)와 자식 선택자(>)는 부모-자식 관계에 대한 선택자입니다.
따라서, 부모-자식 관계가 아닌 관계에는 적용이 안될 수 있습니다.

 

인접 형제 선택자는 수평적 위치에서의 배치 위치에 따라서 스타일 적용이 달라질 수 있습니다.
인접 형제 선택자의 경우 바로 아래의 요소가 있을 때만 적용되고,

중간에 다른 태그가 들어가게 되면 그 부분은 적용이 안 될 수 있습니다.

 

일반 형제 선택자는 body 태그 아래부터 우선순위를 셈합니다.

그냥 단순히 `div~div{ }` 이러면, `body` 밑의 `div` 태그는 일단 전부 속성이 적용될 수 있습니다.

 

여기서 구조가 `div > div > div` 이렇게 파고 들어간다고 하더라도,

`div`에 이웃한 `div`가 있으면 `div~div { }` 에 적어둔 속성이 적용될 수 있습니다.

 

물론 이러한 규칙이 절대적인 것은 아니며, Selector를 어떻게 `조합` 해두었는가 에 따라서 결과가 달라질 수 있습니다.

CSS 선택자의 우선순위

`CSS`는 어디에서 스타일을 적용하느냐에 따라 적용에 대한 우선순위가 있습니다.

CSS 선택자는 보통 일반선택자의 종류에 따라 3단계로 선택자의 우선순위를 나눕니다.

 

 그중에서도 딱 두 가지는 예외로써 CSS 선택자에서 유례가 드문 절대적인 우선순위를 가집니다.

`!important` , `인라인 스타일 속성`

 

이 두 가지 선택자는 `!important > 인라인 스타일 속성`의 순서대로 적용되며,

다른 일반 선택자의 우선순위를 모두 무시할 수 있습니다.

 

CSS 선택자의 일반적인 3단계 우선순위는 아래와 같습니다.

/* 우선순위가 높을수록 좌측 */
ID 선택자 (#id{  }) > 클래스 선택자 (.className{  }) > 태그 선택자 (div{   })

 


CSS 속성의 우선순위는 일차적으로 위와 같이 일반 선택자 우선순위 수준에 따라 비교합니다.
만약 우선순위가 같은 경우에는 높은 우선순위를 양적으로 많이 가진 쪽이 우선됩니다.

 

이를 태그로 표현하면 `div div div` 이런 식으로 같은 수준의 일반 선택자들을

복합 연산자 등으로 묶어서 표현한 쪽이 더 우선 된다는 의미입니다.

 

하지만 여기서 추가로 클래스 선택자(.className{ }) 등과 동등한 우선순위를 가지는 선택자가 몇 가지 더 존재합니다.

/* 추가적인 CSS 선택자 들 */
-   [   ] Selector -> 속성 선택자
>> [type=checkbox] | [type] 이 있음.
전자는 type=checkbox인 애들만, 후자는 type 속성이 있기만 하면 적

- :nth-of-type(3n) 와 같은 콜론(':') selector -> 가상 클래스
- ::before 와 같은 더블 콜론('::') 선택자 -> 가상엘리먼트

- 속성 선택자는 HTML 태그의 속성값에 대응하므로, 안에 HTML 태그 속성값을 통해 접근합니다.

 


속성 선택자

선택자 설명 CSS ver.
[A] A 속성이 포함된 엘리먼트 선택 2
[A=V] A 속성의 값이 정확히 V인 경우 2
[A~=V] A 속성의 값이 V를 포함할 때 2
[A^=V] A 속성이 V로 시작할 때 3
[A$=V] A 속성이 V로 끝날 때 3
[A*=V] A 속성이 V를 포함하는 엘리먼트 3
[A|=V] A 속성이 정확히 V이거나, V로 시작하는 엘리먼트 2

 

*= 선택자는 ~=와 다르게 ~=는 ‘문자’가 포함되는지를 판단하는데,

*= 연산자는 속성값을 여러 개 가질 수 있는 경우 (like class) 그중에 하나라도 있는지 판단하는 연산자입니다.

 

가상 클래스 선택자

선택자 설명 CSS ver.
:link 방문하지 않은 링크를 선택 1
:visited 방문한 링크를 선택 1
:hover 마우스를 올려 놓으면 1
:active 요소가 활성화 상태이면 1
:focus 지정된 요소가 포커스를 가지면(input 태그) 2
:first-child 첫 번째 요소(부모 - 자식 관계에서) 2
:last-child 마지막 요소(부모 - 자식 관계에서) 3
:nth-child(n) n번째 요소(부모 - 자식 관계에서) / 수식 연산 가능(2n+1) 3
:enabled 요소가 enabled 일 때 3
:disabled 요소가 disabled 일 때 3
:checked 지정된 요소가 checked 인 경우 (checkbox) 3



가상 엘리먼트 (IE 9.0 부터 지원) 선택자

선택자 설명 CSS ver.
::after 지정된 요소 뒤에 content 추가 2
::before 지정된 요소 앞에 content 추가 2
::first-letter 지정된 요소의 첫 번째 문자 선택 1
::first-line 지정된 요소의 첫 번째 줄(라인) 선택 1
::selection 사용자에 의해 선택된 요소의 위치 선택 3

 

 

 

 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Pseudo-classes Selector(가상클래스선택자)</title>

    <style type="text/css">
      p.intro::first-letter {
        font-size: 200%;
      }

      p.intro::first-line {
        font-weight: bold;
      }

      p:last-child::after {
        content: "(source: www.w3schools.com)";
        color: orange;
      }

      ::selection {
        color: steelblue;
      }
    </style>
  </head>

  <body>
    <h1>CSS Tutorial</h1>
    <h3>CSS is a language that describes the style of an HTML document.</h3>
    <p class="intro">CSS describes how HTML elements should be displayed.</p>
    <p>This tutorial will teach you CSS from basic to advanced.</p>
  </body>
</html>

 

CSS 선택자의 우선순위 정리

쉼표는 우선 순위가 동등하다는 것을 의미합니다.

이렇게 우선순위를 따졌는데도 CSS 선택자가 모든 우선순위가 정확히 동일하면 코드에서 나중에 적용한 것을 반영합니다.

  1. !important 
  2. inline style 속성
  3. id selector(#id)
  4. 클래스 셀렉터(.class), [], 가상클래스(:hover), 복합연산자(>, 공백, +, ~)
  5. 타입 선택자( div{  } ), pseudo 엘리먼트(::before)
  6. *(전체 속성) 연산자

이렇게 우선순위를 따졌는데도 우선순위가 동일한 경우에는 코드에서 나중에 적용한 것을 반영합니다.

 

CSS 우선순위를 그림으로 설명한 사이트    
https://specifishity.com/

 

Specifishity :: Specificity with Fish

 

specifishity.com