CSS ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ

๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์— ๊ฐ•ํ•˜๊ณ  ์•ˆ์ •์ ์ธ CSS ๊ตฌ์กฐ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ฒ•

๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” CSS ์„ค๊ณ„ ์‹ค์ „๊ฐ€์ด๋“œ์—์„œ ์†Œ๊ฐœํ•˜๋Š” ์„ค๊ณ„์˜ ํ•ต์‹ฌ์„ ์•Œ์•„๋ณด์ž.

CSS์˜ ์—ฌ๋Ÿฌ ์„ค๊ณ„ ๊ธฐ๋ฒ•๋“ค๋„ ๊ฒฐ๊ตญ์—๋Š” ๋‹ค์Œ ์—ฌ๋Ÿ ๊ฐ€์ง€ ๋ฆฌ์ŠคํŠธ์— ์†ํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ ํ•ต์‹ฌ์„ ๊ด€ํ†ตํ•˜๋Š” ํฌ์ธํŠธ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1. ํŠน์„ฑ์— ๋”ฐ๋ฅธ CSS ๋ถ„๋ฅ˜
2. ๋А์Šจํ•œ ์Šคํƒ€์ผ์˜ ๊ฒฐํ•ฉ
3. ์ ๋‹นํ•œ ์˜ํ–ฅ ๋ฒ”์œ„
4. ํŠน์ • ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์˜์กด๋„
5. ์ ์ ˆํ•œ ๋ช…์‹œ๋„(specificity)
6. ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ์œ ์ถ” ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„
7. ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ์˜ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„
8. ํ™•์žฅ ์šฉ์ด์„ฑ

1. ํŠน์„ฑ์— ๋”ฐ๋ฅธ CSS ๋ถ„๋ฅ˜

์ฒซ ๋ฒˆ์งธ๋Š” CSS ์—ญํ• ์ด๋‚˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฒ ์ด์Šค ๊ทธ๋ฃน : ์‚ฌ์ดํŠธ์—์„œ ๋ฒ ์ด์Šค๊ฐ€ ๋˜๊ฑฐ๋‚˜ ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ์‚ฌํ•ญ ๋“ฑ
๋ ˆ์ด์•„์›ƒ ๊ทธ๋ฃน : ํ—ค๋”(header), ํ‘ธํ„ฐ(footer), ์ฝ˜ํ…์ธ (content) ์˜์—ญ ๋“ฑ
๋ชจ๋“ˆ ๊ทธ๋ฃน : ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ ๋“ฑ

๋ชจ๋“ˆ ์ž์ฒด์—๋Š” ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ชจ๋“ˆ์€ ์ž์‹ ์˜ ๋ ˆ์ด์•„์›ƒ์—๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๋ชจ๋“ˆ ์ž์ฒด์˜ ์—ญํ•  ๋ฐ ์ž๋…€ ์š”์†Œ์˜ ์Šคํƒ€์ผ๋ง์—๋งŒ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด๋ž€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

-position, z-index, top/right/bottom/left, float, width, margin

/* ๋ฒ ์ด์Šค */
body {
  font-family: 'Noto Sans';
}

/* ๋ ˆ์ด์•„์›ƒ */
layout_content {
  width: 1000px;
  padding: 10px;
  margin: 0 auto;
}

/* ๋ชจ๋“ˆ */
.bl_media {
  display: flex;
  justify-items: center;
  align-items: center;
}

.bl_media_title {
  margin: 5px;
  font-weight: bold;
}

2. ๋А์Šจํ•œ ์Šคํƒ€์ผ์˜ ๊ฒฐํ•ฉ

์ •ํ™•ํžˆ๋Š” HTML๊ณผ ์Šคํƒ€์ผ๋ง์˜ ๋А์Šจํ•œ ๊ฒฐํ•ฉ์ด๋‹ค. ๋А์Šจํ•œ ๊ฒฐํ•ฉ์ด๋ž€ ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์š”์†Œํ˜• ์…€๋ ‰ํ„ฐ๋ฅผ ํ”ผํ•˜๊ณ  ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

p{}, div{}, h1{}๊ณผ ๊ฐ™์ด ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ์š”์†Œํ˜• ์…€๋ ‰ํ„ฐ๋Š” ์š”์†Œ์˜ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํƒ€์ผ์ด ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฏ€๋กœ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

3. ์ ๋‹นํ•œ ์˜ํ–ฅ ๋ฒ”์œ„

์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๊ฐ€๋Šฅํ•œ ์ข๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ๋„“์€ CSS์˜ ์Šคํƒ€์ผ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.

์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ฑ„ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋‹ค๋ณด๋ฉด ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ๋ฒ”์œ„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ํฌํ•จ์‹œํ‚ค๊ฑฐ๋‚˜ ์†์ž์™€ ์ž๋…€ ์…€๋ ‰ํ„ฐ์˜ ์‚ฌ์šฉ๋„ ํ•จ๊ป˜ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

4. ํŠน์ • ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์˜์กด๋„

์ปจํ…์ŠคํŠธ๋ž€ ์œ„์น˜ ๋˜๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ณ€ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ ๋ชฉ์ ์ด ๋ช…ํ™•ํ•˜๋‹ค๋ฉด ๋ฌธ์ œ์—†์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์…€๋ ‰ํ„ฐ๋ฅผ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ๊ตฌ์ฒดํ™”ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค.

/* id์ธ main์„ ์ง€์ •ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ .title_top ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด ์˜์กด๋„๊ฐ€ ๋†’์•„์ง. -> ๋ถˆํ•„์š”ํ•œ #main ์ œ๊ฑฐ */
#main .title_top{
  display:flex;
  align-items: center;
  color: green;
}

5. ์ ์ ˆํ•œ ๋ช…์‹œ๋„(specificy)

์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ช…์‹œ๋„์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ช…์‹œ๋„๊ฐ€ ๋†’์€ CSS์˜ ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

– ์…€๋ ‰ํ„ฐ ์˜ˆ์ธก์ด ์–ด๋ ค์›€
– ๋‹ค๋ฅธ ์š”์†Œ(๋ถ€๋ชจ ์š”์†Œ ๋“ฑ)์— ๋Œ€ํ•œ ์˜์กด๋„ ์ƒ์Šน
– ๋ฎ์–ด์“ฐ๊ธฐ์˜ ์–ด๋ ค์›€
– ์œ ์ง€ ๋ณด์ˆ˜์˜ ์–ด๋ ค์›€

๋‹น์—ฐํžˆ !important๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด๋ฉฐ, ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. id ์…€๋ ‰ํ„ฐ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋งค์šฐ ๋†’์œผ๋ฉฐ ํ•œ ํŽ˜์ด์ง€ ์•ˆ์—์„œ ๋™์ผํ•œ ๊ฐ’์€ ํ•œ๋ฒˆ ๋ฐ–์— ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ œ์•ฝ๋„ ์žˆ์œผ๋ฏ€๋กœ id๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์€ ๋งŽ์ง€ ์•Š๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋’ค์„ž์ด์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

6. ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ์œ ์ถ” ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„

๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ชจ๋“ˆ์ด๋‚˜ ํด๋ž˜์Šค๋„ ๋Š˜์–ด๋‚˜๋ฏ€๋กœ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์ˆ˜์ •์ด ์–ด๋–ค ๋ฒ”์œ„๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€๋ฅผ ์ด๋ฆ„์—์„œ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

HTML์—์„œ ์ •์˜๋œ ์š”์†Œ์˜ ํด๋ž˜์Šค ๋„ค์ž„๋งŒ ๋ณด๊ณ ๋„ CSS์˜ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

ํด๋ž˜์Šค ๋„ค์ž„์œผ๋กœ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์‰ฝ๊ฒŒ ์œ ์ถ”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋…€ ์š”์†Œ์— ๋ฃจํŠธ ์š”์†Œ์˜ ํด๋ž˜์Šค ๋„ค์ž„์„ ํฌํ•จํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

7. ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ์˜ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„

์˜ํ–ฅ ๋ฒ”์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ๋„ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋„ค์ž„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

– title1, title2, title3
– main-title, nav-title, sub-title

๋‘ ํ•ญ๋ชฉ ์ค‘ ํ˜•ํƒœ๋‚˜ ๊ธฐ๋Šฅ, ์—ญํ• ์˜ ์œ ์ถ”๊ฐ€ ์‰ฌ์šด ์ชฝ์ด ์–ด๋””์ธ์ง€๋Š” ๋ถ„๋ช…ํ•˜๋‹ค. ๊ฐ ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ์ด๋‚˜ ์—ญํ• ์— ๋งž์ถฐ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ํŠนํžˆ ์ž‘์€ ๊ทœ๋ชจ์˜ ์ฝ”๋“œ๋ผ๋ฉด title1, title2์™€ ๊ฐ™์ด ๋„ค์ž„์„ ๋Œ€์ถฉ ์ง€์ •ํ•˜๊ธฐ ์‰ฝ๋‹ค. ํ•˜์ง€๋งŒ ๊ทœ๋ชจ๋ž€ ์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ปค์งˆ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ํ•ญ์ƒ ์Šต๊ด€์ ์œผ๋กœ ์ด๋ฆ„์—์„œ ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ตฌ์ฒด์„ฑ๊ณผ ๋ฒ”์šฉ์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋„๋ก ํ•˜๋Š” ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.

8. ํ™•์žฅ ์šฉ์ด์„ฑ

ํ™•์žฅ์„ฑ์ด๋ž€ ๊ฒฐ๊ตญ ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๋‚˜ ์œ ์ง€์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ํ•ญ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘์–ด์•ผ ํ•œ๋‹ค.

ํ™•์žฅ์ด ์‰ฝ๋„๋ก ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ํด๋ž˜์Šค์—๋Š” ๊ธฐ๋Šฅ, ์—ญํ• ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ƒ์„ธ๋„์™€ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋„๋ก ํ•œ๋‹ค.

ํ™•์žฅ์ด ์‰ฌ์šด ํด๋ž˜์Šค๋ž€ ๋ฉ€ํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—๋Š” ๋ณดํŽธ์ ์ธ ์†์„ฑ, ์ถ”๊ฐ€ ํด๋ž˜์Šค์—๋Š” ํŠน์ • ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋กœ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด HTML์€ ๋ณต์žกํ•ด์ง€์ง€๋งŒ CSS๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ด์ง€๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ ํด๋ž˜์Šค์˜ ์ด์ ์€ ๋ถˆ๊ทœ์น™ํ•œ ์ƒํ™ฉ์—์„œ๋„ ํด๋ž˜์Šค ํ•˜๋‚˜๋งŒ์œผ๋กœ ์›ํ•˜๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๊ฒฐํ•จ์ด๋‹ค.

๊ฒฐ๊ตญ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ๋ณ„๊ฐœ์˜ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ ๋‹ค ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ž‘์€ ์ˆ˜์ • ํ•˜๋‚˜๊ฐ€ ํฐ ๋‚˜๋น„ํšจ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

๋งค๋ฒˆ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฒดํฌํ•ด๊ฐ€๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ž‘์„ฑ ๋ฐฉ์‹์ด ๊ณ ๋ฏผ๋˜๊ฑฐ๋‚˜ ์ž์œจ์„ฑ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด์„œ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค๋„ ๋” ๊ฒฌ๊ณ ํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ  : ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” CSS ์„ค๊ณ„ ์‹ค์ „๊ฐ€์ด๋“œ(2021, ์ œ์ดํŽ)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, class๋ฅผ ๋ฌธ๋ฒ•์  ์„คํƒ•(syntactic sugar)์ด๋ผ ๋ถ€๋ฅด๋Š” ์ด์œ 

function์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” class์˜ ๋™์ž‘ ๋ฐฉ์‹

‘๋ฌธ๋ฒ•์  ์„คํƒ•’์€ ํ†ต์šฉ๋˜๋Š” ๋‹จ์–ด์ด์ง€๋งŒ ์–ด๊ฐ์ด ์ด์ƒํ•œ ๊ฑด ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค. ์˜์—ญํ•˜์—ฌ ‘ํŽธ๋ฆฌํ•œ ๊ตฌ๋ฌธ ์šฉ๋ฒ•’ ์ •๋„๊ฐ€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค.

์œ„ํ‚ค์—์„œ syntactic sugar์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

In computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express.
์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ถ„์•ผ์—์„œ ‘ํŽธ๋ฆฌํ•œ ๊ตฌ๋ฌธ ์šฉ๋ฒ•’์ด๋ž€ ์ฝ๊ธฐ ์‰ฝ๊ณ  ํ‘œํ˜„ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๊ตฌ์„ฑ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋‚ด์˜ ๊ตฌ๋ฌธ์ด๋‹ค.

์ฆ‰, ๋‹ฌ์ฝคํ•œ ์ดˆ์ฝœ๋ฆฟ์ฒ˜๋Ÿผ ์†์ด ์ž์ฃผ ๊ฐ€๋Š” ๊ตฌ๋ฌธ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ํƒœ์–ด๋‚˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ES ๋ฒ„์ „์œผ๋กœ ๋Œ€ํ‘œ๋˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๊ธฐ์กด์˜ ๋ฌธ๋ฒ•์œผ๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ์ด ๋งŽ๋‹ค.

class ๋˜ํ•œ ๊ธฐ์กด์˜ OOP์—์„œ ์ฐจ์šฉํ•œ ๊ฐœ๋…์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค๋ฅด์ง€๋งŒ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ๋‘ ์ฝ”๋“œ์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ๋™์ผํ•˜๋‹ค.

function์œผ๋กœ ์„ ์–ธ๋œ ๋ถ€๋ถ„์ด ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹์ด๋ฉฐ class๊ฐ€ ์„ ์–ธ๋˜๋ฉด ์ด function๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ function๊ณผ class ์ค‘ ์–ด๋–ค ๊ฒƒ์— ๋” ์„ ๋œป ์†์ด ๊ฐ€๋Š”์ง€๋ฅผ ๋ฌป๋Š”๋‹ค๋ฉด ์„คํƒ•์˜ ์˜๋ฏธ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function ์‚ฌ์šฉ

function createGame( user, point ) {
  this.user = user;
  this.point = point;
}

createGame.prototype.addPoint = function() { this.point++; };

const myGame = new createGame("Yoon", 0);

myGame.addPoint();

class ์‚ฌ์šฉ

class CreateGame {
  constructor (user, point) {
    this.user = user;
    this.point = point;
  }
  addPoint() { this.point++; }
}

const myGame = new CreateGame("Yoon", 0);
myGame.addPoint();

React์—์„œ iframe ์ „์ฒดํ™”๋ฉด ์ „ํ™˜ํ•˜๊ธฐ(์†์„ฑ ์ฒดํฌ ํฌํ•จ)

allowfullscreen ๊ทธ๋ฆฌ๊ณ  document.fullscreenEnabled

ํ™”๋ฉด ๋‚ด๋ถ€์— ์‚ฝ์ž…๋œ iframe์—์„œ ์ „์ฒด ํ™”๋ฉด ์„ค์ •, ํ•ด์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
๊ตฌํ˜„์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๋‹ค.

๋จผ์ € iframe ํƒœ๊ทธ์— allowfullscreen ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
allowfullscreen ์†์„ฑ์„ ๊ฐ–๋Š” iframe์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ „์ฒดํ™”๋ฉด ์„ค์ •, ํ•ด์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ESC๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<iframe src=”https://choonse.com” allowfullscreen />

์ „์ฒด ํ™”๋ฉด ์„ค์ • ๋ฉ”์„œ๋“œ document.documentElement.requestFullscreen()
์ „์ฒด ํ™”๋ฉด ํ•ด์ œ ๋ฉ”์„œ๋“œ document.exitFullscreen()

์ „์ฒดํ™”๋ฉด ์„ค์ •/ํ•ด์ œ ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜ํ™˜ํ˜•์€ Promise์ด๋‹ค.

๋งŒ์•ฝ allowfullscreen ์†์„ฑ์ด ์—†๋Š” iframe์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?disallowed by permissions policy ์—๋Ÿฌ๋กœ ์‚ฌ๋žŒ์„ ๋‹นํ™ฉ์‹œํ‚จ๋‹ค.

์ด ๋•Œ๋Š” allowfullscreen ์†์„ฑ์˜ ์กด์žฌ ์—ฌ๋ถ€(true)๋ฅผ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ํ•ด๋‹น ์†์„ฑ์€
document.fullscreenEnabled ์†์„ฑ์„ ์‚ฌ์šฉํ•ด true/false๋กœ ํ™•์ธํ•œ๋‹ค.

๋งŒ์•ฝ iframe์— allowfullscreen ์†์„ฑ์ด ์—†์„ ๋•Œ ์ „์ฒด ํ™”๋ฉด ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

document.fullscreenEnabled๋ฅผ ์ฒดํฌํ•ด์„œ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋ฉด ๋˜๋Š”๋ฐ document is not defined์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” useEffect ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋œ ์‹œ์ ์— document์— ์ ‘๊ทผํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ repaint, reflow์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

reflow์™€ repaint๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์š”์ธ ๋ถ„์„ํ•˜๊ธฐ

๋จผ์ € ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๊ณผ์ •์—์„œ reflow์™€ repaint์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(DOM + CSSOM) render tree > layout(reflow) > paint(repaint) > composite

์—ฌ๊ธฐ์„œ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ์ด ๊นŠ์€ reflow, repaint ๋‹จ๊ณ„์— ๊ด€ํ•ด ์•Œ์•„๋ณด์ž.

reflow

reflow(๋˜๋Š” layout)๋Š” render tree ์ƒ์„ฑ ํ›„ ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค. ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ์ตœ์ดˆ๋กœ ๋ฐœ์ƒํ•˜๊ณ  ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜ ๋ณ€๊ฒฝ, ์š”์†Œ์˜ ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ ๋“ฑ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค reflow๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•œ๋‹ค.

reflow๋Š” ์ž์‹๊ณผ ๋ถ€๋ชจ ๊ทธ๋ฆฌ๊ณ  ์š”์†Œ ์ž์‹ ์—๊ฒŒ๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ, ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๋Š” reflow ํ›„ ๊ฐ€์‹œ์ ์ธ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” paint ๋‹จ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

reflow๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
(https://www.geeksforgeeks.org/what-is-dom-reflow/).

Reflow ๋ฐœ์ƒ ์›์ธ

– DOM์— ์š”์†Œ ์‚ฝ์ž…, ์ œ๊ฑฐ, ์—…๋ฐ์ดํŠธ
– ํŽ˜์ด์ง€์—์„œ ์ˆ˜์ • ์ž‘์—… ๋ฐœ์ƒ(Ex. input ๋ฐ•์Šค ํ…์ŠคํŠธ ์ˆ˜์ •)
– DOM์˜ ์š”์†Œ ์ด๋™
– DOM์˜ ์š”์†Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ
– offsetHeight ๋˜๋Š” getComputedStyle()๋ฅผ ์‚ฌ์šฉํ•œ ์š”์†Œ ๊ณ„์‚ฐ
– CSS ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
– ์š”์†Œ์˜ ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ
– ์Šคํƒ€์ผ์‹œํŠธ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐ
– ์œˆ๋„์šฐ ๋ฆฌ์‚ฌ์ด์ง•
– ์›น ํŽ˜์ด์ง€ ์Šคํฌ๋กค
– ํฐํŠธ ๋ณ€๊ฒฝ
– CSS ์Šˆ๋„ ํด๋ž˜์Šค(์˜์‚ฌ ํด๋ž˜์Šค) ํ™œ์„ฑํ™”(Ex. :hover)
– ์š”์†Œ์— style ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์„ค์ •

reflow ๋‹จ๊ณ„์—์„œ ๋งŽ์€ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜๊ณ  repaint, composite ๋‹จ๊ณ„๋„ ์ด์–ด์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹, ์„ฑ๋Šฅ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ํƒ€ํ˜‘ ๋“ฑ์„ ํ†ตํ•ด reflow๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ reflow๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Reflow ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

– ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ณ„ ์Šคํƒ€์ผ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ
– ์š”์†Œ์— ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•˜๊ณ  DOM ํŠธ๋ฆฌ์—์„œ ์ตœ๋Œ€ํ•œ ํ•˜๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ
– ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— DOM์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๊ธฐ
– ์Šคํƒ€์ผ์„ ์œ„ํ•œ ์žฆ์€ ์—ฐ์‚ฐ ํ”ผํ•˜๊ธฐ
– ์• ๋‹ˆ๋ฉ”์ด์…˜์€ fixed ๋˜๋Š” absolute๋กœ ์ง€์ •ํ•˜๊ธฐ
– ๊ฐ€๋Šฅํ•œ ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ๋ณด๋‹ค ๋ธ”๋ก ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ
– ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ
– ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ ๋ณ€๊ฒฝํ•˜๊ธฐ
– ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ์„ fixed๋กœ ์ง€์ •ํ•˜๊ธฐ

REPAINT

repaint(๋˜๋Š” redraw)๋Š” ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹Œ, ์š”์†Œ์˜ ๊ฐ€์‹œ์ ์ธ ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐœ์ƒํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค. ์š”์†Œ์˜ visibility, background, outline ๋“ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค repaint๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ํ•ด๋‹น ์†์„ฑ์€ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ reflow๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

repaint๋Š” render tree๋ฅผ ๋ ˆ์ด์–ด๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, repaint ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ๋ ˆ์ด์–ด๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

Reflow์™€ Repaint๋Š” stacking context์™€๋„ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ, stacking context๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ 3์ฐจ์›์ธ z์ถ•์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋กœ ๋ฌถ์ด๊ฒŒ ๋˜๋ฉด ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌถ์ธ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์˜ ์š”์†Œ์—์„œ ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ ˆ์ด์–ด์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ชจ๋‘ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์š”์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋ฉด ํ•ด๋‹น ๋ ˆ์ด์–ด๋งŒ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด๋‹น ์š”์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์€ ๋‹ค์Œ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
stacking context ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ(MDN)

์กฐ๊ฑด ์ค‘ ‘opacity < 1’์ด ์žˆ๋Š”๋ฐ, opacity ๊ฐ’์ด 0~0.99์ธ ์ƒํ™ฉ์—์„œ๋งŒ ๋ ˆ์ด์–ด๊ฐ€ ๋ณ„๋„๋กœ ์ƒ์„ฑ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

opacity๊ฐ€ 1์ผ ๋•Œ๋Š” reflow๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” opacity:1์ธ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์š”์†Œ์™€ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋ฅผ ์ด๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Composite

์ƒํ™ฉ์— ๋”ฐ๋ผ Reflow, Repaint๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์œผ๋กœ transform, opacity ๋“ฑ์ด ์žˆ๋Š”๋ฐ ์ด ์†์„ฑ์€ ๋ Œ๋”๋ง์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ composite๋งŒ ์‹คํ–‰๋œ๋‹ค.

ํ•ด๋‹น ์†์„ฑ์€ CPU๊ฐ€ ์•„๋‹Œ GPU์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” graphic layer๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ composite ๋‹จ๊ณ„์—์„œ layer๋ฅผ ๋ณ‘ํ•ฉํ•œ๋‹ค.

GPU๋Š” CPU์— ๋น„ํ•ด ์—ฐ์‚ฐ์ด ๋น ๋ฅด๊ณ  ์ด๋ฏธ์ง€์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ณด์ • ๊ธฐ๋Šฅ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ์ง€๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ์— ์ข‹์€ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

GPU ์‚ฌ์šฉ ์กฐ๊ฑด

– 3D transforms ์‚ฌ์šฉ(translate3d, translateZ ๋“ฑ)
– <video>, <canvas>, <iframe> ์š”์†Œ ์‚ฌ์šฉ
– transform, opacity๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜
– position:fixed ์š”์†Œ
– will-change ์‚ฌ์šฉ
– filter ์‚ฌ์šฉ

GPU์˜ ์žฅ์ ์€ ๋น ๋ฅธ ์—ฐ์‚ฐ์ด์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•˜๋Š” ๋‹จ์ ๋„ ์žˆ์œผ๋ฏ€๋กœ ์ ์ •์„ ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ์พŒ์ ํ•œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 
Understanding Repaint and Reflow in Javascript
What is DOM reflow
GPU animation: Doing It Right
Stacking Context

Typescript ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…(Partial, Pick, Omit, Record, Readonly)

๊ณตํ†ต ํƒ€์ž… ๋ณ€ํ™˜์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…(Utility Types)์€ type, interface๋ฅผ ์ž…๋ง›์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋งค์šฐ ๋งŽ๋‹ค(ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ณต์‹ ํŽ˜์ด์ง€).

์ด ์ค‘ ์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ์žฆ์€ Partial, Pick, Omit, Record, Readonly์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

1. Partial

partial์€ ‘๋ถ€๋ถ„์ ์ธ’์ด๋ผ๋Š” ๋œป์œผ๋กœ, ์ •์˜๋œ ํƒ€์ž…์˜ ์†์„ฑ์„ ๋ชจ๋‘ ์˜ต์…”๋„๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ถ„์ ์œผ๋กœ ์›ํ•˜๋Š” ์†์„ฑ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ์„  Partial์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

type Partial<T> = {
  [P in keyof T]?: T[P];
};

Partial<Type>์˜ ๋ฐฉ์‹์„ ํ†ตํ•ด ์†์„ฑ์„ ์˜ต์…”๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 
interface Hardware{
    cpu: string;
    gpu: string;
    memory: number;
    storage: number;
    accessary: string;
}

const selectOptions = (default: Hardware, selected: Partial<Hardware>) => {
    setOptions({...default, ...selected});
};

const defaultOption = {
    cpu: "M1";
    gpu: "10-core";
    memory: 16;
    storage: 512;
    accessary: "Touch ID";
}

const selectedOption = {
    cpu: "M2";
    memory: "32";
    storage: "1024";
}

์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์„ ์˜ต์…”๋„๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Pick

pick์€ ‘๋ฝ‘๋‹ค’๋Š” ๋œป์œผ๋กœ, ์ •์˜๋œ ํƒ€์ž…์—์„œ ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Pick์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

Pick<Type, Keys>์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉํ•  ์†์„ฑ์„ ๋ฌธ์ž์—ด์ด๋‚˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ Keys์— ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น ์†์„ฑ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

interface Exercise{
    title: string;
    type: string;
    time: number;
    complete: boolean;
}

type BriefExercise = Pick<Exercise, "title" | "complete">;

const today = {
    title: "jogging";
    complete: true;
}

Partial์€ ๋ชจ๋“  ์†์„ฑ์„ ์˜ต์…”๋„๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ Pick์€ ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ํ•„์š”ํ•œ ํƒ€์ž…๋งŒ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

3. Omit

omit์€ ‘์ƒ๋žตํ•˜๋‹ค’๋ผ๋Š” ๋œป์œผ๋กœ, ์ •์˜๋œ ํƒ€์ž…์—์„œ ์ƒ๋žตํ•  ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Omit์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

type Omit<T, K extends keyof any> = {
  [P in Exclude<keyof T, K>]: T[P]
}

Omit<Type, Keys>์˜ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, Pick๊ณผ ๋ฐ˜๋Œ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํƒ€์ž…์„ ์ง€์ •ํ•˜์—ฌ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

interface Exercise{
    title: string;
    type: string;
    time: number;
    complete: boolean;
}

type BriefExercise = Omit<Exercise, "type" | "time">;

const today = {
    title: "jogging";
    complete: true;
}

Pick๊ณผ Omit์˜ ์šฉ๋„๋Š” ๊ฐ™์ง€๋งŒ ์ •์˜ ๋ฐฉ๋ฒ•์€ ์ƒ๋ฐ˜๋œ๋‹ค.

์ •์˜๋œ ํƒ€์ž…์—์„œ ์ƒ๋žตํ•˜๊ณ  ์‹ถ์€ ์†์„ฑ์ด ๋งŽ์„ ๋•Œ๋Š” Pick, ์ƒ๋žตํ•˜๊ณ  ์‹ถ์€ ์†์„ฑ์ด ์ ์„ ๋•Œ๋Š” Omit์„ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์ด๋‹ค.

4. Record

record๋Š” ‘๊ธฐ๋กํ•˜๋‹ค’๋Š” ๋œป์œผ๋กœ, key-value ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Record์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

type Record<K extends string, T> = {
  [P in K]: T;
};

Record<Keys, Type>์˜ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‘ ๊ฐœ์˜ ํƒ€์ž…์—์„œ ํ•œ ํƒ€์ž…์„ Keys, ํ•œ ํƒ€์ž…์„ Type์œผ๋กœ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

type MacBookType = "air13" | "air15" | "pro13" | "pro14" | "pro16";

interface Performance{
    cpu: string;
    memory: number;
    storage: number;
};

const OnTheMarket: Record<MacBookType, Performance> = {
    air13: { cpu:"M1", memory:8, storage: 256 };
    air15: { cpu:"M2", memory:16, storage: 512 };
    pro13: { cpu:"M2", memory:16, storage: 1024 };
    pro14: { cpu:"M2 pro", memory:32, storage: 1024 };
    pro16: { cpu:"M2 ultra", memory:96, storage: 2048 };
}

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‘ ํƒ€์ž…์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

5. Readonly

readonly๋Š” ‘์ฝ๊ธฐ ์ „์šฉ’์ด๋ฏ€๋กœ ํƒ€์ž…์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Readonly์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด readonly ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

interface LimitSize{
    size: number;
}

const myData: Readonly<LimitSize> = {
    size: 32;
}

myData.size = 64; // error

CSS์˜ em, rem, vh, vw, %์˜ ๋‹จ์œ„๋ฅผ ์•Œ์•„๋ณด์ž

๋ฐ˜์‘ํ˜•์„ ์œ„ํ•œ ๋‹จ์œ„์˜ ํ™œ์šฉ

CSS์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํฌ๊ธฐ ๋‹จ์œ„๊ฐ€ ํ”ฝ์…€(px)์ธ๋ฐ์š”.

1px์€ 0.00264cm๋กœ ํ™˜์‚ฐ๋˜๋Š” ๊ธธ์ด๋กœ, 300px์€ ์•ฝ 8cm๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

16px์€ 0.42cm์ธ๋ฐ์š”. ์ด 16px์ด ๋ฐ”๋กœ CSS์—์„œ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

font-size : 16px์€ ์„ธ๋กœ ๊ธธ์ด๊ฐ€ 16px(0.423cm)์ธ ํฐํŠธ ์‚ฌ์ด์ฆˆ๋ผ๋Š” ์˜๋ฏธ๋กœ, ์ถœํŒ๋ฌผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์ด์ฆˆ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด ๊ธฐ๋ณธ ์‚ฌ์ด์ฆˆ 16px์„ ๊ธฐ๋ฐ˜์œผ๋กœ em, rem์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

em

em์€ ๊ธฐ์ค€ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๋ฐฐ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ค€์€ font-size์ด๋ฉฐ ๊ฐ™์€ ์š”์†Œ์˜ ์‚ฌ์ด์ฆˆ์—์„œ ์‹œ์ž‘ํ•ด ๋ถ€๋ชจ๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ™์€ ์š”์†Œ์— font-size:16px์ด ์„ค์ •๋œ ๊ฒฝ์šฐ em์˜ ๊ธฐ์ค€์€ 16px์ด ๋ฉ๋‹ˆ๋‹ค.

.child-size{
    font-size : 16px;
    width : 2em;   // 2 * 16px = 32px;
}

์œ„ ์ฝ”๋“œ์—์„œ child-size ๋‚ด๋ถ€์— font-size๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์š”์†Œ์˜ width : 2em๋Š” 16์˜ 2๋ฐฐ์ธ 32px์ด ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ™์ด child-size ๋‚ด๋ถ€์— font-size๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๊ธฐ์ค€ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

.parent-size{
    font-size : 20px;
}
.child-size{
    width : 2em;   // 2 * 20px = 40px;
}

์ตœ์ƒ๋‹จ๊นŒ์ง€ ์ด๋™ํ•ด๋„ font-size๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์œ„์—์„œ ๋งํ•œ ๊ธฐ๋ณธ๊ฐ’์ธ 16px์„ ๊ธฐ์ค€์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

rem

rem์€ em๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ r์€ root๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์ƒ๋‹จ์ธ html์— ์ •์˜๋œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

html{
    font-size : 20px;
}
.child-size{
    font-size : 16px;
    width : 2rem;   // 2 * 20px = 40px;
}

์ตœ์ƒ๋‹จ์˜ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€ํ•˜๋ฏ€๋กœ 20px์ด ๊ธฐ์ค€์ด ๋˜์–ด 2rem์€ 40px๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

vw

Viewport Width๋Š” ์Šคํฌ๋กค์„ ํฌํ•จํ•œ ์œˆ๋„์šฐ์˜ ๋„ˆ๋น„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฐ˜์‘ํ˜•์„ ์œ„ํ•ด ์ƒ๋Œ€์  ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1vw๋Š” ๋ทฐํฌํŠธ ๋„ˆ๋น„์˜ 1%์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋„ˆ๋น„๊ฐ€ 1000px์ธ ๊ฒฝ์šฐ 1vw๋Š” 10px, 100vw๋Š” 1000px์ด ๋ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ์ด๋‚˜ ๋ชจ๋ฐ”์ผ ๋“ฑ์—์„œ ์ „์ฒด ๋น„์œจ์„ ๋งž์ถ”๊ณ  ์‹ถ์„ ๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด์„ ๊ฐ€๋กœ๋กœ ๊ฐ€๋“ ์ฑ„์šฐ๊ณ  ์‹ถ์„ ๋•Œ 100vw๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.layout{
    width : 100vw;
}

vh

Viewport Height๋Š” ์œˆ๋„์šฐ์˜ ๋†’์ด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ vw์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ทฐํฌํŠธ ๋†’์ด์˜ 1%๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ™”๋ฉด์„ ๊ฐ€๋“ ์ฑ„์šฐ๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

.layout{
    width : 100vw;
    height: 100vh;
}

%

%๋Š” ๋ถ€๋ชจ ์š”์†Œ์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

๋†’์ด๋ฅผ 100%๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ถ€๋ชจ์˜ ๋†’์ด์˜ 100%๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ถ€๋ชจ์˜ ๋†’์ด๊ฐ€ 100px์ธ ๊ฒฝ์šฐ ์ž์‹ ์š”์†Œ์—์„œ height : 100%๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋†’์ด๋Š” 50๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

width : 100%์ธ ๊ฒฝ์šฐ ์Šคํฌ๋กค๋ฐ”์˜ ๋„ˆ๋น„๋ฅผ ์ƒ๋žตํ•œ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

font-size : 100%์˜ ๊ฒฝ์šฐ ๋ถ€๋ชจ ์š”์†Œ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์€ 16px์ด ๋ฉ๋‹ˆ๋‹ค.

CSS selector ์šฐ์„ ์ˆœ์œ„, ๋ช…์‹œ๋„(specificity)

์š”์†Œ ์„ ํƒ์ž(Element Selector) ์ ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ

CSS์—์„œ๋Š” ์š”์†Œ์˜ ์„ ํƒ์ž์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚˜๋‰œ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ๊ฐ€์ค‘์น˜๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜์ง€๋งŒ ํ˜„์žฌ๋Š” ๊ฐ€์ค‘์น˜ ๊ณ„์‚ฐ ๋ฐฉ์‹์ด ๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ์ž์˜ ์ƒ๋Œ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด์—๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ class:10, id:100์œผ๋กœ, class 10๊ฐœ๊ฐ€ 1๊ฐœ์˜ id์™€ ๋™๋“ฑํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์กŒ์ง€๋งŒ ํ˜„์žฌ๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ ๋‹ฌ๋ผ์ ธ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” 256๊ฐœ์˜ class๊ฐ€ 1๊ฐœ์˜ id์™€ ๋™๋“ฑํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. (์ฐธ๊ณ :stackoverflow)

์„ ํƒ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค.

!important > inline style > id > class (pseud0) > element (pseudo)

๋”ฐ๋ผ์„œ ์„ ํƒ์ž๋ณ„๋กœ ์ƒ๋Œ€์ ์ธ ๊ฐ€์ค‘์น˜๋ฅผ ํŒ๋‹จํ•˜์—ฌ ๋†’์€ ์ˆœ์„œ์— ๋”ฐ๋ผ ์™ผ์ชฝ๋ถ€ํ„ฐ comma๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋†’์Œinline style , id , class (pseud0) , element (pseudo) <๋‚ฎ์Œ
Ex1) 0 , 1 , 2 , 1
Ex2) 0 , 0 , 200 , 10
๐Ÿ‘‰ Ex1์ด Ex2๋ณด๋‹ค ๊ฐ€์ค‘์น˜๊ฐ€ ๋†’์Œ

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด id, class ์„ ํƒ์ž๊ฐ€ ๋ชจ๋‘ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผid ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ๋‹ค.

.myMenuClass{
  color:green;
}

#myMenuId{
  color:red;
}

<h1 id="myMenuId" class="myMenuClass">This is it</h1>

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#myMenuId{
  color:red;
}

.myMenuClass{
  color:blue;  
}

h1#myMenuId{
  color:orange;  
}

<h1 id="myMenuId" class="myMenuClass">This is it!</h1>

์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด,

#myMenuId : 0,1,0,0 / .myMenuClass : 0,0,1,0 / h1#myMenuId : 0,1,0,1

๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ orange color๊ฐ€ ์ ์šฉ๋œ๋‹ค.

!important๋Š” ๋ชจ๋“  ๊ฐ€์ค‘์น˜๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ตœ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ์น˜ํŠธํ‚ค์™€ ๊ฐ™๋‹ค. !important๊ฐ€ ์š”์†Œ์— ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋’ค์— ์„ ์–ธ๋œ !important๊ฐ€ ์ ์šฉ๋œ๋‹ค.

ํ•˜์ง€๋งŒ !important์˜ ์‚ฌ์šฉ&๋‚จ์šฉ์€ ํ‰ํ™”๋กœ์šด ์ƒํƒœ๊ณ„๋ฅผ ์œ„ํ˜‘ํ•˜๋Š” ์กด์žฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ •์‹  ๊ฑด๊ฐ•๊ณผ ์ฝ”๋“œ ๊ตฌ์„ฑ์—๋„ ์ข‹๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์˜ˆ์™ธ ์‚ฌํ•ญ๋„ ์•Œ์•„๋ณด์ž.

์šฐ์„ ์ˆœ์œ„ ์—†์Œ: *,:where()
๊ฐ€์ค‘์น˜ ํฌํ•จํ•˜์ง€ ์•Š์Œ: >, ~, +
๊ฐ€์žฅ ๋†’์€ ๊ฐ€์ค‘์น˜ ํ•˜๋‚˜๋งŒ ์„ ํƒ: :is(), :not()
ex) :is(#menuId, .menuId, span) -> ๊ฐ€์ค‘์น˜ ๊ฐ€์žฅ ๋†’์€ #menuId๋งŒ ์นด์šดํŠธ

๋งฅ์—์„œ localhost ์ ‘์† ์‹œ dns_probe_finished_nxdomain ์—๋Ÿฌ ์ฒ˜๋ฆฌ

๋งฅ(Mac)์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • localhost ํ˜ธ์ŠคํŠธ ๋„๋ฉ”์ธ ์ˆ˜์ •ํ•˜๊ธฐ

localhost๋ฅผ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ๋กœ์ปฌ ์„œ๋ฒ„์— ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ local.page.com ๋“ฑ๊ณผ ๊ฐ™์ด ์ž„์˜๋กœ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์‚ฌ์ดํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” DNS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ localhost์˜ ์ฃผ์†Œ๋Š” 127.0.0.1์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ localhost๋ฅผ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ์—†์ง€๋งŒ localhost์˜ ์ฃผ์†Œ๋ช…์ด ๋ฐ”๋€๋‹ค๋ฉด ๋ณ„๋„์˜ ์„ค์ •์„ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งฅ์—์„œ ์„ค์ • ํŒŒ์ผ์€ ๋‹ค์Œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

/private/etc/hosts

์ด ํŒŒ์ผ์„ vi ์—๋””ํ„ฐ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(๊ด€๋ฆฌ์ž ๊ถŒํ•œ ํ•„์š”).

% sudo vi /private/etc/hosts

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ž„์˜์˜ ์ฃผ์†Œ๋ช…๊ณผ ์ด ์ฃผ์†Œ๋ช…์ด ์ฐพ์•„๊ฐˆ IP๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

i ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ํŽธ์ง‘์ด๊ฐ€๋Šฅํ•˜๋ฉฐ ์•ž์—๋Š” host ์ฃผ์†Œ 127.0.0.1, ๋’ค์—๋Š” ์‚ฌ์šฉํ•  ์ž„์˜์˜ ์ฃผ์†Œ๋ช…์„ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ํ›„ ์ €์žฅ์„ ์œ„ํ•ด ESC๋ฅผ ๋ˆ„๋ฅธ ๋’ค :๋ฅผ ์ž…๋ ฅ, ๋‹ค์‹œ ์ฝ˜์†”์— qw! ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ์น˜๋ฉด ์ €์žฅ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์™„๋ฃŒ ํ›„ ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  local.page.com์— ์ ‘์†ํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ์ ‘์†๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

rgba๋ฅผ ์‚ฌ์šฉํ•ด opacity์˜ ์ƒ์† ๋ฌธ์ œ ํ•ด๊ฒฐ(ํˆฌ๋ช…๋„ ์กฐ์ ˆ)

์ž์‹ ๋…ธ๋“œ์— ์ƒ์†๋˜๋Š” opacity์™€ ๋‹จ๋…์ ์ธ rgba

๋ถ€๋ชจ ๋…ธ๋“œ์— opacity ํšจ๊ณผ๋ฅผ ์ฃผ๋ฉด ์ž์‹ ๋…ธ๋“œ์—๋„ ์ƒ์†๋˜์–ด ํˆฌ๋ช… ํšจ๊ณผ๊ฐ€ ํ•จ๊ป˜ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ž๋™์œผ๋กœ ์ƒ์†์ด ๋˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์„ค์ •์œผ๋กœ ์ƒ‰์ƒ์„ ์ง€์ •ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
๋ฐฐ๊ฒฝ black
opacity:0.5
background:yellow
background:red

๋ณด๋‹ค์‹œํ”ผ yellow, red์— opacity๊ฐ€ ์ ์šฉ๋˜์–ด ์ƒ‰์ƒ์ด ํ๋ ค์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ƒ์† ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

๊ฐ„๋‹จํ•˜๊ฒŒ opacity ๋Œ€์‹  rgba๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํˆฌ๋ช…๋„๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ‰์ƒ์˜ ์ง€์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

rgba(R, G, B, opacity);

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ๋ฐ•์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ƒ‰์ƒ์ธ #9ADFFD์„ rgba ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

16์ง„์ˆ˜๋ฅผ 10์ง„์ˆ˜๋กœ ๋ณ€ํ˜•ํ•œ ๊ฐ’์ธ 9A=154, DF=223, Fd=253์„ ๊ฐ๊ฐ R, G, B ์œ„์น˜์— ๋„ฃ์–ด์ฃผ๊ณ  ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋Š” 0~1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

background : rgba(154, 223, 253, 0.5);

์ด์ œ ์ž์‹ ๋…ธ๋“œ๋Š” opacity๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ‰์ƒ์ด ์„ ๋ช…ํ•ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์€ ๋ฐฐ๊ฒฝ์„ ์‚ฌ์šฉํ•ด๋„ ์ž์‹ ๋…ธ๋“œ์— ์„ ๋ช…๋„๊ฐ€ ์‚ด์•„๋‚œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์ƒ์†๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<div class="div0">
    <div class="div1">
      modify
    </div>
    <div class="div2">
      delete
    </div>
</div>

.div0{
  height:100px;
  background : rgba(0, 0, 0, 0.5);
  display:flex;
  justify-content:center;
  align-items:center;
}

.div1{
  width:200px;
  height:50px;
  background-color:gold;
  display:flex;
  justify-content:center;
  align-items:center;
  color:white;
}

.div2{
  width:200px;
  height:50px;
  background-color:red;
  display:flex;
  justify-content:center;
  align-items:center;
  color:white;
}

์›น์Šคํ†ฐ(Webstorm)์—์„œ prettier ํ™œ์„ฑํ™”ํ•˜๊ธฐ

์›น์Šคํ†ฐ์—์„œ prettier๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

์›น์Šคํ†ฐ(webstorm)์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ prettier๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ npm ๋˜๋Š” yarn์„ ํ†ตํ•ด์„œ node_modules์— prettier๋ฅผ ์„ค์น˜ํ•ด์ฃผ๊ณ  prettier๊ด€๋ จ ์„ค์ •๋งŒ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

npm install --save-dev --save-exact prettier

์œ„์™€ ๊ฐ™์ด ์„ค์น˜ํ•ด์ค€ ๋’ค File -> Settings -> Languages & Frameworks -> JavaScript -> Prettier์— ๋“ค์–ด๊ฐ€์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

Prettier package์—๋Š” node_modules/prettier๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์•„๋ž˜ ์ฒดํฌ ๋ฐ•์Šค๋ฅผ ๋ชจ๋‘ ์ฒดํฌํ•ด์ฃผ๋ฉด ์ €์žฅ ์‹œ์—๋„ prettier๊ฐ€ ์ž‘๋™์ด ๋ฉ๋‹ˆ๋‹ค.

์ž‘๋™์ด ์•ˆ๋  ๋•Œ๋Š” ์›น์Šคํ†ฐ์„ ์žฌ์‹œ์ž‘.

prettier ์ž‘์—…์˜ ๋‹จ์ถ•ํ‚ค๋Š” alt+ctrl+shift+p ์ž…๋‹ˆ๋‹ค.