Style Sheet/CSS

🎨 position sticky - μœ„μ— 헀더λ₯Ό κ³ μ •ν•˜μž

인파_ 2021. 10. 20. 02:08

css-헀더고정

λ„€λΉ„κ²Œμ΄μ…˜ 헀더 κ³ μ •ν•˜κΈ°

λŒ€λ‹€μˆ˜μ˜ μ‚¬μ΄νŠΈκ°€ 상단 λ„€λΉ„κ²Œμ΄μ…˜ μ˜μ—­ 뢀뢄이 μŠ€ν¬λ‘€μ„ 내리면 같이 따라 λ‚΄λ €μ˜€λŠ” νŽ˜μ΄μ§€ μš”μ†Œλ₯Ό ν•œλ²ˆ 쯀은 봐왔을 것이닀. μ΄μ „μ—λŠ” μ΄λŸ¬ν•œ κΈ°λŠ₯을 λ§Œλ“€λ €λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λ³΅μž‘ν•œ ꡬ성을 ν•˜μ—¬μ•Ό ν–ˆμ§€λ§Œ μ΄μ œλŠ” κ°„λ‹¨ν•˜κ²Œ css의 position: sticky μ†μ„±μœΌλ‘œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

예λ₯Όλ“€μ–΄ μ•„λž˜μ™€ 같이 <header> μš”μ†Œ μ˜μ—­ 뢀뢄을 μŠ€ν¬λ‘€μ„ 내렀도 상단에 κ³ μ •μ‹œν‚€κ³  μ‹Άλ‹€λ©΄,

<header>
  <h1>Logo</h1>
  <nav>
    <ul>
      <li>Menu1</li>
      <li>Menu2</li>
      <li>Menu3</li>
    </ul>
  </nav>
</header>

<main>
	λ‚΄μš© ...
</main>

See the Pen position-sticky-0 by barzz12 (@inpaSkyrim) on CodePen.

μ•„λž˜μ™€ 같이 속성을 μ„€μ •ν•΄μ£Όλ©΄ 상단 헀더 고정이 되게 λœλ‹€.

header {
	...
    position: sticky;
    top: 0;
}

See the Pen position-sticky-1 by barzz12 (@inpaSkyrim) on CodePen.


Position 속성 μ’…λ₯˜ 비ꡐ

κΈ°λ³Έ 적으둜 css의 position속성은 html μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό μ„€μ •ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€. μ•„λ§ˆ λŒ€λΆ€λΆ„ 이 μ†μ„±κ°’μœΌλ‘œ relativeλ‚˜ absolue 값을 μ„€μ •ν•˜κ³  top, left μ†μ„±μœΌλ‘œ μš”μ†Œμ˜ μœ„μΉ˜ μ’Œν‘œλ₯Ό μ‘°μ •ν•΄λ³Έ κ²½ν—˜λ“€μ΄ μžˆμ„ 것이닀.

stickyλ₯Ό μ•Œμ•„λ³΄κΈ°μ „ 이해λ₯Ό μœ„ν•΄ κ°„λ‹¨ν•˜κ²Œ positoin 속성값에 λŒ€ν•΄ 차이 비ꡐλ₯Ό λΉ λ₯΄κ²Œ ν›‘κ³  λ„˜μ–΄κ°€λ³΄μž.

  1. static : μ •μ μ˜ κ³ μ • μœ„μΉ˜. κΈ°λ³Έ μ„€μ •κ°’
  2. relative : μƒλŒ€μ  κΈ°μ€€ μœ„μΉ˜. λΆ€λͺ¨μ˜ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ μœ„μΉ˜λ₯Ό μž‘λŠ”λ‹€.
  3. absolute : μ ˆλŒ€μ  κΈ°μ€€ μœ„μΉ˜
  4. fixed : κ³ μ • μœ„μΉ˜. νŠΉμ • μ’Œν‘œμ— κ³ μ •λ˜μ–΄ ν‘œν˜„
  5. sticky : μ²˜μŒμ—” static 속성과 같이 λ™μž‘ν•˜λ‹€κ°€ μŠ€ν¬λ‘€μ‹œ 지정 μ§€μ μ—μ„œ μš”μ†Œλ₯Ό fixed 처럼 κ³ μ •

μ•„λž˜ 예제λ₯Ό 톡해 각 속성듀이 μŠ€ν¬λ‘€μ‹œ μ–΄λ–€μ‹μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€ μ•Œ 수 μžˆμ„ 것이닀.

See the Pen position-sticky by barzz12 (@inpaSkyrim) on CodePen.

 

Position Sticky 속성 νŠΉμ§•

nav.sticky {
  position: sticky;
  top: 100px;
}

sticky 속성은 μ–΄μ°Œ 보면 staticκ³Ό fixed μ†μ„±μ˜ νŠΉμ§•μ„ ν˜Όν•©ν•œ 속성이라 ν•  수 μžˆλ‹€. μŠ€ν¬λ‘€ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” static position처럼 λ™μž‘ν•˜λ‹€κ°€ μŠ€ν¬λ‘€ν•  λ•Œ μ˜μ—­μ„ λ§Œλ‚˜λ©΄ fixed position 으둜 λ™μž‘ 되기 λ•Œλ¬Έμ΄λ‹€.

예λ₯Ό λ“€μ–΄ μš”μ†Œμ˜ sticky 속성이 μœ„μ˜ μ½”λ“œ 처럼 μ„€μ •λ˜μ–΄ μžˆλ‹€λ©΄, μš”μ†Œ μ˜μ—­μ΄ μ„€μ •λœ μœ„μΉ˜(top: 100px)에 λ„λ‹¬ν•˜κΈ° μ „κΉŒμ§€λŠ” 정적 μœ„μΉ˜μ— μžˆλ‹€κ°€ μŠ€ν¬λ‘€μ„ λ‚΄λ € μ„€μ •λœ μœ„μΉ˜μ— λ‹€λ‹€λ₯΄λ©΄ κ³ μ • μœ„μΉ˜λ‘œ λ™μž‘λ˜κ²Œ λœλ‹€.

μ΄λŸ¬ν•œ λ™μž‘ 원리 λ•Œλ¬Έμ— sitcky κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ ν•„μˆ˜μ μœΌλ‘œ top, bottom, left, rightλ“€ 쀑에 ν•˜λ‚˜λ₯Ό μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.


Position Sticky 예제

See the Pen Position sticky by Daryll Jann (@darylljann) on CodePen.

See the Pen position: sticky example by Dudley Storey (@dudleystorey) on CodePen.

See the Pen CSS position: sticky by Kseso (@Kseso) on CodePen.

See the Pen CSS `position: sticky` example by Jeff Wainwright (@yowainwright) on CodePen.


sticky 속성이 λ™μž‘ν•˜μ§€ μ•Šμ„λ•Œ

이처럼 νŽΈλ¦¬ν•˜κ²Œ μΈν„°λž™ν‹°λΈŒ(interactive)ν•œ μš”μ†Œλ₯Ό ꡬ성할 수 μžˆμ§€λ§Œ sticky 속성은 μ μš©ν•˜κΈ° μœ„ν•œ 사전 단계가 쑰금 κΉŒλ‹€λ‘­λ‹€. λ‹€μŒμ€ sticky 속성이 λ™μž‘ν•˜μ§€ μ•Šμ„ λ•Œ 점검해봐야 ν•  점듀에 λŒ€ν•œ 정리본 듀이닀. 만일 λ™μž‘μ΄ μ•ˆλ˜λ©΄ 빠뜨린 뢀뢄이 μžˆλŠ”μ§€ μ„Έμ„Ένžˆ ν™•μΈν•΄λ³΄μž.

 

사전 점검 사항

 

1. 슀크둀 도달 μœ„μΉ˜ μ„€μ • 확인

μœ„μ—μ„œ μ–ΈκΈ‰ν•˜μ˜€λ“―μ΄ sticky μ—˜λ¦¬λ¨ΌνŠΈλŠ” top, bottom, left, right 속성 쀑 ν•˜λ‚˜λŠ” λ°˜λ“œμ‹œ ν•„μš”ν•˜λ‹€. κ·Έλž˜μ•Ό μ–΄λŠ μœ„μΉ˜ μ§€μ μ—μ„œ κ³ μ • μœ„μΉ˜λ‘œ λ™μž‘ν• μ§€ 기쀀이 생기기 λ•Œλ¬Έμ΄λ‹€.

.sticky {
  position: sticky;
  top: 0; /* ν•„μˆ˜ */
}

 

2. λΆ€λͺ¨ λ…Έλ“œμ— overflow 속성 μ„€μ • 확인

sticky 속성이 적용된 λ…Έλ“œμ˜ λΆ€λͺ¨ λ˜λŠ” 쑰상 λ…Έλ“œμ— overflow 섀정이 λ˜μ–΄ 있으면 λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ§Žμ΄λ“€ μ‹€μˆ˜ν•˜λŠ” 점이 μ›Ήμ‚¬μ΄νŠΈκ°€ κ°€λ‘œ 100%λ₯Ό λ„˜μ§€ μ•Šκ²Œ λ§Œλ“€κΈ° μœ„ν•΄μ„œ μ΅œμƒλ‹¨ μš”μ†Œμ— overflow-x: hiddenκ³Ό 같은 κ°€λ‘œ 슀크둀 κ΄€λ ¨ 섀정을 μΆ”κ°€ν•˜μ—¬, μ„Έλ‘œ μŠ€ν¬λ‘€μ— λ°˜μ‘ν•˜λŠ” sticky와 κ΄€λ ¨ μ—†λŠ” 쀄 μ•Œκ³  μ μš©ν•˜λŠ” 점이닀. 이 μ—­μ‹œ λ°˜μ‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

overflow: hidden
overflow: scroll
overflow: auto

 

 

3. λΆ€λͺ¨ λ…Έλ“œμ˜ heightκ°€ μ„€μ •λ˜μ–΄ μžˆλŠ”μ§€ 확인

sticky 속성을 κ°–λŠ” μ—˜λ¦¬λ¨ΌνŠΈμ˜ λΆ€λͺ¨ λ…Έλ“œλŠ” λ°˜λ“œμ‹œ heightκ°€ μ„€μ •λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 점이닀. 그렇지 μ•ŠμœΌλ©΄ sticky μ†μ„±μ˜ μ—˜λ¦¬λ¨ΌνŠΈλŠ” stiatc μ†μ„±μ²˜λŸΌ λ™μž‘ν•˜κ²Œ λœλ‹€. λ‹€λ§Œ height: 150% 같이 νΌμ„ΌνŠΈλ‘œ μ„€μ •ν•œ κ²½μš°μ—λ„ λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

참고둜 body 같은 경우 μžλ™μœΌλ‘œ heightλ₯Ό μž‘μ•„μ£ΌκΈ° λ•Œλ¬Έμ— sticky μš”μ†Œ λΆ€λͺ¨κ°€ body라면 섀정을 ν•΄ 쀄 ν•„μš”λŠ” μ—†λ‹€.

 

4. λΈŒλΌμš°μ € 지원 확인

IE 11 μ΄ν•˜ 버전은 sticky 속성에 λŒ€ν•΄ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.


# 참고자료

https://www.daleseo.com/css-position-sticky-header/

https://deeplify.dev/front-end/markup/position-sticky