언어 및 도구들 공부/HTML, CSS

가상 클래스와 가상 요소

Dr.Mlem 2024. 11. 21. 21:22

Q1.

CSS를 공부하는 와중에, 가상 클래스라고 듣게 되었어.

&:after{
			content: '|';
			display: inline-block;
			padding: 0 7px;
			color: #ccc;
		}

이런식으로 &: 로 들어가는게 가상 클래스인거야? 그렇다면 일반적인 클래스들은 또 따로 칭하는 것이 있어?




A1.

CSS에서 **:after 같은 것은 "가상 클래스(pseudo-class)"가 아니라 "가상 요소(pseudo-element)"**입니다. 비슷해 보이지만 **가상 클래스(pseudo-class)**와 **가상 요소(pseudo-element)**는 서로 다른 개념이니, 이를 분리해서 이해하면 좋습니다.


1. :after는 가상 요소 (pseudo-element)

&:after는 정확히는 **가상 요소(pseudo-element)**로, CSS를 통해 DOM에 실제로 존재하지 않는 요소를 만들어내고 스타일을 적용할 수 있습니다.

특징:

  • :after는 선택한 요소의 뒤쪽에 내용(content)을 삽입합니다.
  • :after로 생성된 내용은 실제 HTML에는 없지만, CSS를 통해 시각적으로 표시됩니다.

예시:

p:after {
  content: '✓';
  color: green;
}

결과:

HTML이 다음과 같을 때:

<p>Completed</p>

브라우저에서 보이는 결과:

Completed✓​
<!--색은 안 들어가네...-->

결론:

:after와 같은 가상 요소는 실제로 존재하지 않는 요소를 시각적으로 추가할 때 사용됩니다.


2. 가상 클래스 (pseudo-class)

**가상 클래스(pseudo-class)**는 특정 상태나 조건에 따라 스타일을 적용하기 위해 사용됩니다. 예를 들어, 요소가 마우스로 선택되었거나, 첫 번째 요소일 때 등의 상태를 기반으로 스타일링할 수 있습니다.

예시:

a:hover {
  color: red;
}

설명:

  • :hover는 가상 클래스입니다.
  • 사용자가 링크 위에 마우스를 올렸을 때 스타일을 변경합니다.

일반적인 가상 클래스 목록:

  • 상태 기반:
    • :hover, :focus, :active, :visited
  • 구조 기반:
    • :first-child, :last-child, :nth-child(n)
  • 기타:
    • :not(selector), :checked, :disabled

3. 일반적인 클래스들은 "클래스 선택자"라고 부른다

가상 클래스나 가상 요소와 구분하기 위해, 우리가 흔히 .className처럼 사용하는 CSS 클래스들은 **"클래스 선택자 (class selector)"**라고 부릅니다.

예시:

.myClass {
  color: blue;
}

특징:

  • HTML 요소에 class 속성을 부여하여 스타일을 적용합니다.
  • 예: <div class="myClass">Hello</div>

4. 가상 클래스 vs. 가상 요소 비교

 

특징 가상 클래스 (pseudo-class) 가상 요소 (pseudo-element)
사용 목적 특정 상태나 조건에 따라 스타일 적용 DOM에 없는 요소를 시각적으로 추가
예시 :hover, :focus, :nth-child(2) :before, :after, ::marker
HTML에 존재 여부 HTML 요소의 특정 상태를 기준으로 스타일 적용 실제로 존재하지 않는 요소를 시각적으로 생성

5. &의 역할 (Sass, Less 등에서 사용)

&는 CSS 자체의 문법이 아니라 Sass, Less 등의 CSS 전처리기에서 사용됩니다. &는 현재 선택자를 참조할 때 사용됩니다.

예제:

.button {
  color: blue;

  &:hover {
    color: red;
  }
}

컴파일 후 다음과 같은 일반 CSS로 변환됩니다:

.button {
  color: blue;
}

.button:hover {
  color: red;
}

따라서, &:after는 "현재 선택자 뒤에 :after를 추가하겠다"는 의미로, 최종적으로 selector:after와 같은 CSS로 변환됩니다.


요약

  1. :after는 **가상 요소(pseudo-element)**입니다. DOM에 존재하지 않는 요소를 시각적으로 추가합니다.
  2. :hover 같은 것은 **가상 클래스(pseudo-class)**로, 특정 상태를 기준으로 스타일을 적용합니다.
  3. 일반적인 .className은 **클래스 선택자(class selector)**라고 부릅니다.
  4. &는 CSS 전처리기(Sass, Less)에서 현재 선택자를 참조할 때 사용됩니다.

추가로 궁금한 점이 있으면 언제든 질문하세요! 😊

 

 

 

Q2.

일단 둘 다 가상이라고 붙는 점에서, 실제로 html 소스에 따로 클래스 이름이나 요소로서 존재하는 것은 아니지?

 

 

 

A2.

맞아요! "가상"이라는 이름이 붙은 이유는 HTML 소스에서 실제로 존재하지 않기 때문입니다. 가상 클래스(pseudo-class)와 가상 요소(pseudo-element)는 HTML 소스에 드러나지 않고 CSS로만 동작하는 특성을 가지고 있습니다.


1. **가상 클래스(pseudo-class)**의 특징

가상 클래스는 특정 조건이나 상태를 만족하는 기존 요소에 스타일을 적용합니다. 가상 클래스 자체는 HTML에 나타나지 않고, CSS에서 특정 상태를 감지하여 스타일링을 적용합니다.

예시: :hover

HTML 코드:

<a href="#">Hover me</a>

CSS 코드:

a:hover {
  color: red;
}
  • HTML에는 hover라는 상태가 따로 나타나지 않습니다.
  • 사용자가 링크 위에 마우스를 올렸을 때 브라우저가 hover 상태를 감지하고 스타일을 적용합니다.
  • 브라우저의 상태 관리일 뿐, HTML 구조 자체는 변하지 않습니다.

2. **가상 요소(pseudo-element)**의 특징

가상 요소는 CSS를 통해 DOM에 실제로 없는 내용을 추가하거나, 특정 부분에 스타일을 적용합니다.

예시: :after

HTML 코드:

<p>Hello</p>

CSS 코드:

p:after {
  content: '!';
  color: red;
}

렌더링 결과:

 
Hello!
  • HTML에 !는 없지만, CSS에서 가상 요소를 통해 브라우저가 이를 표시합니다.
  • 가상 요소는 브라우저의 렌더링 과정에서만 추가되며, HTML 소스에는 전혀 존재하지 않습니다.

3. 둘 다 실제 HTML 소스에는 없다

핵심 차이점:

  • 가상 클래스는 기존 요소의 상태를 기반으로 스타일을 적용합니다.
  • 가상 요소는 DOM에 없는 콘텐츠나 스타일을 시각적으로 추가합니다.

하지만 공통적으로, HTML 코드에는 가상 클래스나 가상 요소가 표시되지 않으며, CSS에만 존재합니다.


4. 실제 예시로 차이를 명확히 보기

HTML 코드:

<div class="box">Box</div>

CSS 코드:

.box:hover {
  background-color: yellow; /* 가상 클래스 */
}

.box:after {
  content: '!';
  color: red; /* 가상 요소 */
}

렌더링 결과 (브라우저에서):

Box!
<!--노란색으로 나와야 함-->
  • :hover: 마우스를 올리면 배경색이 노란색으로 바뀌지만, HTML에는 변화가 없습니다.
  • :after: !가 표시되지만, HTML 소스에는 추가된 내용이 없습니다.

요약

  • 둘 다 HTML 소스에는 표시되지 않습니다.
  • 가상 클래스는 기존 요소의 상태를 기반으로 작동하며, HTML의 구조 자체는 변하지 않습니다.
  • 가상 요소는 브라우저가 시각적으로 콘텐츠를 추가하거나 특정 부분을 스타일링하는 방식으로 작동하며, 역시 HTML에는 나타나지 않습니다.

추가로 궁금한 점이나 더 깊게 알고 싶은 주제가 있다면 알려주세요! 😊

'언어 및 도구들 공부 > HTML, CSS' 카테고리의 다른 글

Flex-grow와 flex-basis 02  (0) 2024.11.24
Flex-grow, shrink, basis  (0) 2024.11.22
html에서의 속성?  (0) 2024.11.19
inline-block이 뭐였지?  (0) 2024.10.23
Margin : auto  (0) 2024.09.10