λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Stylesheet/CSS

[CSS3]CSS 가상 μš”μ†Œ μ„ νƒμž μ‚¬μš©λ²• ::before와 ::after μ™„λ²½ κ°€μ΄λ“œ

by YJ Dev 2024. 5. 21.
728x90
λ°˜μ‘ν˜•
SMALL

CSS 가상 μš”μ†Œ μ„ νƒμžλŠ” HTML μš”μ†Œμ— μΆ”κ°€ μ½˜ν…μΈ λ‚˜ μŠ€νƒ€μΌμ„ μ‚½μž…ν•˜μ—¬ λ””μžμΈμ„ μœ μ—°ν•˜κ²Œ ν•©λ‹ˆλ‹€. ::before와 ::afterλŠ” 특히 λ‹€μ–‘ν•œ μŠ€νƒ€μΌλ§μ— ν™œμš©λ©λ‹ˆλ‹€. 이 κ°€μ΄λ“œμ—μ„œλŠ” κΈ°λ³ΈλΆ€ν„° κ³ κΈ‰ ν™œμš©λ²•κΉŒμ§€ μƒμ„Ένžˆ λ‹€λ£Ήλ‹ˆλ‹€.

css 가상 μš”μ†Œ μ„ νƒμž

 

CSS 가상 μš”μ†Œ μ„ νƒμž κΈ°λ³Έ κ°œλ…πŸŒŒ

가상 μš”μ†Œ μ„ νƒμžλŠ” HTML λ¬Έμ„œμ— μ‹€μ œλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œλ₯Ό μƒμ„±ν•˜μ—¬ μŠ€νƒ€μΌμ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ::before와 ::afterλŠ” νŠΉμ • μš”μ†Œμ˜ μ•žμ΄λ‚˜ 뒀에 μ½˜ν…μΈ λ₯Ό μ‚½μž…ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 이 μ„ νƒμžμ˜ κΈ°λ³Έ 문법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

selector::before {
    content: "content";
    /* additional styles */
}

selector::after {
    content: "content";
    /* additional styles */
}

::before와 ::after의 차이점πŸš₯

  • ::before: μ„ νƒν•œ μš”μ†Œμ˜ λ‚΄μš© μ•žμ— μ‚½μž…λ©λ‹ˆλ‹€.
  • ::after: μ„ νƒν•œ μš”μ†Œμ˜ λ‚΄μš© 뒀에 μ‚½μž…λ©λ‹ˆλ‹€.

두 가상 μš”μ†ŒλŠ” λΉ„μŠ·ν•˜κ²Œ λ™μž‘ν•˜μ§€λ§Œ, μ½˜ν…μΈ κ°€ μ‚½μž…λ˜λŠ” μœ„μΉ˜κ°€ λ‹€λ¦…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒ μ½”λ“œλŠ” p μš”μ†Œμ˜ λ‚΄μš© μ•žκ³Ό 뒀에 ν…μŠ€νŠΈλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

<p>Hello, world!</p>

<style>
p::before {
    content: "Before: ";
    color: blue;
}

p::after {
    content: " :After";
    color: red;
}
</style>

μœ„μ˜ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ©λ‹ˆλ‹€.

Before: Hello, world! :After

::before와 ::after μ‚¬μš©λ²•πŸš•

κΈ°λ³Έ μ‚¬μš©λ²•

κ°€μž₯ 기본적인 μ‚¬μš©λ²•μ€ content 속성을 톡해 ν…μŠ€νŠΈλ₯Ό μ‚½μž…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, νŠΉμ • μš”μ†Œ μ•žμ— μ‹¬λ²Œμ„ μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>

<style>
li::before {
    content: "• ";
    color: green;
}
</style>

이 μ½”λ“œλŠ” 각 λͺ©λ‘ ν•­λͺ© μ•žμ— 녹색 점을 μΆ”κ°€ν•©λ‹ˆλ‹€.

μ½˜ν…μΈ  μ‚½μž… 방법

가상 μš”μ†ŒλŠ” ν…μŠ€νŠΈλΏλ§Œ μ•„λ‹ˆλΌ 이미지, 심볼 λ“± λ‹€μ–‘ν•œ μ½˜ν…μΈ λ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

h1::after {
    content: url('star.png');
    display: inline-block;
    margin-left: 10px;
}

μŠ€νƒ€μΌλ§ 방법

가상 μš”μ†ŒλŠ” 일반 μš”μ†Œμ²˜λŸΌ μŠ€νƒ€μΌλ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 색상, 크기, μœ„μΉ˜ 등을 자유둭게 μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€.

button::before {
    content: "β–Ά ";
    color: blue;
    font-size: 20px;
}

::before와 ::after μ˜ˆμ œπŸš‚

λ²„νŠΌμ— μ•„μ΄μ½˜ μΆ”κ°€ν•˜κΈ°

<button>Click Me</button>

<style>
button::before {
    content: "πŸ”";
    margin-right: 8px;
}
</style>

 

λ‹€μ–‘ν•œ μŠ€νƒ€μΌλ§ 예제

가상 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΉ΄λ“œ λ””μžμΈμ„ κΎΈλ―ΈλŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

<div class="card">
    <h2>Title</h2>
    <p>Description</p>
</div>

<style>
.card {
    position: relative;
    padding: 20px;
    border: 1px solid #ccc;
}

.card::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: url('pattern.png');
    opacity: 0.1;
}
</style>

κ³ κΈ‰ ν™œμš©λ²•

가상 μš”μ†Œμ— μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•˜μ—¬ 역동적인 λ””μžμΈμ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

button::after {
    content: "";
    display: block;
    width: 0;
    height: 2px;
    background: red;
    transition: width 0.3s;
}

button:hover::after {
    width: 100%;
}

λ°˜μ‘ν˜• λ””μžμΈμ—μ„œμ˜ ν™œμš©λ²•

λ°˜μ‘ν˜• λ””μžμΈμ—μ„œ 가상 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ ν™”λ©΄ 크기에 λŒ€μ‘ν•˜λŠ” μŠ€νƒ€μΌμ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@media (max-width: 600px) {
    .card::before {
        background: none;
    }
}

CSS λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ 동적 μŠ€νƒ€μΌλ§

CSS λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 가상 μš”μ†Œμ˜ μŠ€νƒ€μΌμ„ λ™μ μœΌλ‘œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

:root {
    --primary-color: blue;
}

button::before {
    content: "➑️ ";
    color: var(--primary-color);
}

자주 λ°œμƒν•˜λŠ” 문제 및 ν•΄κ²° λ°©λ²•πŸš€

가상 μš”μ†Œκ°€ μ μš©λ˜μ§€ μ•Šμ„ λ•Œ

가상 μš”μ†Œκ°€ μ μš©λ˜μ§€ μ•ŠλŠ” 경우, λΆ€λͺ¨ μš”μ†Œμ— position 속성을 μ„€μ •ν•΄ λ³΄μ„Έμš”.
μ—¬κΈ°μ„œ position 속성은 μš”μ†Œλ₯Ό λ¬Έμ„œμ˜ νŠΉμ • μœ„μΉ˜μ— λ°°μΉ˜ν•˜λŠ” 방법을 μ§€μ •ν•©λ‹ˆλ‹€. λ§Œμ•½ λΆ€λͺ¨ μš”μ†Œμ— position 속성이 μ§€μ •λ˜μ§€ μ•ŠμœΌλ©΄, 가상 μš”μ†Œκ°€ μ œλŒ€λ‘œ ν‘œμ‹œλ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, λΆ€λͺ¨ μš”μ†Œμ— position: relative;λ₯Ό μ„€μ •ν•˜λ©΄, κ·Έ μ•ˆμ— ν¬ν•¨λœ μžμ‹ μš”μ†Œλ“€μ€ ν•΄λ‹Ή λΆ€λͺ¨ μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ μœ„μΉ˜κ°€ κ²°μ •λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ 가상 μš”μ†Œλ„ λΆ€λͺ¨ μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ μ •ν™•ν•œ μœ„μΉ˜μ— ν‘œμ‹œλ  수 μžˆμŠ΅λ‹ˆλ‹€.
κ°„λ‹¨ν•˜κ²Œ 말해, position 속성을 λΆ€λͺ¨ μš”μ†Œμ— μ„€μ •ν•¨μœΌλ‘œμ¨, 가상 μš”μ†Œκ°€ λΆ€λͺ¨ μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ μ œλŒ€λ‘œ ν‘œμ‹œλ  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

.parent {
    position: relative;
}

λ ˆμ΄μ•„μ›ƒ 깨짐 문제 ν•΄κ²°

가상 μš”μ†Œκ°€ λ ˆμ΄μ•„μ›ƒμ„ 깨뜨릴 λ•ŒλŠ” display 속성을 μ‘°μ •ν•΄ λ³΄μ„Έμš”.
일반적으둜 가상 μš”μ†ŒλŠ” display: inline; 속성을 κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 가상 μš”μ†Œκ°€ ν…μŠ€νŠΈμ™€ 같이 ν–‰ 내에 μœ„μΉ˜ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ•Œλ•Œλ‘œ μ΄λŸ¬ν•œ κΈ°λ³Έ 섀정이 λ ˆμ΄μ•„μ›ƒμ„ 깨뜨릴 수 μžˆμŠ΅λ‹ˆλ‹€.
λ ˆμ΄μ•„μ›ƒμ΄ 깨질 λ•ŒλŠ”, 가상 μš”μ†Œμ˜ display 속성을 blockμ΄λ‚˜ inline-block λ“±μœΌλ‘œ λ³€κ²½ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 가상 μš”μ†Œκ°€ 블둝 μˆ˜μ€€ μš”μ†Œμ²˜λŸΌ λ™μž‘ν•˜κ²Œ λ§Œλ“€μ–΄ λ ˆμ΄μ•„μ›ƒμ΄ 깨지지 μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
κ°„λ‹¨νžˆ 말해, display 속성을 적절히 μ‘°μ •ν•˜μ—¬ 가상 μš”μ†Œκ°€ μ›ν•˜λŠ” λ ˆμ΄μ•„μ›ƒμ„ μœ μ§€ν•˜λ„λ‘ μ„€μ •ν•˜μ„Έμš”.

element::before {
    display: inline-block;
}

핡심 λ‚΄μš©πŸ‘€

::before ::after

728x90
λ°˜μ‘ν˜•