๋ค์ํ CSS ์ ๋ ํฐ, CSS layout, HTML/CSS ๋ชฉ์ ์์ด์ดํ๋ ์ ์ค์ต
โ๏ธ 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
<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; }
-
๋ถ๋ชจ ๋ฐ์ค์์์ 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;
}
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์ฉ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง)
-
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๋ ์ธ๋ก๊ฐ ๋ฉ๋๋ค.
- ๊ทธ๋ ๋ค๋ฉด ์์ 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 ๋ชฉ์ ์์ด์ดํ๋ ์ ์ค์ต
- ์ค์ต๊ฒฐ๊ณผ ์ฝ๋๋ GitHub ์ฐธ์กฐ.
๐ค Understanding
-
CSS ์ง์ง๋ก ๋๋ฌด๋๋ฌด๋๋ฌด ์ด๋ ต๋ค.
์ฐ์ ์ค๋ ์ค์ต์ ํด๋ณด๋ฉฐ HTML์ ์ด์ฉํ์ฌ ํ๋ ์์์ง๊ณ , ๊ทธ ๊ฐ๊ฐ์ ํ๋ ์์ ์ ํ์๋ก ๊ตฌ๋ถํ์ฌ CSS๋ฅผ ์ ํ๋ณด์๋ค.
์ฐ์ ๋ต์ด ์๋ ์์ญ์ด๋ค. HTML๋ก ํด๋น ๊ตฌ์ฑ์ ํ๋ ์์ ์ง๋๊ฑฐ๊น์ง๋ ์ด๋ ต์ง์์์ง๋ง ๊ฐ ์ ํ์์ ๋ค์ด๊ฐ๋ CSS ์์๋ค์ ์ฐ์ ๋๋ฌด ๋ชจ๋ฅธ๋ค.. ๋ชฐ๋ผ๋ ๋๋ฌด ๋ชฐ๋ผ์ ๊ฒ์์กฐ์ฐจ ๋ชปํ๋ ๋จ๊ณ๋๊น..??
๋์์ง๊ฒ ์ง.. ์ฐ์ ํ์ ์ง๊ณ ์ ํ์๋ก ํด๋น ์์๋ฅผ ์ปจํํ๋ค๋ ์ ์์ ๋ง์กฑํ๊ณ ๋์ค์ ๋ค์ CSS๋ ๊พธ์คํ..์์ ์ตํ๋ด์ผ๊ฒ ๋ค.
(๋์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๊ฒ ์งโฆ) -
git repository์ ๋ด local directory ๋ฅผ ์ค๋ ๋๊ธฐํ(?) ์์ผ๋ณด์๋ค.
์์ ์ ๋ค์ผ๋ฉฐ ์งํํ๋ ์์ ๊ฐ ๋์ด๋๋ฉด์ ์ก๋คํ(?) repository ๋ฐ.. ๋ถํ์ํ fork ๋ repository ๊ฐ ๋๋ฌด ๋์๋ค.
git repository๋ฅผ ๋ฏ์ด๊ณ ์ณ์ ๋ด ์์ ๊ณต๊ฐ๊ณผ ์ ์ฌํ๊ฒ ์ ํ ์ ํด๋์๋ค.
๋ด ์์ ํ๊ฒฝ๊ณผ ์ ์ฌํ git repository ์ ์ง๊ฐ ํ์ํ ๋ฏ ํ๋ค. ์์ผ๋ก ์ ์ฐจ ๋์ด๊ฐ ํ๋ก์ ํธ ๋ฐ ์ค์ต ๋ฐ์ดํฐ๋ค์ ๊ด๋ฆฌ ์ ์งํ๋๊ฒ๋ ์๊ธฐ๊ด๋ฆฌ๋ผ ์๊ฐํด์ผ๊ฒ ๋ค.