github-blog.png


โœ๏ธ Today I Learned


1. ๋‹ค์–‘ํ•œ CSS ์…€๋ ‰ํ„ฐ


h1 {  }  // ์…€๋ ‰ํ„ฐ
div {  }

* {  }  // ์ „์ฒด ์…€๋ ‰ํ„ฐ

section, h1 {  }  // ํƒœ๊ทธ ์…€๋ ‰ํ„ฐ

#only {  }  // ID ์…€๋ ‰ํ„ฐ

.center {  }  // class ์…€๋ ‰ํ„ฐ

a[href] { }  // attribute ์…€๋ ‰ํ„ฐ
p[id="only"] { }

header h1 {}  // ํ›„์† ์…€๋ ‰ํ„ฐ

header > p { }  // ์ž์‹ ์…€๋ ‰ํ„ฐ

section + p { }  // ์ธ์ ‘ ํ˜•์ œ ์…€๋ ‰ํ„ฐ

section ~ p { }  // ํ˜•์ œ ์…€๋ ‰ํ„ฐ

a:hover { }  // ๊ฐ€์ƒ ์…€๋ ‰ํ„ฐ
a:active { }

input:checked + span { }  // ์š”์†Œ ์ƒํƒœ ์…€๋ ‰ํ„ฐ
input:enabled + span { }

p:first-child { }  // ๊ตฌ์กฐ ๊ฐ€์ƒ ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ
ul > li:last-child { }

input:not([type="password"]) { } // ๋ถ€์ • ์…€๋ ‰ํ„ฐ
div:not(:nth-of-type(2)) { }

input[type="text"]:valid { }  // ์ •ํ•ฉ์„ฑ ํ™•์ธ ์…€๋ ‰ํ„ฐ
input[type="text"]:invalid { }


2-1 . CSS layout


์Šคํฌ๋ฆฐ์ƒท, 2021-08-03 10-54-00

<div id="container">
  <div class="col w10">
    <div class="icon">์•„์ด์ฝ˜ 1</div>
    <div class="icon">์•„์ด์ฝ˜ 2</div>
    <div class="icon">์•„์ด์ฝ˜ 3</div>
  </div>
  <div class="col w20">
    <div class="row h40">์˜์—ญ1</div>
    <div class="row h40">์˜์—ญ2</div>
    <div class="row h20">์˜์—ญ3</div>
  </div>
  <div class="col w70">
    <div class="row h80">์˜์—ญ4</div>
    <div class="row h20">์˜์—ญ5</div>
  </div>
</div>
.w70 {
  width: 70%;
}
.h40 {
  height: 40%;
}

* {
  // ๊ธฐ๋ณธ ์Šคํƒ€์ผ ์ œ๊ฑฐ (box-sizing)
  box-sizing: border-box;
}

body {
  // ๊ธฐ๋ณธ ์Šคํƒ€์ผ ์ œ๊ฑฐ (์—ฌ๋ฐฑ ์ œ๊ฑฐ)
  margin: 0;
  padding: 0;
}
  • ๋ฐ•์Šค์˜ ์‹œ์ž‘์„ ์ •ํ™•ํžˆ (0,0)์˜ ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์€๋ฐ, <body> ํƒœ๊ทธ๊ฐ€ ๊ฐ€์ง„ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์— ์•ฝ๊ฐ„์˜ ์—ฌ๋ฐฑ์„ ํฌํ•จํ•˜์ง€ ์•Š์•„ ๊ณ„์‚ฐ์— ์–ด๋ ค์›€์ด ์žˆ๋‹ค.

    ์œ„์— ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ ์šฉ์‹œํ‚ค๋ฉด, ๊ธฐ๋ณธ ์Šคํƒ€์ผ๋ง์„ ์ œ๊ฑฐํ•˜์—ฌ ๋””์ž์ธํ•œ ๋Œ€๋กœ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ตฌํ˜„์„ 1:1๋กœ ์ผ์น˜์‹œ์ผœ ์•„์ฃผ ์ž‘์€ ๋‹จ์œ„๋กœ CSS๋ฅผ ์ž‘์„ฑ ๊ธฐ๋ฒ•์„ Atomic CSS ๋ฐฉ๋ฒ•๋ก ์ด๋ผ๊ณ  ํ•œ๋‹ค.



2-2. CSS layout (flexbox)


  • flexbox๋กœ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€, ๋ฐ•์Šค๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์—ฌ ๋ ˆ์ด์•„์›ƒ์„ ์žก๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

    <div id="outer">
      <div class="box">box1</div>
      <div class="box">box2</div>
      <div class="box">box3</div>
    </div>
    #outer {
      display: flex;
      border: 1px dotted red;
      padding: 10px;
    }
    
    .box {
      border: 1px solid green;
      padding: 10px;
    }

์Šคํฌ๋ฆฐ์ƒท, 2021-08-03 11-34-39

  • ๋ถ€๋ชจ ๋ฐ•์Šค์š”์†Œ์— display: flex๋ฅผ ์ ์šฉํ•ด, ์ž์‹ ๋ฐ•์Šค์˜ ๋ฐฉํ–ฅ๊ณผ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ, display: flex๊ฐ€ ์ ์šฉ๋œ ๋ถ€๋ชจ ๋ฐ•์Šค์˜ ์ž์‹ ์š”์†Œ๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ด์–ด ๋ฐฐ์น˜๋œ๋‹ค.

  • ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋‘๊ธฐ: grow(ํŒฝ์ฐฝ ์ง€์ˆ˜), shrink(์ˆ˜์ถ• ์ง€์ˆ˜), basis(๊ธฐ๋ณธ ํฌ๊ธฐ)

    • ์ž์‹ ๋ฐ•์Šค์— ์–ด๋– ํ•œ ์†์„ฑ๋„ ์ฃผ์ง€ ์•Š์œผ๋ฉด, flex: 0 1 auto; ๊ธฐ๋ณธ๊ฐ’์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • grow, shrink ์†์„ฑ์€ ๋‹จ์œ„๊ฐ€ ์—†๊ณ , ๋น„์œจ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋ถ€๋ชจ ๋ฐ•์Šค ์•ˆ์— n๊ฐœ์˜ ์ž์‹ ๋ฐ•์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ฐ ์ž์‹ ๋ฐ•์Šค๊ฐ€ ๊ฐ–๋Š” grow๊ฐ’์˜ ์ด ํ•ฉ์ด n์ด๋ผ๋ฉด, grow ์†์„ฑ์˜ ๊ฐ’์„ 1๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ 1/n ๊ฐ€๋กœ ๋˜๋Š” ์„ธ๋กœ๊ธธ์ด๋ฅผ ์ ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.


<div id="outer">
  <div class="box target">.box.target</div>
  <div class="box">.box</div>
  <div class="box">.box</div>
</div>
.target {
  flex: 1 1 auto;
}

์Šคํฌ๋ฆฐ์ƒท, 2021-08-03 11-41-43


  • flex-grow : 1 ์ด๋‹ค. box.target์€ ๋ถ€๋ชจ ๋ฐ•์Šค์˜ ๊ฐ€๋กœ ๊ธธ์ด ์ค‘์—์„œ ๋‚จ์€ ๋นˆ ์˜์—ญ๋งŒํผ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ์œ„ ์„ค๋ช…๋Œ€๋กœ๋ผ๋ฉด ์ „์ฒด ์ž์‹์š”์†Œ๊ฐ€ ๊ฐ€์ง„ grow ๊ฐ’์˜ ํ•ฉ์€ 1+0+0 = 1์ด๋ฏ€๋กœ, box.target์˜ ๊ฐ€๋กœ ํฌ๊ธฐ๋Š” 1/1 = 100% ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ž์‹ ๋ฐ•์Šค ์•ˆ์— ์ด๋ฏธ ์ฝ˜ํ…์ธ ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ์ž์‹ ๋ฐ•์Šค์•ˆ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‹ด๊ธด ๊ธธ์ด๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ box.target์˜ ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ ๋œ๋‹ค.
.target {
  flex: 1 1 auto;
}

.box {
  flex: 1 1 auto;
}
  • ๋งŒ์•ฝ .box์˜ flex-grow : 1๋กœ ์„ค์ •ํ•˜๋ฉด, ๋ชจ๋“  ๋ฐ•์Šค๊ฐ€ ๋Š˜์–ด๋‚˜๋ ค๊ณ (grow) ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ๋ฐ•์Šค๊ฐ€ ๋™์ผํ•œ ๋น„์œจ๋กœ ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. (์ด grow ๊ฐ’ 1+1+1, ๊ฐ ๋ฐ•์Šค๋Š” 1/3์”ฉ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง)

    ์Šคํฌ๋ฆฐ์ƒท, 2021-08-03 11-49-27


  • shrink๋Š” grow์™€ ๋ฐ˜๋Œ€๋กœ, ์„ค์ •ํ•œ ๋น„์œจ๋งŒํผ ๋ฐ•์Šค ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง„๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ flex-grow ์†์„ฑ๊ณผ flex-shrink ์†์„ฑ์„ ํ•จ๊ป˜ ์‚ฌ์šฉ์‹œ flex-shrink ์†์„ฑ์€ width๋‚˜ ์ดํ›„ ์„ค๋ช…ํ•  flex-basis ์†์„ฑ์— ๋”ฐ๋ฅธ ๋น„์œจ์ด๋ฏ€๋กœ ์‹ค์ œ ํฌ๊ธฐ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค. flex-grow ์†์„ฑ์œผ๋กœ ๋น„์œจ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ, flex-shrink ์†์„ฑ์€ ๊ธฐ๋ณธ๊ฐ’์ธ 1๋กœ ๋‘์–ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

  • basis๋Š” ์ž์‹๋ฐ•์Šค๊ฐ€ flex-grow๋‚˜ flex-shrink์— ์˜ํ•ด ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ์ค„์–ด๋“ค๊ธฐ ์ „์— ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ ํฌ๊ธฐ์ด๋‹ค.



2-3. CSS layout (flexbox ์ฝ˜ํ…์ธ  ์ •๋ ฌ ๋ฐฉ๋ฒ•)


  • Flexbox๋ฅผ ์›ํ•˜๋Š”๋Œ€๋กœ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” axis(์ถ•)์˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. axis๋Š” main axis ์™€ cross axis๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
    • main axis๋Š” flex-direction ์†์„ฑ์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋œ๋‹ค. flex-direction์˜ ๊ธฐ๋ณธ ๊ฐ’์ธ row ์ธ ์ƒํƒœ์ผ ๋•Œ main axis ๋Š” ๊ฐ€๋กœ์ถ•(๊ฐ€๋กœ์ถ•์ด default)์ด ๋œ๋‹ค.
    • cross axis๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ main axis์™€ ์ˆ˜์ง์„ ์ด๋ฃจ๋Š” ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค. main axis๊ฐ€ ๊ฐ€๋กœ์ผ ๋•Œ cross axis๋Š” ์„ธ๋กœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท, 2021-08-03 10-54-00

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์˜ layout์„ flexbox ๋ฐฉ์‹์œผ๋กœ CSS๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž
* {
  margin: 0;
  padding: 0;
  font-size: large;
  box-sizing: border-box;
}

#container {
  display: flex;
  margin: 0.4rem;
  padding: 0.4rem;
  min-height: 100vh;
}

.col {
  display: flex;
  flex-direction: column;
  margin: 0.4rem;
  padding: 0.4rem;
  border: 1px solid red;
}

.icon {
  margin: 0.4rem;
  padding: 0.4rem;
  border: 1px dashed orange;
}

.row {
  margin: 0.4rem;
  padding: 0.4rem;
  border: 1px dashed purple;
}

.w10 {
  flex: 1 0 0;
}

.w20 {
  flex: 2 0 0;
}

.w70 {
  flex: 7 0 0;
}

.h20 {
  flex: 2 0 0;
}

.h40 {
  flex: 4 0 0;
}

.h80 {
  flex: 8 0 0;
}


3. HTML/CSS ๋ชฉ์—… ์™€์ด์–ดํ”„๋ ˆ์ž„ ์‹ค์Šต




๐Ÿค” Understanding

  • CSS ์ง„์งœ๋กœ ๋„ˆ๋ฌด๋„ˆ๋ฌด๋„ˆ๋ฌด ์–ด๋ ต๋‹ค.

    ์šฐ์„  ์˜ค๋Š˜ ์‹ค์Šต์„ ํ•ด๋ณด๋ฉฐ HTML์„ ์ด์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„์„์งœ๊ณ , ๊ทธ ๊ฐ๊ฐ์˜ ํ”„๋ ˆ์ž„์„ ์„ ํƒ์ž๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ CSS๋ฅผ ์ž…ํ˜€๋ณด์•˜๋‹ค.

    ์šฐ์„  ๋‹ต์ด ์—†๋Š” ์˜์—ญ์ด๋‹ค. HTML๋กœ ํ•ด๋‹น ๊ตฌ์„ฑ์˜ ํ”„๋ ˆ์ž„์„ ์งœ๋Š”๊ฑฐ๊นŒ์ง€๋Š” ์–ด๋ ต์ง€์•Š์•˜์ง€๋งŒ ๊ฐ ์„ ํƒ์ž์— ๋“ค์–ด๊ฐ€๋Š” CSS ์š”์†Œ๋“ค์„ ์šฐ์„  ๋„ˆ๋ฌด ๋ชจ๋ฅธ๋‹ค.. ๋ชฐ๋ผ๋„ ๋„ˆ๋ฌด ๋ชฐ๋ผ์„œ ๊ฒ€์ƒ‰์กฐ์ฐจ ๋ชปํ•˜๋Š” ๋‹จ๊ณ„๋ž„๊นŒ..??

    ๋‚˜์•„์ง€๊ฒ ์ง€.. ์šฐ์„  ํ‹€์„ ์งœ๊ณ  ์„ ํƒ์ž๋กœ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ปจํƒํ•œ๋‹ค๋Š” ์ ์—์„œ ๋งŒ์กฑํ•˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ CSS๋Š” ๊พธ์ค€ํžˆ..์†์— ์ตํ˜€๋ด์•ผ๊ฒ ๋‹ค. (๋‚˜์ค‘์—” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์“ฐ๊ฒ ์ง€โ€ฆ)

  • git repository์™€ ๋‚ด local directory ๋ฅผ ์˜ค๋Š˜ ๋™๊ธฐํ™”(?) ์‹œ์ผœ๋ณด์•˜๋‹ค.

    ์ˆ˜์—…์„ ๋“ค์œผ๋ฉฐ ์ง„ํ–‰ํ•˜๋Š” ์˜ˆ์ œ๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด์„œ ์žก๋‹คํ•œ(?) repository ๋ฐ.. ๋ถˆํ•„์š”ํ•œ fork ๋œ repository ๊ฐ€ ๋„ˆ๋ฌด ๋Š˜์—ˆ๋‹ค.

    git repository๋ฅผ ๋œฏ์–ด๊ณ ์ณ์„œ ๋‚ด ์ž‘์—…๊ณต๊ฐ„๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์…‹ํŒ…์„ ํ•ด๋†“์•˜๋‹ค.

    ์Šคํฌ๋ฆฐ์ƒท, 2021-08-04 00-52-18

    ๋‚ด ์ž‘์—…ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ git repository ์œ ์ง€๊ฐ€ ํ•„์š”ํ•  ๋“ฏ ํ•˜๋‹ค. ์•ž์œผ๋กœ ์ ์ฐจ ๋Š˜์–ด๊ฐˆ ํ”„๋กœ์ ํŠธ ๋ฐ ์‹ค์Šต ๋ฐ์ดํ„ฐ๋“ค์„ ๊ด€๋ฆฌ ์œ ์ง€ํ•˜๋Š”๊ฒƒ๋„ ์ž๊ธฐ๊ด€๋ฆฌ๋ผ ์ƒ๊ฐํ•ด์•ผ๊ฒ ๋‹ค.