본문 바로가기
지금, 개발하기/CSS

HTML/CSS] before, after 가상요소

by Seaco :) 2023. 8. 8.

 

가상 요소(Virtual element)는 HTML 문서 트리(DOM)에는 실제로 존재하지 않지만 CSS를 사용하여 스타일을 적용할 수 있는 요소를 의미합니다. 가상요소를  사용하면 HTML문서에 존재하지 않는 요소를 CSS를 통해 생성하고 스타일을 적용할 수 있습니다. 다시 말해서, HTML 태그나 javascript없이 CSS만으로도 HTML 문서 안에 디자인 요소를 추가할 수 있다는 것이죠.

가상 요소에는 대표적으로 ::before와 ::after가 있습니다. ::before는 선택한 요소의 시작 부분(앞)에 가상 요소를 생성하고, ::after는 선택한 요소의 끝 부분(뒤)에 가상 요소를 생성합니다. 아래의 간단한 예시를 보면 "Hello, World" 앞에 before 가상요소(👋)가 뒤에 after 가상요소(😉)가 생긴걸 볼 수 있습니다. 

 


가상 요소는 주로 추가적인 콘텐츠를 생성하거나 요소의 디자인을 꾸밀 때 사용됩니다. 예를 들어, 위의 예시처럼  content 속성을 사용하여 가상 요소에 콘텐츠를 추가할수도 있구요. 홈페이지 아래 푸터에 구분선을 넣을수도 있구요. 체크박스나 리스트의 아이콘 등을 변경할 수도 있습니다.

예시1. 구분선
예시2. 체크박스
예시3. 리스트

 

📌1. 가상요소 작성방법 

  1. 콜론 두개(::): before, after 이름 앞에 콜론 두개(::)를 사용
    (CSS3부터는 가상클래스와 구분하기위해 콜론 두개를 사용하는 것을 권장합니다)
  2. content 속성: 가상요소에 표시할 컨텐츠를 반드시 표기
  3. 기본값 inline : 가상요소는 기본적으로 inline요소이므로 원하는 크기를 갖기위해선 block이나 inline-block으로 변경

 

📌2. Contents속성

content: "";			// 빈값
content: "Hello";		// 문자열
content: "\2605";			// 특수문자 ★
content: "url("image.png")";	// url값
content: attr(data-text);	// <div data-text="예시"></div>의 예시
content: counter(카운터명)	// 순서 넘버링
  • 빈값: 아무내용도 표시하지 않음
  • 문자열: 따옴표(")나 작은따옴표(')로 묶인 일반 텍스트 문자열
  • 특수문자: 일부 특수 문자나 이스케이프 시퀀스
  • URL: 이미지의 url을 사용
  • 데이터 속성: 요소의 데이터 속성값을 가져와서 표시
  • counter: 자동으로 순서를 생성

 

📌3. before, after 예시

💡 (1) 특수문자, 문자열 생성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <style>
        .custom-label {
        position: relative;
        font-size: 24px;
        }

        .custom-label::before {
        content: 'Hi, '; 
        }

        .custom-label::after {
        content: ' \2605'; 
        }
    </style>
    <div class="custom-label">Stars!</div>
</body>
</html>

 

💡 (2) 구분선 넣기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>:before와 ::after 연습</title>
</head>
<body>
    <div>
        <ul>
          <li><a href="#" class="">회사소개</a></li>
          <li><a href="#" class="">인재채용</a></li>
          <li><a href="#" class="">이용약관</a></li>    
          <li><a href="#" class="">고객센터</a></li>    
        </ul>
      </div>
    <style>
        /* 기본 적용된 스타일링 제거 */
        ul,li{
            margin: 0;
            padding: 0;
            list-style: none;
        }
        a{
            text-decoration: none;
            color: inherit;
            display: inline-block;
        }

        /* 구분선 스타일링 */
        ul {
            display: flex;
        }
        li {
            padding: 10px;
        }

        li::after{
            content: "|";
            padding-left: 17px;
        }
        li:last-child::after{
            content: "";
        }   
    </style>
</body>
</html>

 

💡 (3) 순번 자동생성

counter-reset: 먼저 카운터를 초기화
conternt: coutent 속성에 counter함수를 이용하여 카운터 값을 표시
counter-increment: counter-increment 속성을 사용하여 각 항목마다 카운터 값을 증가

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
<body>
    <style>
        ol {
            counter-reset: myCounter;   /* 카운터 초기화 */
            list-style-type: none; /* 리스트 스타일 제거 */
        }
        
        li::before {
            content: counter(myCounter) ".";
            margin-right: 8px; /* 숫자와 텍스트 사이 간격 조절 */
        }
        
        ol li {
            counter-increment: myCounter;
        }
    </style>
    <ol>
        <li>첫 번째</li>
        <li>두 번째</li>
        <li>세 번째</li>
      </ol>      
</body>
</html>