CSS ์ง€์‹์€ ๋‹ค๋‹ค์ต์„ ์ด๋‹ค

Published at 2024. 5. 20.

8 min read

#CSS

Table of Contents

CSS ๊ณต๋ถ€์˜ ์–ด๋ ค์›€

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด CSS๋ฅผ ๋„๋Œ€์ฒด ์–ด๋””๊นŒ์ง€ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š”๊ฑด์ง€ ๋„ํ†ต ๋ชจ๋ฅด๊ฒ ๋Š” ์ˆœ๊ฐ„์ด ์˜จ๋‹ค.

๊ฐ์žก๊ณ  ๊ณต๋ถ€ํ•œ๋‹ต์‹œ๊ณ  ์ฑ…์„ ์กฐ๊ธˆ ๊ฒ€์ƒ‰ํ•˜๋‹ค๋ณด๋ฉด 1100 ํŽ˜์ด์ง€์— ์ด๋ฅด๋Š” ๋ฌด์‹œ๋ฌด์‹œํ•œ ์ฑ…์— ์••๋„๋‹นํ•ด์„œ ๊ณต๋ถ€ํ•  ์—„๋‘๊ฐ€ ์•ˆ๋‚˜๊ธฐ๋„ ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๊ตฌ๊ธ€๋ง์„ ํ•ด์„œ ๋‹ค์–‘ํ•œ article ์„ ํ†ตํ•ด ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ค๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์ด๊ณ  ๋‚˜์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ธ์ง€ ํŒ๋‹จ์ด ์ž˜ ๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ฒฐ๊ตญ ๊ทธ๋•Œ ๊ทธ๋•Œ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ณต๋ถ€๋ฅผ ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ํŒŒํŽธํ™”๋œ ์ง€์‹์„ ์–ป๊ฒŒ ๋œ๋‹ค.

์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ๊ณต๋ถ€๋ฅผ ํ•ด ๋‚˜๊ฐ€๋Š”๊ฒƒ๋„ ๋‚˜์˜์ง€๋Š” ์•Š์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์–ด์ฉŒ๋ฉด ์ œ์ผ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•˜๋‹ค.
์™œ๋ƒํ•˜๋ฉด ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๋Š๋ผ ์‹œ๊ฐ„์„ ์Ÿ์ง€ ์•Š์•„๋„ ๋˜๋‹ˆ๊นŒ.

ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ์‹œ์•ผ๋ฅผ ๋„“ํ˜€์„œ ๋ฐ”๋ผ๋ณด๋ฉด ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ CSS ์ง€์‹์„ ์Œ“์•„๋‚˜๊ฐ€๋Š” ๊ฒƒ์—๋Š” ๋ช…ํ™•ํ•œ ํ•œ๊ณ„์ ์ด 2๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค.
๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ทธ๋Ÿฌํ•œ ํ•œ๊ณ„์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํŒŒํŽธํ™”๋œ ์ง€์‹ ์Šต๋“์œผ๋กœ ์ธํ•ด CSS ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋‹จ๋‹จํ•˜๊ฒŒ ์Œ“์ง€ ๋ชปํ•˜๊ฒŒ ๋  ์œ„ํ—˜์„ฑ์ด ์žˆ๋‹ค.
  2. ๋Š˜ ์‚ฌ์šฉํ•˜๋˜ CSS ์†์„ฑ๋งŒ ๋ชธ์— ์ต์–ด์„œ ์ƒˆ๋กœ์šด ์‚ฌ๊ณ ๋ฅผ ํ•˜๊ธฐ๊ฐ€ ๊ท€์ฐฎ์•„ ์ง„๋‹ค. ์ด๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” CSS ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๋‚ฎ์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๊ฐ ํ•ญ๋ชฉ์— ๊ด€ํ•ด ์กฐ๊ธˆ ๋” ์ƒ์ˆ ํ•ด๋ณด๊ฒ ๋‹ค.

์šฐ์„  1๋ฒˆ.

๋‚˜๋Š” (๊ฑฐ์˜)ํ•ญ์ƒ task ์— ์น˜์ด๋Š” ์‹ค๋ฌด์ž์ด๊ธฐ์— CSS ๊ด€๋ จํ•˜์—ฌ ๋ฆฌ์„œ์น˜๋ฅผ ํ•  ๋•Œ์—๋Š” ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ cherry-picking ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๋ณด๋ฉด MDN์— ์จ ์žˆ๋Š” ์žฅํ™ฉํ•œ spec ๊ด€๋ จ ๋‚ด์šฉ์€ ์ž์„ธํžˆ ์ฝ์–ด๋ณด์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ CSS ์ง€์‹์„ ์Šต๋“ํ•ด ๋‚˜๊ฐ€๊ฒŒ ๋˜๋ฉด, ๊ฒฐ๊ตญ ํ•ด๋‹น ์ง€์‹์„ ์˜จ์ „ํžˆ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋ฐ˜์ชฝ์งœ๋ฆฌ ์ง€์‹์ด ๋˜๋Š” ์…ˆ์ด๋‹ค.

๊ฒฐ๊ตญ ๋ฐ˜์ชฝ์งœ๋ฆฌ CSS ์ง€์‹๋“ค์ด ์ฒด๊ณ„์—†์ด ๋ชจ์—ฌ์„œ ํ’ˆ์งˆ์ด ๋–จ์–ด์ง€๋Š” CSS ์ฝ”๋“œ๋ฅผ ์–‘์‚ฐํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ meme ์—์„œ์ฒ˜๋Ÿผ ์ œ๋Œ€๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ๊นŒ์ง€ ๋์—†๋Š” CSS ๋•œ์งˆ์„ ํ•˜๊ฒŒ ๋˜๊ธฐ๋„ํ•˜๊ณ ..

example code

๋‹ค์Œ์œผ๋กœ 2๋ฒˆ.

์ธ๊ฐ„์€ ํŒจํ„ด์„ ์ธ์‹ํ•˜๊ณ  ํ˜•์„ฑํ•˜๋Š”๋ฐ์— ๋Šฅํ•œ ์ƒ๋ฌผ์ด๊ธฐ์— ๋ณธ์ธ์—๊ฒŒ ์ต์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณธ๋Šฅ(?)์ด ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” CSS ์†์„ฑ๋งŒ ๊ฐ€์ง€๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ํŽธํ–ฅ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ญ, ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์ด ๊ผญ ๋‹ค์ฑ„๋กœ์›Œ์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ˆ ์ด ๋ถ€๋ถ„์€ ๋ณ„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ง„์งœ ๋ฌธ์ œ๋Š”, CSS๋ฅผ ์ž˜ ๋ชจ๋ฅด๋ฉด ๋•Œ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด ์ƒ๊ฐ ์™ธ๋กœ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

๋ฌด์Šจ ์ด์•ผ๊ธฐ์ผ๊นŒ?

CSS ์ง€์‹์„ ๋งŽ์ด ์•„๋Š”๊ฑด ์ •๋ง ๋„์›€์ด ๋˜๋‚˜

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

div.content ์˜ ์ž์‹ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ํŠน์ • background-color ๋ฅผ ์ ์šฉํ•˜๊ณ ,
div.content ์˜ ์ž์‹ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด div.wrapper ์š”์†Œ๋ฅผ ์ˆจ๊น€์ฒ˜๋ฆฌํ•˜๋ผ.

์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ด ๋ฌธ์ œ์— ์ ‘๊ทผํ•  ๊ฒƒ์ธ๊ฐ€?

์ž ์‹œ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž.

โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ
โ€ฆ

JS ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

class ๊ฐ€ content ์ธ div element ๋ฅผ ์–ป์–ด์„œ, child node ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์ฒดํฌํ•œ ํ›„ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ inline style ์„ ์ ์šฉํ•˜๋“  ํ•ด์„œ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค!

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋งˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ƒˆ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

/** JS solution */
const wrapperDiv = document.querySelector('.wrapper')
const contentDiv = wrapperDiv.querySelector('.content')

if (contentDiv.childNodes.length > 0) {
	// text node, element ๋ชจ๋‘ ํฌํ•จํ•˜์—ฌ ์ž์‹์ด ํ•œ ๊ฐœ ์ด์ƒ์ผ ๋•Œ,
	wrapperDiv.style.backgroundColor = 'tomato'
} else {
	// ์ž์‹์ด ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ
	wrapperDiv.style.display = 'none'
}

์ฝ”๋“œ๋„ ๊น”๋”ํ•œ ๊ฒƒ ๊ฐ™๊ณ  ์ด ์ •๋„๋ฉด ์ž˜ ์ง ๋“ฏ ์‹ถ๋‹ค!

ํ•˜์ง€๋งŒ, ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? JS๋ฅผ ์•„์˜ˆ ์•ˆ์“ฐ๊ณ  ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

์žˆ๋‹ค.

๋‹ค์Œ CSS ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

/* :has(), :not(), :empty ์˜ ์กฐํ•ฉ์œผ๋กœ ํ•ด๊ฒฐ */
.wrapper:has(.content:not(:empty)) {
	background-color: tomato;
}

.wrapper:has(.content:empty) {
	display: none;
}

๋ญ”๊ฐ€ JS๋กœ inline style ์„ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ํ•œ๊ฒฐ ๋‚˜์•„์ง„ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ ๋‹ค!

์˜ˆ์‹œ๋กœ ๋“  ๋ฌธ์ œ(์‚ฌ์‹ค ๋ฌธ์ œ๋ฅผ ์œ„ํ•œ ๋ฌธ์ œ์ด๊ธด ํ•˜์ง€๋งŒ)์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•œ ์ƒํ™ฉ์€ ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋‚˜์˜ค์ง€๋Š” ์•Š์ง€๋งŒ, ์ด์•ผ๊ธฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋Š” ๋ช…ํ™•ํžˆ ์ „๋‹ฌ์ด ๋˜์—ˆ์„๊ฑฐ๋ผ ๋ฏฟ๋Š”๋‹ค.

โ€œ์•„๋Š” ๋งŒํผ ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.โ€

๊ฒฐ๋ก 

CSS๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์†์„ฑ, ๋ชจ๋“  spec ์„ ์ „๋ถ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๋‹ค. ๊ทธ๋ž˜์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”์ง€๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

ํ•˜์ง€๋งŒ ํ•˜๋‚˜ ํ™•์‹คํ•œ ๊ฒƒ์€ CSS ์†์„ฑ์„ ๋งŽ์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‹ค๋ฌด์— ๋„์›€์ด ๋  ๋•Œ๊ฐ€ ๋”๋Ÿฌ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋ฅด๊ณ  ์žˆ์„ ๋•Œ์™€ ์•Œ๊ณ  ์žˆ์„ ๋•Œ์˜ ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๊ฝค๋‚˜ ์ฐจ์ด๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ํŠนํžˆ๋‚˜ ์‹œ๊ฐ์ ์œผ๋กœ ๋นก์„ผ ํ™”๋ฉด(transition, animation ๋“ฑ์˜ ๊ฐ์ข… visual effect ๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ„ ํ™”๋ฉด) ์ž‘์—…์„ ํ•  ๋•Œ์— ๊ทธ๋ ‡๋‹ค.

๊ทธ๋ฆฌ๊ณ  CSS ๊ฐœ๋… ํ•˜๋‚˜๋ฅผ ๊ณต๋ถ€ํ•˜๋”๋ผ๋„ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฉฐ, ํ•ด๋‹น ๊ฐœ๋…์„ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ์จ๋จน์„ ์ˆ˜ ์žˆ์„์ง€ ์ž๊พธ ๋จธ๋ฆฟ์†์œผ๋กœ ๊ทธ๋ ค๋ณด๋ฉฐ ํ•™์Šต์„ ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ์งˆ๋ฌธ ํ•˜๋‚˜๊ฐ€ ๋‚จ๋Š”๋‹ค.

โ€œCSS์— ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„ ํˆฌ์—ฌ๋ฅผ ํ•  ๊ฒƒ์ธ๊ฐ€?โ€

์ด๊ฑด ์‚ฌ๋žŒ๋งˆ๋‹ค ๊ธฐ์ค€์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ง€๋งŒ, CSS๋ฅผ hardํ•˜๊ฒŒ ์“ฐ์ง€ ์•Š๋Š” ๋ฌธ์ œ๋“ค์„ ํ‘ธ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ „์ฒด ๊ณต๋ถ€ ์‹œ๊ฐ„ ์ค‘ 10~20% ์ •๋„๋ฉด ์ถฉ๋ถ„ํ•  ๋“ฏ ์‹ถ๊ณ  CSS๋ฅผ hardํ•˜๊ฒŒ ์“ฐ๋Š” ๋ฌธ์ œ๋“ค์„ ํ‘ธ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๊ทธ ๋น„์œจ์„ 50% ์ด์ƒ์œผ๋กœ ์˜ฌ๋ ค์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ํ•œ๋‹ค. ๋” ๋†’์•„์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ ?

Slow But Steady ยฉ 2024