[๐Ÿฆ TIL 20์ผ์ฐจ] 6์›” 22์ผ

๊ทผ๋“€ยท2023๋…„ 6์›” 22์ผ
0

ํ”„๋ก ํŠธ์—”๋“œ์Šค์ฟจ TIL

๋ชฉ๋ก ๋ณด๊ธฐ
20/30
post-thumbnail

1. Tailwind CSS

  • ํ”„๋ฆฌ ๋นŒํŠธ์ธ (Pre Built-in) ์ปดํฌ๋„ŒํŠธ
    ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ์žˆ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜

  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜(Utility-first)
    ํ•˜๋‚˜ํ•˜๋‚˜ ํด๋ž˜์Šค ์กฐ๊ฐ(์œ ํ‹ธ๋ฆฌํ‹ฐ)์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

๐Ÿ“Œ ํŠน์ง•

  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ํผ์ŠคํŠธ(Utility-first) CSS Framework
  • ์œ ์ง€ ๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋‹ค.
  • ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ํ˜‘์—…์— ์žˆ์–ด์„œ๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

2. ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ์„ค์ •

1. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๊น”๊ธฐ

  • Tailwind CSS IntelliSense

2. ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ๋นŒ๋“œ

  • touch src/index.html src/css/input.css
  • Tailwind ํŒŒ์ผ ์ด๋ฆ„์€ input.css ๋กœ ํ•ด์•ผํ•œ๋‹ค.

3. ํŒจํ‚ค์ง€ ๊น”๊ธฐ

  • npm install -D tailwindcss
  • -D ๊ฐœ๋ฐœ ์˜์กด ๋ชจ๋“œ(๋ฐ๋ธŒ ๋””ํŽœ๋” ์‹œ์Šค)

4. ์ถ”๊ฐ€ ํŒจํ‚ค์ง€ ๊น”๊ธฐ

  • npm i -D live-server npm-run-all postcss-cli@latest

5. Tailwind CSS ์ดˆ๊ธฐํ™” ์‹œํ‚ค๊ธฐ

  • npx tailwindcss init -p
  • -p postcss.config.js ๊นŒ์ง€ ๊ฐ™์ด ๊น”๋ฆฌ๋Š” ๋ช…๋ น์–ด
  • package-lock.json package.json postcss.config.js tailwind.config.js ๊น”๋ฆฐ ๊ฒƒ ํ™•์ธ!
  • ๋งŒ์•ฝ ์œ„์˜ 4๊ฐœ๊ฐ€ ์•ˆ๊น”๋ฆฌ๋ฉด npm init -y ํ•˜๊ณ  ๋‹ค์‹œ 3๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ

6. tailwind.config.js ํŒŒ์ผ ์ˆ˜์ •

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js}"],
  theme: {
    extend: {},
  },
  plugins: [],
}
  • content: ["./src/**/*.{html,js}"]

โ†’ ํ˜„์žฌ ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ src ํด๋”๋กœ ๋„˜์–ด๊ฐ„ ํ›„ ํ˜น์‹œ ๋ชจ๋ฅผ ํด๋” ๋•Œ๋ฌธ์— ** ๋” ์•ˆ์— ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ ๋‹ค์Œ ํ™•์žฅ์ž html ๋˜๋Š” js ๋ฅผ ์ฐพ์•„๋ผ

7. input.css ํŒŒ์ผ ์ˆ˜์ •

@tailwind base;
@tailwind components;
@tailwind utilities;
  • ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ

8. package.json ์— ๋‹จ์ถ•ํ‚ค ๋“ฑ๋ก

"scripts": {
    "start": "run-p server watch",
    "tailwind": "tailwindcss -i ./src/css/input.css -o ./src/css/output.css",
    "watch": "npm run tailwind -- --watch",
    "server": "live-server ./src"
  },
  • "tailwind" : "tailwindcss -i ./src/css/input.css -o ./src/css/output.cssโ€
    • -i ํ˜„์žฌํด๋”/ํŒŒ์ผ -o ๋‚ด๋ณด๋‚ผํด๋”/ํŒŒ์ผ
    • -i input
    • -o output

9. โš™๏ธ(๊ด€๋ฆฌ) โ†’ ์„ค์ • โ†’ tailwind ๊ฒ€์ƒ‰ โ†’ settings.json ํŒŒ์ผ ์„ ํƒ

๐Ÿ”ป ๋งจ ๋งˆ์ง€๋ง‰ ์ค„์— ์ถ”๊ฐ€ํ•˜๊ธฐ

"files.associations": {
    // "*.css": "tailwindcss",
    "*html": "html",
    "*css": "css"
  },
  "editor.quickSuggestions": {
    "strings": true
  },
  "tailwindCSS.includeLanguages": {
    "plaintext": "html",
    "postcss": "css"
  },

10. index.html ์‹œ์ž‘ํ•˜๊ธฐ

  • <link rel="stylesheet" href="./css/output.css" /> ์—ฐ๊ฒฐ

3. ์—ฐ์Šต

โœ”๏ธ top-1 = 4px , 4px์ด ๊ธฐ์ค€!!

โœ”๏ธ bg-gray-200 ์ด๊ฑด tailwind ๊ธฐ๋ณธ ์œ ํ‹ธ๋ฆฌํ‹ฐ

โœ”๏ธ bg-gray3 ์ด๊ฑด ๋‚ด๊ฐ€ tailwind.config.js์—์„œ ์ปค์Šคํ…€ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ

โœ”๏ธ md: @midea-query

โœ”๏ธ darkMode: "class"

  • media๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐ ์šด์˜์ฒด์ œ์˜ ์„ค์ •์œผ๋กœ ์ „ํ™˜ํ•ด์•ผํ•œ๋‹ค.
  • class๋กœ ์„ค์ •ํ•˜๋ฉด classname ์†์„ฑ์œผ๋กœ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ”๏ธ underline ๋ฐ‘์ค„

โœ”๏ธ sr-only

  • .a11y ๊ฐ™์€ ์ ‘๊ทผ์„ฑ ๊ด€๋ จ ์†์„ฑ์ด๋‹ค.
  • sr-only ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์ด๋ ‡๋‹ค.
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
  • clip: rect(0, 0, 0, 0); ์ด๊ฑด ๊ตฌํ˜• ๋ฒ„์ „

  • clip-path: (50%) ์‹ ํ˜• ๋ฒ„์ „

  • input.css โ†’ ์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น์–ด ๋‹จ์ถ•ํ‚ค ์„ค์ •

.ํด๋ž˜์Šค๋ช…{
  @apply ;
}

โœ”๏ธ appearance

  • none : ๋ธŒ๋ผ์šฐ์ € ์—์ด์ „ํŠธ ์Šคํƒ€์ผ ์—†์•ค๋‹ค. ๋ˆˆ์— ๋ณด์ด์ง€๋งŒ ์•Š์„ ๋ฟ ์š”์†Œ๋Š” ์กด์žฌํ•œ๋‹ค.

4. ํšŒ๊ณ 

์˜ค๋Š˜์€ Tailwind์˜ ๊ธฐ์ดˆ๋ฅผ ๊ฐ€๋ณ๊ฒŒ ๋ฐฐ์› ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ฐ€๋…์„ฑ๋•Œ๋ฌธ์— ๋ณ„๋กœ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋ฐฐ์šฐ๋ฉด ๋ฐฐ์šธ ์ˆ˜๋ก ๋น ๋ฅด๊ฒŒ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์ •๋ง ์ปธ๋‹ค. ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ์ง€๋‚˜๊ฐˆ ์ •๋„๋กœ ์žฌ๋ฏธ์žˆ์—ˆ๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜๊ณ ๋‚˜๋ฉด Tailwind๋กœ ํŽ˜์ด์ง€๋ฅผ ํ•œ๋ฒˆ ์ œ์ž‘ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋“ค์„ ๋น ๋ฅด๊ฒŒ ์ตํžˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—ญ์‹œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋งŽ์ด ์ณ๋ณด๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค. Sass๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ๊ฒƒ..๐Ÿ’ฌ
์˜ค๋Š˜์ด HTML/CSS ์Šฌ๋น„์Œค๊ณผ์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์—…์ด์˜€๋Š”๋ฐ ๋„ˆ๋ฌด ์•„์‰ฌ์› ๋‹ค. ์•„์ง ๋‚œ ๋ฐฐ์šธ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€๋ฐ ๋ฒŒ์จ ๋์ด ๋‚˜๋‹ค๋‹ˆใ… ใ…  ์Šฌ๋น„์Œค ๋•๋ถ„์— ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ๋Š๊ผˆ๋˜ ํ•œ๋‹ฌ์ด์˜€๋‹ค. ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„๋™์•ˆ ๋‹ด๋‹น ๊ฐ•์‚ฌ๋‹˜์ด์…”์„œ ๊ณ„์† ๋ชจ๋ฅด๋Š”๊ฒŒ ์žˆ์œผ๋ฉด ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ œ ์ˆ˜์—…์ด ์—†๋‹ค๋Š”๊ฒŒ ๋„ˆ๋ฌด๋„ˆ๋ฌด ์•„์‰ฝ๋‹คใ… ใ… ใ… ใ…  ํ•œ๋‹ฌ์ด ์ด๋ ‡๊ฒŒ ๊ธˆ๋ฐฉ๊ฐ€๋‹ค๋‹ˆ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ

ํ”„๋กœ์ ํŠธ ์‹œ์•ˆ์ด ๋‚˜์™”๋Š”๋ฐ 4๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋ฐ˜์‘ํ˜•, ๊ณ ์ •ํ˜•, ๋ชจ๋ฐ”์ผ์šฉ, ๋ฐ์Šคํฌํƒ‘์šฉ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์‹œ์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐ๋๋‹ค. ๊ทธ ์ค‘ ํŒ€์›๋“ค๊ณผ ํšŒ์˜ ๋์— ์ •ํ•œ ์‹œ์•ˆ์€ ๋งˆ์ผ“์ปฌ๋ฆฌ์‹œ์•ˆ๐Ÿ›’ ํ•œํŽธ์œผ๋กœ๋Š” ์ด๋“ฌํŽ˜์ด์ง€๋ฅผ ํ•˜๊ณ ์‹ถ์—ˆ์ง€๋งŒ ํŒ€์›๋“ค๊ณผ์˜ ๋Œ€ํ™” ์ค‘ ๋Š๋‚€ ์ ์€ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์‹ค๋ ฅ์ด ๋’ค์ณ์ง„๋‹ค๋Š” ๊ฒƒ์ด์˜€๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ดœํžˆ ๊ณต๋ถ€ํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ์–ด๋ ค์šด ์‹œ์•ˆ ๊ณ ๋ฅด๋ฉด ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ๋ฏผํ๊ฐ€ ๋  ๊ฒƒ๊ฐ™์•„์„œ ์˜๊ฒฌ์„ ๋‚ด์ง€๋Š” ์•Š์•˜๋‹ค. ๋งˆ์ผ“์ปฌ๋ฆฌ ์‹œ์•ˆ๋„ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—!! ๋‹ค๋“ค ๋‚ฏ์„ ๋งŽ์ด ๊ฐ€๋ฆฌ์…”์„œ ์กฐ์žฅ๋ถ„๊ป˜์„œ ์—ญํ• ์„ ์ •ํ•ด์ฃผ์…จ๋‹ค. ๋‚˜๋Š” ๋ฉ”์ธ๋ถ€๋ถ„์ด์˜€๋Š”๋ฐ ์‰ฌ์›Œ๋ณด์ด๋Š” ๋“ฏ ์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์šด ๊ฒƒ๋“ค์ด ๋งŽ์•„๋ณด์˜€๋‹ค. ๋‚ด์ผ๋ถ€ํ„ฐ ์‹œ์ž‘์ธ๋ฐ ๋ฏผํ๊ฐ€ ๋˜์ง€ ์•Š๊ฒŒ ์ •๋ง ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ๋‹ค! ๋ฌด์ž„์Šน์ฐจ๋Š” ์ ˆ๋Œ€ ์•ˆํ• ๊บผ์ง€๋งŒ ๋ฒ„์Šค๋ฅผ ํƒ€๊ฒŒ ๋  ๊ฒƒ๊ฐ™์€ ์ด ๊ธฐ๋ถ„์€ ๋ญ˜๊นŒ๐Ÿ˜“ ์ฒซ ํ”„๋กœ์ ํŠธ์ด๋‹ˆ ์†Œํ†ต๋„ ์—ด์‹ฌํžˆ ํ•˜๊ณ  ์ข‹์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ด์•ผ์ง€๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ

๋‚ด์ผ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ ๋๋‚  ๋•Œ๊นŒ์ง€๋Š” TIL์„ ์ž‘์„ฑํ•  ์ผ์ด ์—†์„ ๋“ฏํ•˜๋‹ค.
๋Œ€์‹  ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ด์Šˆ๊ฐ™์€๊ฑฐ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ทจ์ค€์ƒ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€