๐ŸŽจ Tailwind Advanced 1์žฅ: ์‹œ๊ฐ ํšจ๊ณผ ๋งˆ์Šคํ„ฐ โ€” ํ•„ํ„ฐ, Backdrop, ๊ทธ๋ผ๋””์–ธํŠธ

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

CSS filter, backdrop-filter, gradient ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  glassmorphism ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์™€ gradient hero ์„น์…˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 25๋ถ„ (์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 12๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ์˜์ˆ™(๋””์ž์ด๋„ˆ): "์˜์ฒ  ๋‹˜, ์š”์ฆ˜ ์œ ํ–‰ํ•˜๋Š” ๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜(Glassmorphism) ๋А๋‚Œ์œผ๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋งŒ๋“ค์–ด ๋ด์š”! ๋’ค์— ๋ฐฐ๊ฒฝ์ด ํ๋ฆฟํ•˜๊ฒŒ ๋น„์น˜๋Š” ๊ทธ ๋ฐ˜ํˆฌ๋ช… ์œ ๋ฆฌ ๋А๋‚Œ์ด์š”. ์š”์ฆ˜ Apple ์•ฑ์ด๋‚˜ Linear ๊ฐ™์€ ๋ฐ์„œ ๋‹ค ์จ์š”~"
  • ์˜์ฒ (์‹ ์ž…): "์•„ ๊ทธ๊ฑฐ์š”? ์ œ๊ฐ€ JavaScript๋กœ canvas API ์จ์„œ ๋’ค ๋ฐฐ๊ฒฝ ํ”ฝ์…€ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฝ์–ด๋‹ค๊ฐ€ blur ์ฒ˜๋ฆฌํ•˜๋ฉด ๋˜๊ฒ ๋„ค์š”! ์ข€ ๋ณต์žกํ•˜๊ธด ํ•œ๋ฐ ํ•  ์ˆ˜ ์žˆ์–ด์š”..."
  • ์˜ํ˜ธ(๋ฆฌ๋“œ): "...์˜์ฒ  ๋‹˜. ์ž ๊น๋งŒ์š”. ๊ทธ๊ฑฐ CSS ๋‘ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. backdrop-blur-md๋ž‘ bg-white/10 ์“ฐ๋ฉด ๋์ด์—์š”."

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • blur-*, brightness-*, contrast-*, grayscale-*, drop-shadow-* ๋“ฑ CSS filter ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • backdrop-blur-* ๋ฅผ ์‚ฌ์šฉํ•ด Glassmorphism ํšจ๊ณผ๋ฅผ CSS๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • bg-linear-to-*, from-*, via-*, to-* ๋กœ ๋‹ค๋ฐฉํ–ฅ ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Gradient Text ํšจ๊ณผ์™€ Mix Blend Mode์˜ ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
์˜์ˆ™์ด์˜ ์œ ๋ฆฌ ํšจ๊ณผ ์š”์ฒญ โ†’ filter vs backdrop-filter ๊ตฌ๋ถ„ โ†’ gradient ๋งˆ์Šคํ„ฐ โ†’ ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ์‹ค์ „ ๊ตฌํ˜„


๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

2021๋…„, ์›น ๋””์ž์ธ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋ฐ”๋€Œ์—ˆ์–ด. iOS 15์˜ ์ถœ์‹œ์™€ ํ•จ๊ป˜ Glassmorphism(๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜) ์ด๋ผ๋Š” ๋””์ž์ธ ํŠธ๋ Œ๋“œ๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ์œ ํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ฑฐ๋“ . ๋’ค์— ์žˆ๋Š” ๋ฐฐ๊ฒฝ์ด ๋ฐ˜ํˆฌ๋ช…ํ•˜๊ฒŒ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ด๋Š” "์œ ๋ฆฌ ํŒจ๋„" ์Šคํƒ€์ผ.

๊ณผ๊ฑฐ์—๋Š” ์ด๊ฑธ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ง„์งœ๋กœ ๋ณต์žกํ•œ JavaScript ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์–ด. Canvas API๋กœ ๋ฐฐ๊ฒฝ ํ”ฝ์…€์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ๊ณ , ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ. ์„ฑ๋Šฅ์€ ๋‹น์—ฐํžˆ ์ฒ˜์ฐธํ–ˆ๊ณ .

๊ทธ๋Ÿฐ๋ฐ CSS backdrop-filter ์†์„ฑ์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๊ฒŒ์ž„์ด ์™„์ „ํžˆ ๋ฐ”๋€Œ์—ˆ์–ด. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ GPU ๊ฐ€์†์œผ๋กœ ์ด ๋ชจ๋“  ๊ฑธ ์ฒ˜๋ฆฌํ•ด์ค˜. Tailwind๋Š” backdrop-blur-* ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ์ด๋ฅผ ํ•œ ๋‹จ์–ด๋กœ ์ถ”์ƒํ™”ํ–ˆ๊ณ .

์ด๊ฑธ ๋ชจ๋ฅด๋ฉด ์˜์ฒ ์ด์ฒ˜๋Ÿผ Canvas API ํฌํ•จ 300์ค„์งœ๋ฆฌ JavaScript๋ฅผ ์งœ๊ณ , ์˜ํ˜ธ์—๊ฒŒ ๋‘ ์ค„ CSS๋กœ ๋Œ€์ฒด๋‹นํ•˜๋Š” ์šด๋ช…์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด.


๐Ÿ—๏ธ ๋น„์œ ๋กœ ๋จผ์ € ์ดํ•ดํ•˜๊ธฐ

๐Ÿ”ฎ filter vs backdrop-filter, ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€?

์นดํŽ˜์— ์žˆ๋Š” ๋‘ ์ข…๋ฅ˜์˜ ์„ ๊ธ€๋ผ์Šค๋ฅผ ์ƒ์ƒํ•ด๋ด:

  • filter (์š”์†Œ ํ•„ํ„ฐ): ๋‚ด๊ฐ€ ์ง์ ‘ ์“ฐ๋Š” ์ƒ‰๊น” ์„ ๊ธ€๋ผ์Šค. ์„ ๊ธ€๋ผ์Šค ์ž์ฒด๊ฐ€ ํŒŒ๋ž€์ƒ‰์ด๋ฉด ๋‚˜๋Š” ํŒŒ๋ž—๊ฒŒ ๋ณด์—ฌ. ๋‚ด ์–ผ๊ตด์ด ๋ณ€ํ•˜๋Š” ๊ฑฐ์•ผ.
  • backdrop-filter (๋’ท๋ฐฐ๊ฒฝ ํ•„ํ„ฐ): ์•ˆ์ชฝ์€ ํˆฌ๋ช…ํ•˜๊ณ  ๋ฐ”๊นฅ์ชฝ ๋ Œ์ฆˆ๊ฐ€ ์—ฐ๊ธฐ ์ฒ˜๋ฆฌ๋œ ํŠน์ˆ˜ ์•ˆ๊ฒฝ. ์•ˆ๊ฒฝ์„ ์“ด ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ ์‚ฌ๋žŒ์ด ๋ฐ”๋ผ๋ณด๋Š” ํ’๊ฒฝ(๋ฐฐ๊ฒฝ) ์ด ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์—ฌ.

filter๋Š” ์š”์†Œ ์ž์‹ ์„ ๋ณ€ํ˜•ํ•˜๊ณ , backdrop-filter๋Š” ์š”์†Œ ๋’ค์— ์žˆ๋Š” ๊ฒƒ๋“ค์„ ๋ณ€ํ˜•ํ•ด.


๐Ÿ”ฌ 1๋‹จ๊ณ„: CSS filter โ€” ์š”์†Œ ์ž์‹ ์—๊ฒŒ ๊ฑฐ๋Š” ๋งˆ๋ฒ•

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • blur-*, brightness-*, grayscale-* ๋“ฑ ๋‹ค์–‘ํ•œ filter ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์ฐจ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • drop-shadow-* ๊ฐ€ shadow-* ์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

filter ์†์„ฑ์€ ์š”์†Œ ์ž์ฒด์— ์‹œ๊ฐ์  ํšจ๊ณผ๋ฅผ ๊ฑฐ๋Š” CSS ๊ธฐ๋Šฅ์ด์•ผ. Tailwind๋Š” ์ด๋ฅผ ์ง๊ด€์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์„ธํŠธ๋กœ ์ œ๊ณตํ•ด.

blur โ€” ํ๋ฆผ ํšจ๊ณผ

blur-* ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์š”์†Œ์— Gaussian blur๋ฅผ ์ ์šฉํ•ด. ํฌ๊ธฐ๋Š” xs(4px)๋ถ€ํ„ฐ 3xl(64px)๊นŒ์ง€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์–ด.

<!-- ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ์Šคํ„ฐ๋”” ๋ชฉ๋ก - ํ˜ธ๋ฒ„ ์‹œ ๋น„ํ™œ์„ฑ ์นด๋“œ ํ๋ฆฌ๊ฒŒ ์ฒ˜๋ฆฌ -->
 
<!-- โŒ ์˜์ฒ ์ด์˜ ์ˆœ์ง„ํ•œ ์ฝ”๋“œ: CSS ์ง์ ‘ ์ž‘์„ฑ -->
<div style="filter: blur(12px);">ํ๋ฆฟํ•œ ์นด๋“œ</div>
 
<!-- โœ… ์˜ํ˜ธ์˜ Tailwind ๋ฐฉ์‹ -->
<div class="blur-md">ํ๋ฆฟํ•œ ์นด๋“œ</div>
<!-- blur-xs: 4px | blur-sm: 8px | blur-md: 12px -->
<!-- blur-lg: 16px | blur-xl: 24px | blur-2xl: 40px | blur-3xl: 64px -->

์‹ค์ „ ํŒจํ„ด: ํ˜ธ๋ฒ„ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์นด๋“œ๋ฅผ ์‚ด์ง ํ๋ฆฌ๊ฒŒ ์ฒ˜๋ฆฌํ•ด์„œ ํฌ์ปค์Šค ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์–ด.

<!-- ์Šคํ„ฐ๋”” ์นด๋“œ ๋ชฉ๋ก - ์„ ํƒ๋œ ์นด๋“œ๋งŒ ์„ ๋ช…ํ•˜๊ฒŒ -->
<div class="group flex gap-4">
  <!-- ๐Ÿฃ ์˜์ฒ : "์ด ์นด๋“œ๊ฐ€ ์„ ํƒ๋์„ ๋•Œ ๋‚˜๋จธ์ง€๋ฅผ ํ๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด์š”!" -->
  <div class="transition-all duration-300 group-hover:blur-none blur-sm">
    <!-- ๋น„ํ™œ์„ฑ ์นด๋“œ: ํ‰์†Œ์—๋Š” ์•ฝ๊ฐ„ ํ๋ฆผ -->
  </div>
</div>

brightness โ€” ๋ฐ๊ธฐ ์กฐ์ ˆ

brightness-* ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์š”์†Œ์˜ ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด. brightness-0์€ ์™„์ „ ์–ด๋‘ , brightness-100์€ ์›๋ณธ, brightness-200์€ 2๋ฐฐ ๋ฐ๊ธฐ์•ผ.

<!-- โŒ ์˜์ฒ ์ด์˜ ์ฝ”๋“œ: ํ˜ธ๋ฒ„ ๋‹คํฌ ํšจ๊ณผ๋ฅผ JavaScript๋กœ ์ฒ˜๋ฆฌ -->
<div onmouseover="this.style.filter='brightness(0.75)'"
     onmouseout="this.style.filter='none'">
  ์นด๋“œ
</div>
 
<!-- โœ… ์˜ํ˜ธ์˜ Tailwind ๋ฐฉ์‹: CSS hover ๋ณ€ํ˜• -->
<div class="transition-all duration-200 hover:brightness-75">
  <!-- brightness-75 = brightness(0.75) = 25% ์–ด๋‘ก๊ฒŒ -->
  ์นด๋“œ ์ด๋ฏธ์ง€ ์˜ค๋ฒ„๋ ˆ์ด ํšจ๊ณผ
</div>

์‹ค๋ฌด์—์„œ brightness-* ๋Š” ์ด๋ฏธ์ง€ ์นด๋“œ์— ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ์‹œ ์‚ด์ง ์–ด๋‘ก๊ฒŒ ๋งŒ๋“œ๋Š” "์˜ค๋ฒ„๋ ˆ์ด ์—†์ด ์˜ค๋ฒ„๋ ˆ์ด ํšจ๊ณผ"์— ์ž์ฃผ ์“ฐ์—ฌ.

contrast โ€” ๋Œ€๋น„ ์กฐ์ ˆ

<!-- ์Šคํ„ฐ๋”” ๋ฉค๋ฒ„ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ - ๋‹คํฌ ๋ชจ๋“œ ๋Œ€๋น„ ํ–ฅ์ƒ -->
<img
  class="dark:contrast-125 dark:brightness-90 transition-all"
  src="/profile.jpg"
  alt="์˜์ฒ  ํ”„๋กœํ•„"
/>
<!-- contrast-125: 25% ๋Œ€๋น„ ์ฆ๊ฐ€ (๋‹คํฌ ๋ชจ๋“œ์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ๋” ์„ ๋ช…ํ•˜๊ฒŒ) -->

grayscale โ€” ํ‘๋ฐฑ ์ฒ˜๋ฆฌ

grayscale ์€ ์™„์ „ ํ‘๋ฐฑ, grayscale-0 ์€ ์›์ƒ‰ ์œ ์ง€์•ผ.

<!-- ์Šคํ„ฐ๋”” ๋ชจ์ง‘ ๋งˆ๊ฐ๋œ ์นด๋“œ๋ฅผ ํ‘๋ฐฑ์œผ๋กœ ํ‘œ์‹œ -->
 
<!-- โŒ ์˜์ฒ ์ด์˜ ์ฝ”๋“œ: ๋งˆ๊ฐ ์—ฌ๋ถ€๋ฅผ JavaScript๋กœ ์ฒดํฌํ•ด์„œ ํด๋ž˜์Šค ํ•˜๋“œ์ฝ”๋”ฉ -->
<div class={isClosed ? 'grayscale-filter-custom' : ''}>
 
<!-- โœ… ์˜ํ˜ธ์˜ ํŒจํ„ด: ๋ฐ์ดํ„ฐ ์†์„ฑ + Tailwind ์กฐ๊ฑด ํด๋ž˜์Šค -->
<div class="transition-all duration-500"
     data-closed="true"
     class="data-[closed=true]:grayscale data-[closed=true]:opacity-60">
  <img src="/study-thumbnail.jpg" alt="์Šคํ„ฐ๋”” ์ธ๋„ค์ผ" />
  <span>React ์Šคํ„ฐ๋”” (๋ชจ์ง‘ ๋งˆ๊ฐ)</span>
</div>

drop-shadow โ€” box-shadow ์™€์˜ ๊ฒฐ์ •์  ์ฐจ์ด

์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์•ผ. shadow-* (box-shadow)์™€ drop-shadow-* (filter: drop-shadow)๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ด.

<!-- ๐Ÿฆ ์˜ํ˜ธ: "์˜์ฒ  ๋‹˜, PNG ๋กœ๊ณ ์— box-shadow ์“ฐ๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ  ์•Œ์•„์š”?" -->
 
<!-- โŒ box-shadow: ์š”์†Œ์˜ "์‚ฌ๊ฐํ˜• ๋ฐ•์Šค" ์— ๊ทธ๋ฆผ์ž๋ฅผ ์ ์šฉ -->
<!-- ํˆฌ๋ช… PNG๋ผ๋„ ์‚ฌ๊ฐํ˜• ํ˜•ํƒœ๋กœ ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊น€ -->
<img src="/logo-transparent.png" class="shadow-xl" />
<!-- ๊ฒฐ๊ณผ: ๋กœ๊ณ  ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ฒจ๋ฒ„๋ฆผ ๐Ÿ˜ฑ -->
 
<!-- โœ… drop-shadow: ์š”์†Œ์˜ "์‹ค์ œ ํ”ฝ์…€ ํ˜•ํƒœ" ์— ๊ทธ๋ฆผ์ž๋ฅผ ์ ์šฉ -->
<!-- SVG, ํˆฌ๋ช… PNG ๋“ฑ์˜ ์‹ค์ œ ๋ชจ์–‘๋Œ€๋กœ ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊น€ -->
<img src="/logo-transparent.png" class="drop-shadow-xl" />
<!-- ๊ฒฐ๊ณผ: ๋กœ๊ณ ์˜ ์‹ค์ œ ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ผ ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊น€ โœจ -->
 
<!-- ์ปฌ๋Ÿฌ drop-shadow๋„ ๊ฐ€๋Šฅ -->
<img src="/logo.svg" class="drop-shadow-xl drop-shadow-indigo-500/50" />
<!-- drop-shadow-[color]: ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ ์„ค์ • -->
<!-- /50: ๊ทธ๋ฆผ์ž ํˆฌ๋ช…๋„ 50% -->

drop-shadow์˜ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ’๋“ค:

์œ ํ‹ธ๋ฆฌํ‹ฐCSS ๊ฐ’
drop-shadow-xs0 1px 1px rgb(0 0 0 / 0.05)
drop-shadow-sm0 1px 2px rgb(0 0 0 / 0.15)
drop-shadow-md0 3px 3px rgb(0 0 0 / 0.12)
drop-shadow-lg0 4px 4px rgb(0 0 0 / 0.15)
drop-shadow-xl0 9px 7px rgb(0 0 0 / 0.1)
drop-shadow-2xl0 25px 25px rgb(0 0 0 / 0.15)

๐ŸชŸ 2๋‹จ๊ณ„: Backdrop Filter โ€” ๋ฐฐ๊ฒฝ์„ ํ†ต๊ณผํ•˜๋Š” ์œ ๋ฆฌ

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • backdrop-blur-* ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ํ•„์ˆ˜ ์ „์ œ ์กฐ๊ฑด์„ ์ดํ•ดํ•œ๋‹ค.
  • Glassmorphism ํšจ๊ณผ ๊ตฌํ˜„์˜ 3๊ฐ€์ง€ ํ•„์ˆ˜ ์žฌ๋ฃŒ๋ฅผ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

backdrop-filter ๋Š” ์š”์†Œ ๋’ค์— ์žˆ๋Š” ์˜์—ญ์— ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ด. ์š”์†Œ ์ž์ฒด๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ทธ ์š”์†Œ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฐ๊ฒฝ์ด ๋ณ€ํ•˜๋Š” ๊ฑฐ์•ผ.

๋™์ž‘ ์›๋ฆฌ: 3๊ฐ€์ง€ ํ•„์ˆ˜ ์žฌ๋ฃŒ

Glassmorphism์„ ๋งŒ๋“ค๋ ค๋ฉด ์ •ํ™•ํžˆ 3๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ด. ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ํšจ๊ณผ๊ฐ€ ์—†์–ด.

Glassmorphism = ๋ฐ˜ํˆฌ๋ช… ๋ฐฐ๊ฒฝ์ƒ‰ + backdrop-blur + ๋’ค์— ์žˆ๋Š” ๋ฐฐ๊ฒฝ ์š”์†Œ
<!-- ๐Ÿฃ ์˜์ฒ : "backdrop-blur-md ์ผ๋Š”๋ฐ ์™œ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณด์—ฌ์š”?" -->
<!-- ํ”ํ•œ ์‹ค์ˆ˜: ๋ฐฐ๊ฒฝ์ƒ‰์ด ๋ถˆํˆฌ๋ช…ํ•˜๋ฉด backdrop-filter๊ฐ€ ๊ฐ€๋ ค์ ธ์„œ ์•ˆ ๋ณด์ž„ -->
 
<!-- โŒ ์‹ค์ˆ˜ 1: ๋ฐฐ๊ฒฝ์ƒ‰์ด ์™„์ „ ๋ถˆํˆฌ๋ช… -->
<nav class="bg-white backdrop-blur-md">
  <!-- backdrop-blur๊ฐ€ ์žˆ์–ด๋„ bg-white๊ฐ€ ์™„์ „ํžˆ ๋ฎ์–ด๋ฒ„๋ ค์„œ ํšจ๊ณผ ์—†์Œ -->
</nav>
 
<!-- โŒ ์‹ค์ˆ˜ 2: ๋’ค์— ๋ฐฐ๊ฒฝ์ด ์—†์Œ -->
<div class="absolute bg-white/30 backdrop-blur-md">
  <!-- ๋ถ€๋ชจ์— ๋ฐฐ๊ฒฝ์ด ์—†์œผ๋ฉด ํ๋ฆด ๊ฒƒ๋„ ์—†์–ด์„œ ํšจ๊ณผ ์—†์Œ -->
</div>
 
<!-- โœ… ์˜ฌ๋ฐ”๋ฅธ Glassmorphism ๋ ˆ์‹œํ”ผ -->
<!-- 1๏ธโƒฃ ๋’ค์— ์žˆ๋Š” ๋ฐฐ๊ฒฝ -->
<div class="relative h-screen bg-[url(/hero-bg.jpg)] bg-cover">
  <!-- 2๏ธโƒฃ ๋ฐ˜ํˆฌ๋ช… ๋ฐฐ๊ฒฝ์ƒ‰ (bg-white/10, bg-white/20 ๋“ฑ) -->
  <!-- 3๏ธโƒฃ backdrop-blur ์ ์šฉ -->
  <nav class="
    absolute inset-x-0 top-0
    bg-white/10          /* 10% ๋ถˆํˆฌ๋ช… ํฐ์ƒ‰ - ํ•ต์‹ฌ! */
    backdrop-blur-md     /* ๋’ค ๋ฐฐ๊ฒฝ 12px ๋ธ”๋Ÿฌ */
    border-b border-white/20
    px-6 py-4
  ">
    ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”๋‰ด
  </nav>
</div>

backdrop-filter ์ „์ฒด ์œ ํ‹ธ๋ฆฌํ‹ฐ

backdrop-blur-* ์™ธ์—๋„ ๋ฐฐ๊ฒฝ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ•„ํ„ฐ๋“ค์ด ์žˆ์–ด:

<!-- ๋ฐฐ๊ฒฝ ๋ธ”๋Ÿฌ -->
<div class="backdrop-blur-sm">...</div>    <!-- 8px -->
<div class="backdrop-blur-md">...</div>    <!-- 12px -->
<div class="backdrop-blur-lg">...</div>    <!-- 16px -->
<div class="backdrop-blur-xl">...</div>    <!-- 24px -->
 
<!-- ๋ฐฐ๊ฒฝ ๋ฐ๊ธฐ -->
<div class="backdrop-brightness-75">...</div>   <!-- ์–ด๋‘ก๊ฒŒ -->
<div class="backdrop-brightness-125">...</div>  <!-- ๋ฐ๊ฒŒ -->
 
<!-- ๋ฐฐ๊ฒฝ ๋Œ€๋น„ -->
<div class="backdrop-contrast-125">...</div>
 
<!-- ๋ฐฐ๊ฒฝ ํ‘๋ฐฑ -->
<div class="backdrop-grayscale">...</div>
 
<!-- ๋ฐฐ๊ฒฝ ๋ถˆํฌํ™” -->
<div class="backdrop-saturate-150">...</div>

์‹œ๋‹ˆ์–ด๊ฐ€ ์กฐํ•ฉํ•˜๋Š” ์‹ค์ „ ๋ ˆ์‹œํ”ผ

<!-- ๐Ÿฆ ์˜ํ˜ธ์˜ ํ”„๋ฆฌ๋ฏธ์—„ Glass ์นด๋“œ ๋ ˆ์‹œํ”ผ -->
<div class="
  relative
  bg-white/10           /* ๋ฐ˜ํˆฌ๋ช… ํฐ์ƒ‰ */
  backdrop-blur-md      /* ๋ฐฐ๊ฒฝ ๋ธ”๋Ÿฌ */
  backdrop-brightness-90 /* ๋ฐฐ๊ฒฝ ์‚ด์ง ์–ด๋‘ก๊ฒŒ = ๊นŠ์ด๊ฐ */
  backdrop-saturate-150  /* ๋ฐฐ๊ฒฝ ์ฑ„๋„ ๋†’์—ฌ์„œ ์„ ๋ช…ํ•˜๊ฒŒ */
  border border-white/25  /* ์œ ๋ฆฌ ํ…Œ๋‘๋ฆฌ */
  rounded-2xl
  shadow-xl
">
  <!-- ์œ ๋ฆฌ ํŒจ๋„ ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ  -->
</div>

๐ŸŒˆ 3๋‹จ๊ณ„: Gradient โ€” ์ƒ‰์ƒ์˜ ํ๋ฆ„์„ ์„ค๊ณ„ํ•˜๋‹ค

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • linear, radial, conic ์„ธ ๊ฐ€์ง€ gradient์˜ ์ฐจ์ด์™€ ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ ์‹œ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • from-*, via-*, to-* ์ƒ‰์ƒ ์ •์ง€์ ์„ ์กฐํ•ฉํ•ด ๋ณต์žกํ•œ ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Linear Gradient (์„ ํ˜• ๊ทธ๋ผ๋””์–ธํŠธ)

Tailwind v4์—์„œ gradient ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ํฌ๊ฒŒ ์—…๋ฐ์ดํŠธ๋์–ด. ๋ฐฉํ–ฅ ์ง€์ • ๋ฐฉ์‹์ด ๊ธฐ์กด๋ณด๋‹ค ํ›จ์”ฌ ์œ ์—ฐํ•ด์กŒ์–ด.

<!-- ๋ฐฉํ–ฅ ์ง€์ •: bg-linear-to-{๋ฐฉํ–ฅ} -->
<div class="bg-linear-to-r from-indigo-500 to-purple-500">์™ผ์ชฝโ†’์˜ค๋ฅธ์ชฝ</div>
<div class="bg-linear-to-br from-cyan-500 to-blue-500">์™ผ์ชฝ์œ„โ†’์˜ค๋ฅธ์ชฝ์•„๋ž˜</div>
<div class="bg-linear-to-t from-emerald-500 to-teal-300">์•„๋ž˜โ†’์œ„</div>
 
<!-- ๊ฐ๋„ ์ง€์ • (Tailwind v4): bg-linear-{angle} -->
<div class="bg-linear-45 from-pink-500 to-rose-500">45๋„ ๋ฐฉํ–ฅ</div>
<div class="bg-linear-135 from-violet-500 to-purple-500">135๋„ ๋ฐฉํ–ฅ</div>

๋ฐฉํ–ฅ ์•ฝ์–ด ์ฐธ์กฐํ‘œ:

์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฐฉํ–ฅ
bg-linear-to-t์•„๋ž˜ โ†’ ์œ„ (โ†‘)
bg-linear-to-tr์™ผ์ชฝ์•„๋ž˜ โ†’ ์˜ค๋ฅธ์ชฝ์œ„ (โ†—)
bg-linear-to-r์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ (โ†’)
bg-linear-to-br์™ผ์ชฝ์œ„ โ†’ ์˜ค๋ฅธ์ชฝ์•„๋ž˜ (โ†˜)
bg-linear-to-b์œ„ โ†’ ์•„๋ž˜ (โ†“)
bg-linear-to-bl์˜ค๋ฅธ์ชฝ์œ„ โ†’ ์™ผ์ชฝ์•„๋ž˜ (โ†™)
bg-linear-to-l์˜ค๋ฅธ์ชฝ โ†’ ์™ผ์ชฝ (โ†)
bg-linear-to-tl์˜ค๋ฅธ์ชฝ์•„๋ž˜ โ†’ ์™ผ์ชฝ์œ„ (โ†–)

์ƒ‰์ƒ ์ •์ง€์ : from, via, to

<!-- ๊ธฐ๋ณธ: ์‹œ์ž‘์  โ†’ ๋์  -->
<div class="bg-linear-to-r from-cyan-500 to-blue-500">
  cyan์—์„œ blue๋กœ
</div>
 
<!-- ๊ฒฝ์œ ์  ์ถ”๊ฐ€: from โ†’ via โ†’ to -->
<div class="bg-linear-to-r from-indigo-500 via-purple-500 to-pink-500">
  ์ธ๋””๊ณ  โ†’ ๋ณด๋ผ โ†’ ๋ถ„ํ™ (Instagram ์Šคํƒ€์ผ)
</div>
 
<!-- ์ •์ง€์  ์œ„์น˜ ์ง€์ • -->
<div class="bg-linear-to-r from-indigo-500 from-10% via-sky-500 via-30% to-emerald-500 to-90%">
  <!-- from-10%: ์‹œ์ž‘์ ์„ 10% ์œ„์น˜์—์„œ ์‹œ์ž‘ -->
  <!-- via-30%: ๊ฒฝ์œ ์ ์ด 30% ์œ„์น˜ -->
  <!-- to-90%: ๋์ ์„ 90% ์œ„์น˜์—์„œ ์ข…๋ฃŒ -->
  ์ •๊ตํ•˜๊ฒŒ ์กฐ์ ˆ๋œ ๊ทธ๋ผ๋””์–ธํŠธ
</div>

Radial Gradient (๋ฐฉ์‚ฌํ˜• ๊ทธ๋ผ๋””์–ธํŠธ)

<!-- ๊ธฐ๋ณธ ๋ฐฉ์‚ฌํ˜•: ์ค‘์•™์—์„œ ํผ์ ธ๋‚˜๊ฐ€๋Š” -->
<div class="bg-radial from-pink-400 to-fuchsia-700">
  <!-- ์•ˆ์ชฝ pink โ†’ ๋ฐ”๊นฅ์ชฝ fuchsia -->
</div>
 
<!-- ์‹œ์ž‘์  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ -->
<div class="bg-radial-[at_50%_75%] from-sky-200 via-blue-400 to-indigo-900 to-90%">
  <!-- 75% ์ง€์ (์•„๋ž˜์ชฝ)์—์„œ ๋ฐฉ์‚ฌ ์‹œ์ž‘ - ์กฐ๋ช… ํšจ๊ณผ์ฒ˜๋Ÿผ ๋ณด์ž„ -->
</div>
 
<div class="bg-radial-[at_25%_25%] from-white to-zinc-900 to-75%">
  <!-- ์™ผ์ชฝ ์œ„ 25% ์ง€์ ์—์„œ ๋ฐฉ์‚ฌ - ์ฝ”๋„ˆ ์กฐ๋ช… ํšจ๊ณผ -->
</div>

Conic Gradient (์›๋ฟ”ํ˜• ๊ทธ๋ผ๋””์–ธํŠธ)

ํŒŒ์ด ์ฐจํŠธ, ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ, ํ™€๋กœ๊ทธ๋ž˜ํ”ฝ ํšจ๊ณผ์— ํ™œ์šฉ๋ผ.

<!-- ์›๋ฟ”ํ˜• ๊ทธ๋ผ๋””์–ธํŠธ -->
<div class="size-24 rounded-full bg-conic from-blue-600 to-sky-400 to-50%">
  <!-- ๋ฐ˜์›๋งŒ ์ฑ„์šฐ๋Š” ํŒŒ์ด ์ฐจํŠธ ํšจ๊ณผ -->
</div>
 
<div class="size-24 rounded-full bg-conic/decreasing from-violet-700 via-lime-300 to-violet-700">
  <!-- decreasing: ์ƒ‰์ƒ ๋ณด๊ฐ„ ๋ฐฉํ–ฅ ์—ญ์ „ - ํ™€๋กœ๊ทธ๋ž˜ํ”ฝ ํšจ๊ณผ -->
</div>

์ƒ‰์ƒ ๋ณด๊ฐ„ ๋ชจ๋“œ (Tailwind v4 ์‹ ๊ธฐ๋Šฅ)

<!-- Tailwind v4: ๊ทธ๋ผ๋””์–ธํŠธ ๋ณด๊ฐ„ ์ƒ‰๊ณต๊ฐ„ ์„ ํƒ ๊ฐ€๋Šฅ -->
<div class="bg-linear-to-r/srgb from-indigo-500 to-teal-400">sRGB ๋ณด๊ฐ„</div>
<div class="bg-linear-to-r/oklch from-indigo-500 to-teal-400">oklch ๋ณด๊ฐ„ (๋” ์ƒ์ƒํ•œ ์ƒ‰)</div>
<div class="bg-linear-to-r/hsl from-indigo-500 to-teal-400">HSL ๋ณด๊ฐ„</div>
 
<!-- ๐Ÿ’ก ํŒ: ๊ธฐ๋ณธ๊ฐ’์€ oklab. oklch๊ฐ€ ๊ฐ€์žฅ ์ง€๊ฐ์ ์œผ๋กœ ๊ท ์ผํ•œ ์ƒ‰์ƒ ์ „ํ™˜์„ ๋ณด์—ฌ์คŒ -->

โœ๏ธ 4๋‹จ๊ณ„: Gradient Text โ€” ํ…์ŠคํŠธ์— ๊ทธ๋ผ๋””์–ธํŠธ ์ž…ํžˆ๊ธฐ

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • Gradient Text๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ CSS ์†์„ฑ์„ ์ดํ•ดํ•œ๋‹ค.
  • ์™œ text-transparent ๊ฐ€ ํ•„์ˆ˜์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋žœ๋”ฉ ํŽ˜์ด์ง€์˜ ํžˆ์–ด๋กœ ํƒ€์ดํ‹€์ฒ˜๋Ÿผ ํ…์ŠคํŠธ์— ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์ž…ํžˆ๋Š” ๊ธฐ๋ฒ•์ด์•ผ.

<!-- ๐Ÿฃ ์˜์ฒ : "๊ทธ๋ผ๋””์–ธํŠธ ํ…์ŠคํŠธ๋ฅผ span์— background ์ฃผ๋ฉด ๋˜๋‚˜์š”?" -->
<!-- ์•„๋‹ˆ์•ผ. ์ด๊ฑด ํŠน๋ณ„ํ•œ 3๋‹จ๊ณ„ ํŠธ๋ฆญ์ด ์žˆ์–ด. -->
 
<!-- Gradient Text ๋งˆ๋ฒ•์˜ 3๊ฐ€์ง€ ์žฌ๋ฃŒ -->
<h1 class="
  bg-linear-to-r from-violet-600 to-indigo-600   /* 1๏ธโƒฃ gradient ๋ฐฐ๊ฒฝ */
  bg-clip-text         /* 2๏ธโƒฃ ๋ฐฐ๊ฒฝ์„ ํ…์ŠคํŠธ ๋ชจ์–‘์œผ๋กœ ์ž˜๋ผ๋ƒ„ */
  text-transparent     /* 3๏ธโƒฃ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ โ†’ ๋ฐฐ๊ฒฝ์ด ๋น„์นจ */
">
  ๊ฐœ๋ฐœ์ž ์Šคํ„ฐ๋”” ๋งค์นญ ์ปค๋ฎค๋‹ˆํ‹ฐ
</h1>

์™œ ์ด 3๊ฐœ๊ฐ€ ๋™์‹œ์— ํ•„์š”ํ•œ๊ฐ€?

  1. bg-linear-to-r from-violet-600 to-indigo-600: ์š”์†Œ์— ๊ทธ๋ผ๋””์–ธํŠธ ๋ฐฐ๊ฒฝ ์ƒ์„ฑ
  2. bg-clip-text: ๋ฐฐ๊ฒฝ์„ ํ…์ŠคํŠธ ๊ธ€์ž ๋ชจ์–‘์œผ๋กœ๋งŒ ์ž˜๋ผ๋ƒ„ (clip)
  3. text-transparent: ํ…์ŠคํŠธ ๊ธ€์ž ์ž์ฒด์˜ ์ƒ‰์ƒ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ฆ

์ด ์„ธ ๊ฐœ๊ฐ€ ํ˜‘๋ ฅํ•ด์•ผ๋งŒ "๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋””์–ธํŠธ๊ฐ€ ํ…์ŠคํŠธ ๋ชจ์–‘์œผ๋กœ ๋ณด์ด๋Š”" ์ฐฉ์‹œ๊ฐ€ ์™„์„ฑ๋ผ.

<!-- ์‹ค์ „ ์˜ˆ์‹œ: ๋‹ค์–‘ํ•œ gradient text -->
<h1 class="bg-linear-to-r from-pink-500 via-purple-500 to-indigo-500 bg-clip-text text-transparent text-5xl font-bold">
  ์Šคํ„ฐ๋”” ๋งค์นญ ํ”Œ๋žซํผ
</h1>
 
<!-- dark mode ๋Œ€์‘ -->
<h2 class="bg-linear-to-r from-teal-400 to-cyan-300 dark:from-teal-300 dark:to-cyan-200 bg-clip-text text-transparent">
  ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ
</h2>
 
<!-- ๐Ÿšจ ์‹œ๋‹ˆ์–ด ์ฃผ์˜์‚ฌํ•ญ: print ๋ชจ๋“œ์—์„œ๋Š” ํ…์ŠคํŠธ๊ฐ€ ์•ˆ ๋ณด์ผ ์ˆ˜ ์žˆ์Œ -->
<!-- print:text-gray-900 ์ฒ˜๋Ÿผ ์ธ์‡„ ๋Œ€์‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ -->
<h1 class="bg-linear-to-r from-violet-600 to-indigo-600 bg-clip-text text-transparent print:text-gray-900">
  ์ธ์‡„ ๋Œ€์‘๋œ ๊ทธ๋ผ๋””์–ธํŠธ ํ…์ŠคํŠธ
</h1>

๐ŸŽญ 5๋‹จ๊ณ„: Mix Blend Mode โ€” ๋ ˆ์ด์–ด์˜ ์—ฐ๊ธˆ์ˆ 

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • mix-blend-* ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ Photoshop ๋ ˆ์ด์–ด ํ˜ผํ•ฉ ๋ชจ๋“œ์™€ ๋™์ผํ•œ ์›๋ฆฌ์ž„์„ ์ดํ•ดํ•œ๋‹ค.
  • ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” mix-blend-multiply, mix-blend-screen ์˜ ์ฐจ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํฌํ† ์ƒต์˜ ๋ ˆ์ด์–ด ํŒจ๋„์—์„œ "๊ณฑํ•˜๊ธฐ(Multiply)", "์Šคํฌ๋ฆฐ(Screen)" ๊ฐ™์€ ๊ฑธ ์จ๋ณธ ์  ์žˆ์–ด? CSS์˜ mix-blend-mode ๊ฐ€ ๋ฐ”๋กœ ๊ทธ๊ฑฐ์•ผ.

<!-- mix-blend-multiply: ์ƒ‰์ƒ์„ ๊ณฑํ•ด์„œ ์–ด๋‘์›Œ์ง (ํฐ ๋ฐฐ๊ฒฝ = ํˆฌ๋ช…ํ•ด์ง) -->
<!-- ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ ์œ„์˜ ์ด๋ฏธ์ง€์—์„œ ํฐ ์˜์—ญ์„ ๋‚ ๋ ค๋ฒ„๋ฆฌ๋Š” ํšจ๊ณผ -->
<div class="relative bg-indigo-100">
  <img src="/logo-white-bg.png" class="mix-blend-multiply" />
  <!-- ๋กœ๊ณ ์˜ ํฐ ๋ฐฐ๊ฒฝ์ด ์‚ฌ๋ผ์ง€๊ณ  ๋กœ๊ณ ๋งŒ ๋ณด์ž„ -->
</div>
 
<!-- mix-blend-screen: ์ƒ‰์ƒ์„ ์Šคํฌ๋ฆฐ ์ฒ˜๋ฆฌํ•ด์„œ ๋ฐ์•„์ง (๊ฒ€์€ ๋ฐฐ๊ฒฝ = ํˆฌ๋ช…ํ•ด์ง) -->
<div class="relative bg-gray-900">
  <img src="/light-flare.png" class="mix-blend-screen" />
  <!-- ๋น› ํšจ๊ณผ ์ด๋ฏธ์ง€์˜ ๊ฒ€์€ ๋ฐฐ๊ฒฝ์„ ๋‚ ๋ ค๋ฒ„๋ฆผ -->
</div>
 
<!-- mix-blend-overlay: ๋ฐ์€ ๋ถ€๋ถ„์€ ๋” ๋ฐ๊ฒŒ, ์–ด๋‘์šด ๋ถ€๋ถ„์€ ๋” ์–ด๋‘ก๊ฒŒ -->
<div class="relative">
  <img src="/photo.jpg" />
  <div class="absolute inset-0 bg-indigo-500 mix-blend-overlay opacity-40">
    <!-- ์‚ฌ์ง„ ์œ„์— ์ƒ‰๊ฐ ์˜ค๋ฒ„๋ ˆ์ด ํšจ๊ณผ -->
  </div>
</div>

์ž์ฃผ ์“ฐ์ด๋Š” blend mode ์ •๋ฆฌ:

์œ ํ‹ธ๋ฆฌํ‹ฐํšจ๊ณผ์šฉ๋„
mix-blend-multiply์ƒ‰ ๊ณฑํ•˜๊ธฐ (์–ด๋‘์›Œ์ง)ํฐ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ์˜ค๋ฒ„๋ ˆ์ด
mix-blend-screen์ƒ‰ ์Šคํฌ๋ฆฐ (๋ฐ์•„์ง)์–ด๋‘์šด ๋ฐฐ๊ฒฝ์— ๋น› ํšจ๊ณผ
mix-blend-overlay๊ณฑํ•˜๊ธฐ + ์Šคํฌ๋ฆฐ ํ•ฉ์„ฑ์ƒ‰๊ฐ ํ•„ํ„ฐ ํšจ๊ณผ
mix-blend-difference์ƒ‰์ƒ ์ฐจ์ด๊ฐ’๋ฐ˜์ „ ๋งˆ์Šคํฌ ํšจ๊ณผ
mix-blend-luminosity๋ช…๋„๋งŒ ํ•ฉ์„ฑ์ƒ‰์ƒ ์œ ์ง€ํ•˜๋ฉฐ ๋ช…๋„ ๋ณ€๊ฒฝ

๐Ÿ† ์‹ค์ „: ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ Glassmorphism ๊ตฌํ˜„

์ด์ œ ๋ฐฐ์šด ๋ชจ๋“  ๊ฒƒ์„ ํ•ฉ์ณ์„œ ์‹ค์ œ ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋žœ๋”ฉ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

Glassmorphism ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”

// components/GlassNavbar.tsx
// ๐Ÿฆ ์˜ํ˜ธ: "์Šคํฌ๋กค ๋‚ด๋ ค๋„ ๋ฐฐ๊ฒฝ์ด ์˜ˆ์˜๊ฒŒ ๋ณด์ด๋Š” ๋„ค๋น„๋ฐ”์•ผ, ์˜์ฒ  ๋‹˜"
 
export default function GlassNavbar() {
  return (
    // ์ „์ฒด ํŽ˜์ด์ง€ ๋ž˜ํผ - ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๊ฐ€ ๋’ค์— ์žˆ์–ด์•ผ backdrop-blur ํšจ๊ณผ๊ฐ€ ๋ณด์ž„
    <div className="relative min-h-screen">
      {/* 1๏ธโƒฃ ๋’ค์— ์žˆ๋Š” ๋ฐฐ๊ฒฝ */}
      <div className="absolute inset-0 bg-linear-to-br from-violet-900 via-indigo-900 to-purple-900" />
 
      {/* ๋ฐฐ๊ฒฝ ์žฅ์‹ ์š”์†Œ๋“ค (blur๋กœ ๋ณด์ผ€ ํšจ๊ณผ) */}
      <div className="absolute top-20 left-10 size-72 bg-purple-500/30 rounded-full blur-3xl" />
      <div className="absolute top-40 right-20 size-56 bg-indigo-500/20 rounded-full blur-2xl" />
 
      {/* 2๏ธโƒฃ Glassmorphism ๋„ค๋น„๊ฒŒ์ด์…˜ */}
      <nav className="
        sticky top-0 z-50
        bg-white/10              /* ๋ฐ˜ํˆฌ๋ช… ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ - ํ•ต์‹ฌ! */
        backdrop-blur-md         /* ๋’ค ๋ฐฐ๊ฒฝ ๋ธ”๋Ÿฌ */
        backdrop-saturate-150    /* ๋ฐฐ๊ฒฝ ์ฑ„๋„ ๋†’์—ฌ์„œ ์œ ๋ฆฌ๊ฐ ์ฆ๊ฐ€ */
        border-b border-white/20 /* ์œ ๋ฆฌ ํ…Œ๋‘๋ฆฌ */
        px-6 py-4
      ">
        <div className="max-w-7xl mx-auto flex items-center justify-between">
          {/* ๋กœ๊ณ  - gradient text */}
          <span className="
            text-xl font-bold
            bg-linear-to-r from-violet-300 to-indigo-300
            bg-clip-text text-transparent
          ">
            ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ
          </span>
 
          {/* ๋ฉ”๋‰ด ๋งํฌ */}
          <div className="flex gap-6 text-white/80">
            <a href="/studies" className="hover:text-white transition-colors">์Šคํ„ฐ๋”” ์ฐพ๊ธฐ</a>
            <a href="/create" className="hover:text-white transition-colors">์Šคํ„ฐ๋”” ๋งŒ๋“ค๊ธฐ</a>
            <a href="/profile" className="hover:text-white transition-colors">ํ”„๋กœํ•„</a>
          </div>
 
          {/* CTA ๋ฒ„ํŠผ - Glass ์Šคํƒ€์ผ */}
          <button className="
            px-4 py-2 rounded-lg
            bg-white/20          /* ์•ฝ๊ฐ„ ๋” ์ง„ํ•œ glass */
            backdrop-blur-sm
            border border-white/30
            text-white text-sm font-medium
            hover:bg-white/30
            transition-all duration-200
          ">
            ์‹œ์ž‘ํ•˜๊ธฐ
          </button>
        </div>
      </nav>
 
      {/* 3๏ธโƒฃ Hero ์„น์…˜ - Gradient ๋ฐฐ๊ฒฝ + Gradient Text */}
      <main className="relative z-10 flex flex-col items-center justify-center min-h-screen text-center px-4">
        <div className="
          bg-white/5           /* ๋งค์šฐ ์—ฐํ•œ glass ํŒจ๋„ */
          backdrop-blur-sm
          border border-white/10
          rounded-3xl
          px-12 py-16
          max-w-3xl
        ">
          {/* Gradient Text ํžˆ์–ด๋กœ ํƒ€์ดํ‹€ */}
          <h1 className="
            text-5xl md:text-7xl font-black
            bg-linear-to-r from-violet-300 via-pink-300 to-indigo-300
            bg-clip-text text-transparent
            mb-6 leading-tight
          ">
            ๊ฐœ๋ฐœ์ž๋“ค์˜ ์Šคํ„ฐ๋”” ๋งค์นญ
          </h1>
 
          <p className="text-white/70 text-xl mb-10 leading-relaxed">
            ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•  ์Šคํ„ฐ๋”” ํŒŒํŠธ๋„ˆ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”.
            React, TypeScript, ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์›ํ•˜๋Š” ์ฃผ์ œ๋กœ ๋ฐ”๋กœ ์‹œ์ž‘!
          </p>
 
          <div className="flex gap-4 justify-center flex-wrap">
            {/* Primary ๋ฒ„ํŠผ - solid gradient */}
            <button className="
              px-8 py-3.5 rounded-xl
              bg-linear-to-r from-violet-500 to-indigo-500
              text-white font-semibold text-lg
              hover:from-violet-400 hover:to-indigo-400
              transition-all duration-200
              shadow-lg shadow-indigo-500/25
              drop-shadow-lg
            ">
              ์Šคํ„ฐ๋”” ์ฐพ๊ธฐ
            </button>
 
            {/* Secondary ๋ฒ„ํŠผ - glass */}
            <button className="
              px-8 py-3.5 rounded-xl
              bg-white/10
              backdrop-blur-sm
              border border-white/30
              text-white font-semibold text-lg
              hover:bg-white/20
              transition-all duration-200
            ">
              ์Šคํ„ฐ๋”” ๋งŒ๋“ค๊ธฐ
            </button>
          </div>
        </div>
      </main>
    </div>
  );
}

์Šคํ„ฐ๋”” ์นด๋“œ - ์ด๋ฏธ์ง€ ํ•„ํ„ฐ ํšจ๊ณผ

// components/StudyCard.tsx
// ๐Ÿฃ ์˜์ฒ : "๋งˆ๊ฐ๋œ ์Šคํ„ฐ๋”” ์นด๋“œ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ์‹ถ์–ด์š”"
// ๐Ÿฆ ์˜ํ˜ธ: "grayscale + brightness ์กฐํ•ฉ์ด๋ฉด ๋ผ์š”"
 
interface StudyCardProps {
  title: string;
  thumbnail: string;
  isClosed: boolean;
  memberCount: number;
}
 
export default function StudyCard({ title, thumbnail, isClosed, memberCount }: StudyCardProps) {
  return (
    <div className="group relative rounded-2xl overflow-hidden bg-white shadow-md hover:shadow-xl transition-all duration-300">
      {/* ์ธ๋„ค์ผ ์ด๋ฏธ์ง€ */}
      <div className="relative h-48">
        <img
          src={thumbnail}
          alt={title}
          className={`
            w-full h-full object-cover
            transition-all duration-500
            group-hover:scale-105   /* hover ์‹œ ์ด๋ฏธ์ง€ ํ™•๋Œ€ */
            ${isClosed ? 'grayscale brightness-75' : 'grayscale-0 brightness-100'}
          `}
        />
 
        {/* ๋งˆ๊ฐ ๋ฐฐ์ง€ - drop-shadow ํ™œ์šฉ */}
        {isClosed && (
          <div className="
            absolute top-3 right-3
            bg-red-500/90 backdrop-blur-sm
            text-white text-xs font-bold
            px-2.5 py-1 rounded-full
            drop-shadow-md
          ">
            ๋ชจ์ง‘ ๋งˆ๊ฐ
          </div>
        )}
 
        {/* ์ด๋ฏธ์ง€ ํ•˜๋‹จ ๊ทธ๋ผ๋””์–ธํŠธ ์˜ค๋ฒ„๋ ˆ์ด */}
        <div className="
          absolute inset-x-0 bottom-0 h-20
          bg-linear-to-t from-black/60 to-transparent
        " />
      </div>
 
      {/* ์นด๋“œ ๋‚ด์šฉ */}
      <div className="p-4">
        <h3 className="font-semibold text-gray-900">{title}</h3>
        <p className="text-sm text-gray-500 mt-1">๋ฉค๋ฒ„ {memberCount}๋ช…</p>
      </div>
    </div>
  );
}

๐Ÿ ์ด๋ฒˆ์— ๋ฐฐ์šด ๋‚ด์šฉ ์ด์ •๋ฆฌ

๋ถ„๋ฅ˜์œ ํ‹ธ๋ฆฌํ‹ฐ์ž‘๋™ ๋Œ€์ƒ์ฃผ์š” ์šฉ๋„
์š”์†Œ ๋ธ”๋Ÿฌblur-sm ~ blur-3xl์š”์†Œ ์ž์‹ ํฌ์ปค์Šค ํšจ๊ณผ, ๋ฐฐ๊ฒฝ ์†Œ์žฌ
์š”์†Œ ๋ฐ๊ธฐbrightness-0 ~ brightness-200์š”์†Œ ์ž์‹ ํ˜ธ๋ฒ„ ๋‹คํฌ ํšจ๊ณผ
์š”์†Œ ํ‘๋ฐฑgrayscale, grayscale-0์š”์†Œ ์ž์‹ ๋น„ํ™œ์„ฑ/๋งˆ๊ฐ ํ‘œ์‹œ
์š”์†Œ ๊ทธ๋ฆผ์ždrop-shadow-sm ~ drop-shadow-2xl์š”์†Œ์˜ ์‹ค์ œ ํ˜•ํƒœPNG/SVG ์ •ํ˜• ๊ทธ๋ฆผ์ž
๋ฐฐ๊ฒฝ ๋ธ”๋Ÿฌbackdrop-blur-sm ~ backdrop-blur-3xl์š”์†Œ ๋’ค ๋ฐฐ๊ฒฝGlassmorphism
๋ฐฐ๊ฒฝ ๋ฐ๊ธฐbackdrop-brightness-*์š”์†Œ ๋’ค ๋ฐฐ๊ฒฝ์˜ค๋ฒ„๋ ˆ์ด ๊นŠ์ด๊ฐ
์„ ํ˜• ๊ทธ๋ผ๋””์–ธํŠธbg-linear-to-* + from/via/to๋ฐฐ๊ฒฝ ์ƒ‰์ƒHero ์„น์…˜, ๋ฒ„ํŠผ
๋ฐฉ์‚ฌํ˜• ๊ทธ๋ผ๋””์–ธํŠธbg-radial๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์กฐ๋ช… ํšจ๊ณผ, ์•„์ด์ฝ˜
๊ทธ๋ผ๋””์–ธํŠธ ํ…์ŠคํŠธbg-clip-text + text-transparentํ…์ŠคํŠธํžˆ์–ด๋กœ ํƒ€์ดํ‹€
๋ธ”๋ Œ๋“œ ๋ชจ๋“œmix-blend-*๋ ˆ์ด์–ด ํ•ฉ์„ฑ์ด๋ฏธ์ง€ ์˜ค๋ฒ„๋ ˆ์ด

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ Hero ์„น์…˜์—์„œ ์˜์ˆ™์ด๊ฐ€ "๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์— backdrop-blur-xl์„ ์คฌ๋Š”๋ฐ ํšจ๊ณผ๊ฐ€ ์ „ํ˜€ ์•ˆ ๋ณด์—ฌ์š”!"๋ผ๊ณ  ํ–ˆ๋‹ค. ์›์ธ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ ๋†’์€ ๊ฒƒ์€?

โœ… ์ •๋‹ต: ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์˜ ๋ฐฐ๊ฒฝ์ƒ‰์ด ์™„์ „ ๋ถˆํˆฌ๋ช…(bg-white ๋“ฑ)์ด๊ฑฐ๋‚˜, ๋’ค์— ์‹ค์ œ ๋ฐฐ๊ฒฝ์ด ์—†์–ด์„œ

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: backdrop-filter: blur()๋Š” ์š”์†Œ ๋’ค์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌํ•ด. ๋งŒ์•ฝ ์š”์†Œ์˜ ๋ฐฐ๊ฒฝ์ด ์™„์ „ ๋ถˆํˆฌ๋ช…(bg-white)์ด๋ผ๋ฉด, ๋’ค์˜ ๋‚ด์šฉ์ด ์™„์ „ํžˆ ๊ฐ€๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋Ÿฌํ•  ๊ฒƒ ์ž์ฒด๊ฐ€ ์—†์–ด. Glassmorphism์€ ๋ฐ˜๋“œ์‹œ bg-white/10์ฒ˜๋Ÿผ ๋ฐ˜ํˆฌ๋ช…(alpha < 1) ๋ฐฐ๊ฒฝ๊ณผ ํ•จ๊ป˜ ์จ์•ผ ํ•ด.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "backdrop-blur ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์•„์„œ"๊ฐ€ ์•„๋‹ˆ์•ผ. backdrop-blur-sm๋„ 8px์ด๋ผ ์ถฉ๋ถ„ํžˆ ๋ณด์—ฌ. ํ•ต์‹ฌ์€ ๋ฐ˜ํˆฌ๋ช… ๋ฐฐ๊ฒฝ ์—ฌ๋ถ€์•ผ.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: Glassmorphism = ๋ฐ˜ํˆฌ๋ช… ๋ฐฐ๊ฒฝ(bg-white/10) + backdrop-blur-* + ๋’ค์— ๋ฐฐ๊ฒฝ ์กด์žฌ. ์ด 3๋ฐ•์ž๊ฐ€ ๋งž์•„์•ผ ํ•ด.

Q2. ์˜์ฒ ์ด๊ฐ€ ํˆฌ๋ช… PNG ๋กœ๊ณ  ์ด๋ฏธ์ง€์— ๊ทธ๋ฆผ์ž๋ฅผ ๋ถ™์ด๋ ค๊ณ  shadow-xl์„ ์ ์šฉํ–ˆ๋Š”๋ฐ, ๋กœ๊ณ  ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์–ด๋–ค ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์จ์•ผ ํ•˜๋Š”๊ฐ€?

โœ… ์ •๋‹ต: drop-shadow-xl

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: shadow-* (box-shadow)๋Š” CSS์˜ box-shadow ์†์„ฑ์œผ๋กœ, ์š”์†Œ์˜ ๋ฐ•์Šค ๋ชจ๋ธ(์‚ฌ๊ฐํ˜• ๊ฒฝ๊ณ„) ์— ๊ทธ๋ฆผ์ž๋ฅผ ์ ์šฉํ•ด. ์ด๋ฏธ์ง€ ๋‚ด๋ถ€๊ฐ€ ํˆฌ๋ช…ํ•ด๋„ ๊ทธ๋ฆผ์ž๋Š” ์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜์™€. ๋ฐ˜๋ฉด drop-shadow-* ๋Š” filter: drop-shadow()๋ฅผ ์‚ฌ์šฉํ•ด ์š”์†Œ์˜ ์‹ค์ œ ๋ถˆํˆฌ๋ช… ํ”ฝ์…€ ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ผ ๊ทธ๋ฆผ์ž๋ฅผ ์ƒ์„ฑํ•ด.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "๋” ํฐ shadow ๊ฐ’์„ ์“ฐ๋ฉด ๋œ๋‹ค" - ์ ˆ๋Œ€ ํ•ด๊ฒฐ ์•ˆ ๋จ. ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ CSS ์†์„ฑ์ด์•ผ.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: box-shadow = ๋ฐ•์Šค ํ˜•ํƒœ ๊ทธ๋ฆผ์ž / drop-shadow = ํ”ฝ์…€ ํ˜•ํƒœ ๊ทธ๋ฆผ์ž. PNG/SVG โ†’ drop-shadow, div/button โ†’ shadow ๊ฐ€ ๊ธฐ๋ณธ ์›์น™.

Q3. ์˜์ˆ™์ด๊ฐ€ "๋กœ๊ณ  ํ…์ŠคํŠธ์— ๋ณด๋ผ์ƒ‰์—์„œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ํ๋ฅด๋Š” ๊ทธ๋ผ๋””์–ธํŠธ ์ƒ‰์ƒ์„ ๋„ฃ๊ณ  ์‹ถ์–ด์š”"๋ผ๊ณ  ํ–ˆ๋‹ค. ์˜ํ˜ธ๊ฐ€ ์ž‘์„ฑํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋Š”?

โœ… ์ •๋‹ต:

<span class="bg-linear-to-r from-violet-500 to-blue-500 bg-clip-text text-transparent">
  ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ
</span>

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: Gradient Text๋Š” 3๋‹จ๊ณ„ ์กฐํ•ฉ์ด ํ•„์ˆ˜์•ผ. โ‘  bg-linear-to-r from-violet-500 to-blue-500์œผ๋กœ ๊ทธ๋ผ๋””์–ธํŠธ ๋ฐฐ๊ฒฝ์„ ๋งŒ๋“ค๊ณ , โ‘ก bg-clip-text๋กœ ๊ทธ ๋ฐฐ๊ฒฝ์„ ํ…์ŠคํŠธ ๋ชจ์–‘์œผ๋กœ ์ž๋ฅด๊ณ , โ‘ข text-transparent๋กœ ํ…์ŠคํŠธ ์ž์ฒด์˜ ์ƒ‰์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋””์–ธํŠธ๊ฐ€ ๋น„์น˜๊ฒŒ ํ•ด.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: text-violet-500์ฒ˜๋Ÿผ ๋‹จ์ˆœ text-* ์ปฌ๋Ÿฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋‹จ์ƒ‰๋งŒ ์ง€์›ํ•ด. ๊ทธ๋ผ๋””์–ธํŠธ ํ…์ŠคํŠธ๋Š” ๋ฐฐ๊ฒฝ ํŠธ๋ฆญ์„ ์จ์•ผ ํ•ด.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: Gradient Text = ๋ฐฐ๊ฒฝ์„ ๋งŒ๋“ค๊ณ  + ํ…์ŠคํŠธ ๋ชจ์–‘์œผ๋กœ ์ž๋ฅด๊ณ  + ํ…์ŠคํŠธ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ. ์ด ์ˆœ์„œ๊ฐ€ ํ•œ ์„ธํŠธ์•ผ.

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜ ์˜์ˆ™ ๋ˆ„๋‚˜๊ฐ€ ์š”์ฒญํ•œ "์œ ๋ฆฌ ํšจ๊ณผ ๋„ค๋น„๋ฐ”" ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—” Canvas API ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.
๋ฐฐ๊ฒฝ ํ”ฝ์…€์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฝ์–ด์„œ blur ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค๋Š” ๊ฒŒ ๋ญ”๊ฐ€ ์—„์ฒญ ํž˜๋“ค ๊ฒƒ ๊ฐ™์•„์„œ ๋ฌด์„œ์› ๋Š”๋ฐ...

์˜ํ˜ธ ํ˜•์ด backdrop-blur-md bg-white/10์ด๋ผ๋Š” ๋‹จ ๋‘ ํด๋ž˜์Šค๋ฅผ ๋ณด์—ฌ์คฌ์„ ๋•Œ ๋ง์น˜๋กœ ๋จธ๋ฆฌ๋ฅผ ์–ป์–ด๋งž์€ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

"ํ˜•... ์ด๊ฒŒ ๋‹ค์˜ˆ์š”?"
"์ด๊ฒŒ ๋‹ค์˜ˆ์š”."

๋ธŒ๋ผ์šฐ์ €๊ฐ€ GPU๋กœ ์ด๊ฑธ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ๋„, ๋‚ด๊ฐ€ ์งœ๋ ค๋˜ Canvas ์ฝ”๋“œ์˜ 1000๋ถ„์˜ 1์˜ ์„ฑ๋Šฅ์œผ๋กœ.
์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ: CSS๋Š” ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ•๋ ฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ํ˜ธ ํ˜•์€ ๋ฌด์„ญ๋‹ค.


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ