๐Ÿฆ_21.11.12 TIL

Boriยท2021๋…„ 11์›” 13์ผ
0
post-thumbnail

21๋…„ 11์›” 12์ผ

๐Ÿ“ CSS

๐Ÿ“Ž ํ•จ๊ป˜ ์ฝ”๋“œ ์ž‘์„ฑ - ๋ฐ˜์‘ํ˜• ์›น ๊ตฌํ˜„

1๋งŒ ์‹œ๊ฐ„์˜ ๋ฒ•์น™

๐Ÿ“Ž CSS ์„ค๊ณ„ ๊ธฐ๋ฒ•

OOCSS(Object Oriented CSS)

์ฐธ๊ณ  ๋งํฌ

  • Two main principles
  1. Separate Structure and Skin
  2. Separate Container and Content
  • 10 best practices
  1. Create a component
  2. Use consistent semantic styles
  3. Design modules to be transparent on the inside
  4. Be flexible
  5. Learn to love grids
  6. Minimize selectors
  7. Separate structure and skin
  8. Separate container and content
  9. Extend objects by applying multiple classes to an element
  10. Use reset and fonts from YUI
  • ๊ฐœ๋… : ๋ ˆ๊ณ ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ์กฐํ•ฉํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก 
  • ๊ตฌ์กฐ์™€ ์Šคํ‚จ์˜ ๋ถ„๋ฆฌ
    ๊ฐ™์€ ํ˜•ํƒœ์˜ UI์— ์Šคํ‚จ๋งŒ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ตฌ์กฐ์™€ ์Šคํ‚จ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์กฐํ•ฉ
    • ๊ตฌ์กฐ : ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์†์„ฑ
      => width, height, padding, margin ๋“ฑ
    • ์Šคํ‚จ : ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ ์‹œ๊ฐ์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๋Š” ์†์„ฑ
      => font ๊ด€๋ จ ์†์„ฑ, color, background, border ๋“ฑ
  • ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์ฝ˜ํ…์ธ ์˜ ๋ถ„๋ฆฌ
    ์ฝ˜ํ…์ธ ์˜ ์Šคํƒ€์ผ์ด ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ์ฆ‰, ์ฝ˜ํ…์ธ ์˜ ์Šคํƒ€์ผ ์„ ํƒ์ž์— ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํด๋ž˜์Šค๋ฅผ ๋ฐฐ์ œํ•œ๋‹ค.

SMACSS(Scalable and Modular Architectyre for CSS)

์ฐธ๊ณ  ๋งํฌ

  • ๊ฐœ๋… : CSS ์ฝ”๋“œ๋ฅผ ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ
    • Base
    • Layout
    • Module
    • State
    • Theme
  • Base : ๊ธฐ๋ณธ ์Šคํƒ€์ผ ์ •์˜
    => ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” font-family, font-size, reset style, <img> ๊ณตํ†ต ์Šคํƒ€์ผ ๋“ฑ
/* Examples of Base styles */
  html, body, form { 
    margin: 0; 
    padding: 0; 
  }
  input[type=text] { 
    border: 1px solid #999; 
  }
  a { 
    color: #039; 
  }
  a:hover { 
    color: #03C; 
  }
  • Layout : header, main area, footer, side bar์™€ ๊ฐ™์€ ์›น ์‚ฌ์ดํŠธ์—์„œ ํฐ ํ‹€์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“ˆ์— ๊ด€ํ•œ ๊ทœ์น™
    header, footer ์™€ ๊ฐ™์€ ์ฃผ์š” ๋ ˆ์ด์•„์›ƒ์—๋Š” id ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ๋งํ•˜์ง€๋งŒ, ํŽ˜์ด์ง€์˜ ๊ตฌ์„ฑ์š”์†Œ์— ๋”ฐ๋ผ class ์„ ํƒ์ž๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  #header, #article, #footer {
    width: 960px;
    margin: auto;
  }

  #article {
    border: solid #CCC;
    border-width: 1px 0 0;
  }
  • Module : ๋ ˆ์ด์•„์›ƒ ์•ˆ์— ๋ฐฐ์น˜๋˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์˜๋ฏธ.
    ๋ฐ˜๋ณต๋˜๋Š”(์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ) ์š”์†Œ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— id์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์š”์†Œ ์„ ํƒ์ž ์‚ฌ์šฉ์„ ์ตœ์†Œํ™” ํ•œ๋‹ค.
    => ์š”์†Œ ์„ ํƒ์ž๋Š” ์ž์‹ ์š”์†Œ์—๋งŒ ์ ์šฉ
    ๋น„์Šทํ•œ ๋ชจ๋“ˆ ์•ˆ์—์„œ๋„ ๋ชจ์–‘์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, sub-class๋ฅผ ๋งŒ๋“ ๋‹ค
    => btn-small, btn-long ๋“ฑ

  • State : ํŠน์ • ์ƒํƒœ์— ์žˆ์„ ๋•Œ ๋ชจ๋“ˆ ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ์ด ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•
    => ์ˆจ๊ฒจ์ ธ ์žˆ๊ฑฐ๋‚˜, ํ™•์žฅ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ƒํƒœ ๋“ฑ
    ๊ธฐ์กด ์Šคํƒ€์ผ์„ ๋ฎ์–ด์“ฐ๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

    • sub-class์™€ ๋‹ค๋ฅธ ์  : ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ๋ชจ๋“ˆ์— ๋‘˜ ๋‹ค ์ ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
      sub-class๋Š” ํ•œ ๋ฒˆ ์ ์šฉ๋˜๋ฉด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์†์„ฑ
      state๋Š” Javascript๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ ๋„ฃ๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๋‹ค.
    • ํด๋ž˜์Šค ์ด๋ฆ„ ์•ž์— is๋ผ๋Š” ์ ‘๋‘์‚ฌ ์‚ฌ์šฉ
      => is-hidden, is-active ๋“ฑ
  .tab {
    background-color: purple;
    color: white;
  }

  .is-tab-active {
    background-color: white;
    color: black;
  }
  • Theme : ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์‚ฌ์ดํŠธ์˜ ๋Š๋‚Œ์„ ์ „๋‹ฌํ•˜๋Š” ์ด๋ฏธ์ง€(background-image), ์ƒ‰์ƒ(background-color, color) ๋“ฑ์„ ์˜๋ฏธ
  /* in module-name.css */
  .mod {
    border: 1px solid;
  }

  /* in theme.css */
  .mod {
    border-color: blue;
  }

BEM(Block, Element, Modifier)

์ฐธ๊ณ  ๋งํฌ

  • ๊ฐœ๋… : ์–€๋ฑ์Šค(Yandex)์‚ฌ๊ฐ€ ๋งŒ๋“  ์„ค๊ณ„ ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ OOCSS์™€ ๊ฐ™์€ ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ๋ฐฉ๋ฒ•์„ ๊ธฐ์ดˆ๋กœ ํ•œ๋‹ค.

  • ๊ธฐ๋ณธ ๊ทœ์น™ : id์„ ํƒ์ž์™€ ์š”์†Œ ์„ ํƒ์ž๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
    => class ์„ ํƒ์ž๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  : ๊ฐ€์ค‘์น˜ ๊ณ„์‚ฐ์„ ์›ํ™œํžˆ ํ•˜๊ธฐ ์œ„ํ•ด (z-index๋ฅผ 10๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.)

  • Block

    • ์–ด๋””์—์„œ๋‚˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ถ€ํ’ˆ์„ ์˜๋ฏธ
    • class ๋„ค์ด๋ฐ์€ ๋ชฉ์ ์ด ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค
      => error, hidden ๋“ฑ
    • ์†Œ๋ฌธ์ž ์‚ฌ์šฉ, ์—ฌ๋Ÿฌ ๋‹จ์–ด๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ ์ผ€๋ฐฅ์ผ€์ด์Šค ์‚ฌ์šฉ
  • Element

    • block์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ, block์— ์ข…์†๋˜์–ด์•ผ ํ•œ๋‹ค.
    • block์˜ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ƒ์†๋ฐ›์•„ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•˜๊ณ , element์˜ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ์–ธ๋”๋ฐ” ๋‘ ๊ฐœ๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ
      => block__element
    • element ์•ˆ์— ๋˜ element๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋„ค์ด๋ฐ์€ element๋ผ๋ฆฌ ์ค‘์ฒฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
      => opacity-half__btn__txt ( X ) / opacity-half__txt ( O )
  • Modifier

    • block์ด๋‚˜ element์˜ ๋ชจ์Šต/์ƒํƒœ/์›€์ง์ž„์„ ์ •์˜
      => ์š”์†Œ์˜ ํ™œ์„ฑ ์ƒํƒœ, ์‚ฌ์ด์ฆˆ, ์ปฌ๋Ÿฌ ๋“ฑ
    • ๋‹จ๋…์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋‘ ๋ฒˆ์žฌ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ
  <div class="block block--mod">...</div>
      <div class="block block--size-big block--shadow-yes">...</div>
  /* Use modifier class name as selector: */
  .block--hidden { }

  /* To alter elements based on a block-level modifier */
  .block--mod .block__elem { }

  /* Element modifier */
  .block__elem--mod { }

๐Ÿ“Ž ๊ณผ์ œ - ๋กœ๊ทธ์ธ ํ™”๋ฉด

์œ„๋‹ˆ๋ธŒ ๋กœ๊ทธ์ธ ํ™”๋ฉด


๋งˆ๋ฌด๋ฆฌ

  • ์ˆ˜์—… ์ค‘๊ฐ„์— ์–ด์ฉŒ๋‹ค๊ฐ€ ์ทจ์—…์„ค๋ช…ํšŒ? ๊ฐ™์€ ์„ธ์…˜์ด ์ง„ํ–‰๋˜์—ˆ๋Š”๋ฐ ๊ฟ€ํŒ๋“ค์ด ์™€๋ฅด๋ฅด
    => ์ค์ค
  • ์ˆ˜์—…์ด ๋๋‚˜๊ณ  ์šด์˜๋งค๋‹ˆ์ €๋‹˜๊ป˜์„œ ํ˜„์žฌ ๊ต์œก 2์ฃผ์ฐจ๊ฐ€ ์ง€๋‚˜๊ฐ€๋ฉฐ ๋„ˆ๋ฌด ๋‹ฌ๋ฆฌ๊ณ ๋งŒ ์žˆ๋Š”๊ฑด ์•„๋‹Œ์ง€ ๊ฑฑ์ •์Šค๋Ÿฐ ๊ธ€๊ณผ ํ•จ๊ป˜ ์ด๋ฒˆ ์ฃผ๋ง์€ ์ž ์‹œ ํœด์‹์€ ์ทจํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์ฃผ์…จ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„๊นŒ์ง€ ์ฑ™๊ฒจ์ฃผ์‹œ๋‹ˆ ๊ณต๋ถ€๋ฅผ ๋” ์—ด์‹ฌํžˆ ํ•  ์ˆ˜ ๋ฐ–์—!!
    => ๊ทธ๋ฆฌ๊ณ  ์ผ์ฐ ์žค๋‹ค๊ณ  ํ•œ๋‹ค

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