CSS λ ˆμ΄μ•„μ›ƒ (position, flex, grid)

wayandwayΒ·2024λ…„ 3μ›” 12일
1

HTML/CSS

λͺ©λ‘ 보기
6/7

🚩 CSS λ ˆμ΄μ•„μ›ƒ(CSS Layout)μ΄λž€?

CSS λ ˆμ΄μ•„μ›ƒμ΄λž€ λ‹€μ–‘ν•œ CSS μš”μ†Œλ“€μ„ λ°°μΉ˜ν•˜κ³ , λ°°μ—΄ν•˜λŠ” 것을 λ§ν•œλ‹€. CSS λ ˆμ΄μ•„μ›ƒμ—λŠ” 크게 ν¬μ§€μ…˜(Position), ν”Œλ ‰μŠ€λ°•μŠ€(Flexbox), κ·Έλ¦¬λ“œ(Grid)λΌλŠ” μ„Έ 가지 κ°œλ…μ΄ μžˆλ‹€.




0. Normal Flow & display 속성

Normal Flow

기본적으둜 HTML, CSS μš”μ†Œλ“€μ€ κΈ€μ˜ νλ¦„λŒ€λ‘œ 배치되며 이런 일반적인 κΈ€μ˜ 흐름을 노말 ν”Œλ‘œμš°(Normal Flow)라고 ν•œλ‹€.
ν¬μ§€μ…˜μ€ 노말 ν”Œλ‘œμš°μ—μ„œ λ²—μ–΄λ‚˜ μœ„μΉ˜λ₯Ό 직접 μ •ν•˜λŠ” 방식이고, ν”Œλ ‰μŠ€ λ°•μŠ€λŠ” λ°•μŠ€λ₯Ό λ§Œλ“€κ³  λ°©ν–₯을 μ •ν•΄ μš”μ†Œλ₯Ό λ°°μΉ˜ν•˜λŠ” 방식이닀. κ·Έλ¦¬λ“œλŠ” λ°”λ‘‘νŒμ²˜λŸΌ 칸을 λ‚˜λˆˆ λ‹€μŒ μš”μ†Œλ₯Ό λ°°μΉ˜ν•˜λŠ” 방식이닀.


display 속성

λ””μŠ€ν”Œλ ˆμ΄(display)λŠ” κΈ€μ˜ νλ¦„μ—μ„œ μš”μ†Œλ₯Ό μ–΄λ–»κ²Œ λ°°μΉ˜ν• μ§€ μ •ν•˜λŠ” CSS 속성이며, λͺ¨λ“  μš”μ†ŒλŠ” λ””μŠ€ν”Œλ ˆμ΄ 속성을 기본으둜 가지고 μžˆλ‹€. λ””μŠ€ν”Œλ ˆμ΄ μ†μ„±μ—λŠ” 블둝, 인라인, 인라인블둝이 μžˆλ‹€.

블둝(display: block;)인라인(display: inline;)인라인블둝(display: inline-block)
κΈ°λ³Έ 크기쒌우둜 꽉참content에 λ”± 맞게content에 λ”± 맞게
λ°°μΉ˜μœ„μ—μ„œ μ•„λž˜λ‘œκΈ€ μ“°λŠ” λ°©ν–₯κΈ€ μ“°λŠ” λ°©ν–₯
width와 heightOXO
marginκ³Ό paddingO인라인 진행방ν–₯(κ°€λ‘œ)만 κ°€λŠ₯O




1. position 속성

κΈ€μ˜ νλ¦„μ—μ„œ λ²—μ–΄λ‚˜ μš”μ†Œλ₯Ό 자유둭게 λ°°μΉ˜ν•  λ•Œ μ“°λŠ” 속성이닀. position의 속성값에 따라 μœ„μΉ˜λ₯Ό μ •ν•˜λŠ” 기쀀이 달라진닀. position: static;이 기본값이고, 이 경우 μš”μ†ŒλŠ” μ›λž˜ μžˆμ–΄μ•Ό ν•  μœ„μΉ˜μ— λ°°μΉ˜λœλ‹€. λ˜ν•œ 이 position의 값을 static이 μ•„λ‹Œ λ‹€λ₯Έ μ†μ„±μœΌλ‘œ μ§€μ •ν–ˆμ„ 경우(relative, absolute... λ“±), 포지셔닝 λ˜μ—ˆλ‹€κ³  λ§ν•œλ‹€.


μœ„μΉ˜ μ •ν•˜κΈ°

μœ„μΉ˜λ₯Ό μ •ν•˜λŠ” 기쀀에 λŒ€ν•΄ top, right, bottom, left μ†μ„±μœΌλ‘œ μœ„μΉ˜λ₯Ό μ •ν•  수 μžˆλ‹€. λ˜ν•œ λ„€ 가지 값이 λͺ¨λ‘ λ˜‘κ°™μ€ 경우 inset속성을 μ“Έ 수 μžˆλ‹€.


position: relative;

μš”μ†Œμ˜ μ›λž˜ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ λ°°μΉ˜ν•œλ‹€. μ΄λ•Œ μš”μ†Œμ˜ μ›λž˜ μžλ¦¬λŠ” κ·ΈλŒ€λ‘œ μ°¨μ§€ν•˜κ³  μžˆλ‹€.

.green {
   position: relative;
   top: 15px;
   left: 10px;
}

position: absolute;

포지셔닝이 된 κ°€μž₯ κ°€κΉŒμš΄ 쑰상 μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ λ°°μΉ˜λœλ‹€.
μ•„λž˜ μ˜ˆμ‹œμ—μ„œλŠ” κ°€μž₯ κ°€κΉŒμš΄ 쑰상 μš”μ†ŒμΈ .redκ°€ relativeν¬μ§€μ…˜μ΄λ―€λ‘œ, μžμ†μΈ .blueλŠ” .redλ₯Ό κΈ°μ€€μœΌλ‘œ λ°°μΉ˜λœλ‹€. μ΄λ•Œ .blueλŠ” μ›λž˜ μžˆμ–΄μ•Ό ν•  μœ„μΉ˜μ—μ„œ μ™„μ „νžˆ λΉ μ§€κ²Œ λ˜μ–΄ μš”μ†Œμ˜ μ›λž˜ μžλ¦¬λŠ” μ°¨μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€.

.red {
  position: relative; 
  top: 0;
  left: 10px;
}
.blue {
  position: absolute;
  right: 10px;
  bottom: 15px;
}

position: fixed;

λΈŒλΌμš°μ € 화면을 κΈ°μ€€μœΌλ‘œ κ³ μ •λœλ‹€. λ˜ν•œ μ›λž˜ μžˆμ–΄μ•Ό ν•  μœ„μΉ˜μ—μ„œ μ™„μ „νžˆ λΉ μ§€κ²Œ λ˜λ―€λ‘œ, μš”μ†Œμ˜ μ›λž˜ μžλ¦¬λŠ” μ°¨μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€. 주둜 λ‚΄λΉ„κ²Œμ΄μ…˜λ°”λ₯Ό λ§Œλ“€ λ•Œ 자주 μ‚¬μš©ν•œλ‹€.


position: sticky;

static처럼 μ›λž˜ μœ„μΉ˜μ— λ°°μΉ˜λ˜μ–΄ μžˆλ‹€κ°€, 정해진 μœ„μΉ˜μ— λΈŒλΌμš°μ €κ°€ 슀크둀되면 fixed처럼 κ³ μ •λ˜μ–΄ λ°°μΉ˜λœλ‹€. 기본적으둜 static처럼 배치되기 λ•Œλ¬Έμ— μš”μ†Œμ˜ μ›λž˜ 자리λ₯Ό μ°¨μ§€ν•œλ‹€.
λ‹€μŒ μ½”λ“œλŠ” λΈŒλΌμš°μ € ν™”λ©΄ κΈ°μ€€μœΌλ‘œ top: 0만큼 λ–¨μ–΄μ‘Œμ„ λ•Œ 화면에 λ‹¬λΌλΆ™μŒμ„ μ˜λ―Έν•œλ‹€.

position: sticky;
top: 0;

λ˜ν•œ sticky속성을 μ§€μ •ν•œ μš”μ†ŒλŠ” λΆ€λͺ¨μš”μ†Œμ— μ†Œμ†λ˜λŠ” νŠΉμ„±μ„ κ°€μ§€λ―€λ‘œ, λΆ€λͺ¨μš”μ†Œκ°€ ν™”λ©΄ λ°–μœΌλ‘œ 사라지면 λ”°λΌμ„œ 사라진닀.


z-index

μš”μ†Œμ˜ μ•žλ’€ 정렬을 μ •ν•  λ•Œ μ“°λŠ” 속성이닀. μ •λ ¬ μˆœμ„œμ΄κΈ° λ•Œλ¬Έμ— λ‹¨μœ„ 없이 μˆ«μžκ°’λ§Œ μ“°λ©°, 값이 λ†’μ„μˆ˜λ‘ ν™”λ©΄μ˜ μ•žμͺ½μ— 보인닀. λ§Œμ•½ 값이 κ°™μœΌλ©΄ μ½”λ“œμƒ μˆœμ„œμ— 따라 μ•„λž˜ 쀄에 μžˆλŠ” μš”μ†Œκ°€ μ•žμͺ½μ— 보인닀. 기본값은 z-index: auto;이닀.




2. ν”Œλ ‰μŠ€ λ°•μŠ€ (display: flex;)

ν”Œλ ‰μŠ€ λ°•μŠ€λŠ” 1μ°¨μ›μœΌλ‘œ μš”μ†Œλ₯Ό λ°°μΉ˜ν•œλ‹€. 즉 κ°€λ‘œ λ˜λŠ” μ„Έλ‘œ λ°©ν–₯으둜 λ°°μΉ˜ν•˜λŠ” 방식을 λ§ν•œλ‹€. ν”Œλ ‰μŠ€ λ°•μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μš°μ„  λ°°μΉ˜ν•  λ°©ν–₯(flex-direction)을 μ •ν•œ ν›„ λ‹€μŒκ³Ό 같은 속성듀을 ν™œμš©ν•  수 μžˆλ‹€.

flex-direction : ν”Œλ ‰μŠ€ λ°•μŠ€ 배치 λ°©ν–₯ (row λ˜λŠ” column)
justify-content, align-items : κΈ°λ³ΈμΆ•, κ°€λ‘œμΆ• μ •λ ¬
flex-wrap : μš”μ†Œκ°€ λ„˜μΉ  λ–„
gap : 간격
flex-grow, flex-shrink : 크기λ₯Ό λŠ˜μ΄κ±°λ‚˜ 쀄일 λ•Œ
flex-basis


κΈ°λ³Έ 배치 λ°©ν–₯ & μ •λ ¬

ν”Œλ ‰μŠ€ λ°•μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ κΈ°λ³Έ 배치 λ°©ν–₯(flex-direction)을 μ •ν•΄μ•Ό ν•œλ‹€.

.box {
   display: flex;
   flex-direction: row; /* rowλŠ” κ°€λ‘œ, column은 μ„Έλ‘œλ‘œ 배치. 기본값은 row */
}

μ΄λ ‡κ²Œ flex-direction을 κΈ°μ€€μœΌλ‘œ μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 κΈ°λ³Έ μΆ•(Main Axis)κ³Ό ꡐ차 μΆ•(Cross Axis)이 정해진닀.

λ˜ν•œ κΈ°λ³Έ μΆ• μ •λ ¬λ‘œ justify-content속성과 ꡐ차 μΆ• μ •λ ¬λ‘œ align-items속성을 μ‚¬μš©ν•  수 μžˆλ‹€.

.box {
   display: flex;
   flex-direction: row;
   justify-content: flex-start; /* κΈ°λ³Έκ°’ flext-start */
   align-items: stretch; /* κΈ°λ³Έκ°’ stretch */
}


μš”μ†Œκ°€ λ„˜μΉ  λ•Œ, flex-wrap

ν”Œλ ‰μŠ€ λ°•μŠ€ μ•ˆμ—μ„œ μš”μ†Œκ°€ λ„˜μΉ  λ•Œ, flex-wrap: wrap으둜 μ„€μ •ν•˜λ©΄ ꡐ차 μΆ• λ°©ν–₯으둜 λ„˜μ–΄κ°€μ„œ λ°°μΉ˜λœλ‹€.

.box {
   flex-wrap: wrap;
}


간격 gap

κΈ°λ³Έ μΆ•, ꡐ차 μΆ•κ³ΌλŠ” 관계 없이 μ„Έλ‘œ κ°€λ‘œ 순으둜 값을 μž…λ ₯ν•œλ‹€.

.box {
   gap: 20px 10px;
}
.box2 {
   gap: 20px; /* 숫자λ₯Ό ν•˜λ‚˜λ§Œ μ“°λ©΄, λͺ¨λ“  λ°©ν–₯의 간격을 지정할 수 있음 */
}


μš”μ†Œ μ±„μš°κΈ°, flex-grow & flex-shrink

μš”μ†Œλ₯Ό λŠ˜λ €μ„œ μ±„μš°κΈ° flex-grow

기본값은 0이닀. flex-grow값이 클수둝 μƒλŒ€μ μœΌλ‘œ 많이 λŠ˜μ–΄λ‚œλ‹€.

μš”μ†Œλ₯Ό μ€„μ—¬μ„œ μ±„μš°κΈ° flex-shrink

기본값은 1이닀. μš”μ†Œλ“€μ˜ 크기가 μ»€μ„œ λ„˜μΉ˜λŠ” 경우, μš”μ†Œμ˜ 크기λ₯Ό 쀄여 ν”Œλ ‰μŠ€ λ°•μŠ€ μ•ˆμ„ μ±„μš΄λ‹€. 기본값이 1이기 λ•Œλ¬Έμ— 기본적으둜 μš”μ†Œλ₯Ό μ€„μ—¬μ„œ λ°°μΉ˜ν•˜κ³ , 0으둜 μ§€μ •ν•˜λ©΄ 크기가 쀄어듀지 μ•ŠλŠ”λ‹€. λ˜ν•œ flex-shrink 값이 클수둝 μƒλŒ€μ μœΌλ‘œ 많이 쀄어든닀.


ν”Œλ ‰μŠ€ λ°•μŠ€ μ•ˆμ—μ„œμ˜ 포지셔닝

relative, stickyλŠ” μš”μ†Œμ˜ μ›λž˜ 자리λ₯Ό μ°¨μ§€ν•˜κΈ° λ•Œλ¬Έμ— ν”Œλ ‰μŠ€λ°•μŠ€μ˜ 영ν–₯을 λ°›μ§€λ§Œ, absolute와 fixedλŠ” μš”μ†Œμ˜ μ›λž˜ μžλ¦¬μ—μ„œ μ™„μ „νžˆ μ œμ™Έλ˜κΈ° λ•Œλ¬Έμ— ν”Œλ ‰μŠ€λ°•μŠ€λž‘ 상관없이 λ°°μΉ˜λœλ‹€.




3. κ·Έλ¦¬λ“œ (display: grid;)

κ·Έλ¦¬λ“œλŠ” 2μ°¨μ›μœΌλ‘œ μš”μ†Œλ₯Ό 배치
κ·Έλ¦¬λ“œ 라인(개발자 도ꡬ에섭 λ³΄μ΄λŠ” 것은 κ·Έλ¦¬λ“œ λΌμΈμž„. μ…€μ•„λ‹˜!!!!), κ·Έλ¦¬λ“œ μ…€


격자 λ‚˜λˆ„κΈ°

grid-template-columns
grid-template-rows
grid-template

.box {
   grid-template: 
     100px 200px 100px /    /* rows */
     100px 200px 100px;    /* columns */
}

기본적으둜 κ·Έλ¦¬λ“œ ν¬κΈ°λŠ” κ³ μ •
fr : κ·Έλ¦¬λ“œ 곡간 μ•ˆμ—μ„œ λΉ„μœ¨μ— 맞게 μ„€μ • κ°€λŠ₯(fraction)
minmax(x, y) : μ΅œμ†Œ(x), μ΅œλŒ€(y) 크기 μ„€μ •
repeat(x, y) : xλ₯Ό y번


간격

gap: μ„Έλ‘œ κ°€λ‘œ; λ˜λŠ” gap: λͺ¨λ“  간격; - ν”Œλ ‰μŠ€λ°•μŠ€μ˜ κ°­κ³Ό 같은 속성이닀. κ·Έλ¦¬λ“œ μ…€ 간에 간격을 μ€€λ‹€.


크기 미리 μ •ν•˜κΈ°

grid-auto-rows
grid-auto-columns

grid templateμ—μ„œ rows λ˜λŠ” columns 속성을 λͺ…μ‹œν•˜μ§€ μ•Šμ•˜μ„ λ•Œ
auto-rows λ˜λŠ” auto-clumns 값을 μ μš©ν•œλ‹€.


κ·Έλ¦¬λ“œ 라인 번호둜 배치

grid-row
grid-column

μ΄λ¦„μœΌλ‘œ 배치

κ·Έλ¦¬λ“œ μ»¨ν…Œμ΄λ„ˆ μš”μ†Œμ— grid-template-areas 속성 μ„€μ •
κ·Έλ¦¬λ“œ μ…€ μš”μ†Œλ“€μ— grid-area μ†μ„±μœΌλ‘œ 이름 μ„€μ •




profile
web front-end / 간단 λͺ…λ£Œν•˜κ²Œ κΈ€μ“°κΈ°

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보