Style Sheet/CSS

🎨 μŠ€ν¬λ‘€μ„ λΆ€λ“œλŸ½κ²Œ - Scroll Snap 속성

인파_ 2021. 10. 15. 20:07

슀크둀-λΆ€λ“œλŸ½κ²Œ

CSS Scroll snap

CSS Scroll snap은 μ›Ή νŽ˜μ΄μ§€μ—μ„œ μŠ€ν¬λ‘€μ„ ν•  λ•Œ, μš”μ†Œκ°€ μŠ€ν¬λ‘€λ˜λŠ” μœ„μΉ˜μ— μžλ™μœΌλ‘œ μŠ€λƒ…λ˜λ„λ‘ ν•˜λŠ” CSS 속성이닀.

예λ₯Όλ“€μ–΄ μš©μžκ°€ μ›Ή νŽ˜μ΄μ§€λ₯Ό μŠ€ν¬λ‘€ν•  λ•Œ 쀑간에 λ©ˆμΆ°λ²„λ¦¬λ©΄ μ½˜ν…μΈ μ˜ μ€‘κ°„μ—μ„œ 멈좰 μ£Όμš” μ½˜ν…μΈ μ˜ μΌλΆ€λ§Œ 보이게 λ˜λŠ”λ°, 이λ₯Ό 미리 μ„€μ •ν•œ μœ„μΉ˜λ‘œ μžλ™ μŠ€λƒ…ν•˜μ—¬ μžμ—°μŠ€λŸ¬μš΄ 슀크둀 μ›€μ§μž„κ³Ό ν•¨κ»˜ μ‚¬μš©μž κ²½ν—˜μ„ λ”μš± ν–₯μƒμ‹œν‚€λŠ” 것이닀.

Scroll-SnapScroll-Snap
슀크둀 μŠ€λƒ…μ„ μ μš©ν•˜λ©΄ 절반만 μŠ€ν¬λ‘€ν•΄λ„ ν•΄λ‹Ή μ˜μ—­μ΄ μ™„μ „νžˆ 화면에 μŠ€λƒ…λœλ‹€

슀크둀 μŠ€λƒ…μ΄ μ—†λ˜ μ‹œμ ˆμ—λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 일일히 μš”μ†Œ μœ„μΉ˜λ₯Ό κ³„μ‚°ν•΄μ„œ μ‘°μ •ν•΄μ•Ό λ¬μ§€λ§Œ, CSS 속성을 톡해 곡식 μ§€μ›ν•¨μœΌλ‘œμ¨ 개발의 νŽΈλ¦¬ν•¨κ³Ό λ”λΆˆμ–΄ μ„±λŠ₯도 λΉ„μ•½μ μœΌλ‘œ μƒμŠΉν–ˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.


Scroll snap μ‚¬μš©λ²•

μš°μ„  슀크둀 μŠ€λƒ…μ„ μ μš©ν•  λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆ μ˜μ—­μ„ λ§Œλ“€κ³ , κ·Έ μ•ˆμ— μŠ€λƒ…λ  μžμ‹ μš”μ†Œ μ˜μ—­μ„ λ§Œλ“€μ–΄ μ€€λ‹€. 그리고 λΆ€λͺ¨μ— scroll-snap-type 속성과 μžμ‹μ— scroll-snap-align 속성을 μ μš©ν•΄μ£Όλ©΄ λœλ‹€. (이듀 속성에 λŒ€ν•΄μ„œλŠ” μ•„λž˜ μžμ„Ένžˆ 닀룬닀)

<div class="scroll-container">
	<div class="scroll-area">1</div>
	<div class="scroll-area">2</div>
	<div class="scroll-area">3</div>
	<div class="scroll-area">4</div>
</div>
/* λΆ€λͺ¨ 슀크둀 μŠ€λƒ… μ»¨ν…Œμ΄λ„ˆ */
.scroll-container {
  overflow: auto;
  scroll-snap-type: y mandatory; /* y μΆ• λ°©ν–₯으둜만 scroll snap 적용 */
}

/* μžμ‹ 슀크둀 μŠ€λƒ… μ˜μ—­ */
.scroll-area {
  scroll-snap-align: start; /* 슀크둀 μœ„μΉ˜ 맞좀 */
}


/* μ—¬κΈ°μ„œλΆ€ν„΄ λ‹¨μˆœ κΎΈλ―ΈκΈ° --------------------------- */
.scroll-area:nth-of-type(1) {
  background: #49b293;
}

.scroll-area:nth-of-type(2) {
  background: #c94e4b;
}

.scroll-area:nth-of-type(3) {
  background: #4cc1be;
}

.scroll-area:nth-of-type(4) {
  background: #8360A6;
}

See the Pen Scroll Snap Demo by Envato Tuts+ (@tutsplus) on CodePen.


Scroll snap μ†μ„±

Scroll snapμ—λŠ” μ‚¬μš©ν•  수 μžˆλŠ” 4 가지 속성이 μžˆλ‹€.

  • scroll-snap-type
  • scroll-snap-align
  • scroll-padding
  • scroll-margin

μ•„λž˜μ˜ CSS μ˜ˆμ‹œλŠ” λ‹€μŒ HTML μ—˜λ¦¬λ¨ΌνŠΈ ꡬ성을 κΈ°μ€€μœΌλ‘œ μ„€λͺ…ν•œλ‹€.

<div class="container">
	<div class="item">1</div>
	<div class="item">2</div>
	<div class="item">3</div>
	<div class="item">4</div>
</div>

 

scroll-snap-type

scroll-snap-type 속성은 슀크둀 μŠ€λƒ…μ΄ λ™μž‘ν•˜λŠ” 방식을 μ§€μ •ν•œλ‹€. 첫 번째 인자둜 μŠ€λƒ…μ΄ 적용될 좕을 μ§€μ •ν•˜κ³ , 두 번째 인자둜 μŠ€λƒ… 적용 방식을 μ§€μ •ν•œλ‹€.

.container {
	scroll-snap-type : [scroll snap axis], [scroll snap strictness];
}

/* y λ°©ν–₯으둜 슀크둀 μŠ€λƒ…μ„ 적용 */
.container {
  scroll-snap-type: y mandatory;
}

/* x λ°©ν–₯으둜 슀크둀 μŠ€λƒ…μ„ 적용 */
.container {
  scroll-snap-type: x proximity;
}

[ scroll snap axis ]

  • x: μˆ˜ν‰(κ°€λ‘œ) μΆ•μœΌλ‘œ snap position 지정
  • y: 수직(μ„Έλ‘œ) μΆ•μœΌλ‘œ snap position 지정
  • block: snap area의 block μΆ•μœΌλ‘œ 지정
  • inline: inline μΆ•μœΌλ‘œ 지정
  • both: 두 μΆ•μ˜ μœ„μΉ˜λ₯Ό κ°œλ³„μ μœΌλ‘œ μŠ€λƒ….

[ scroll snap strictness ]

  • none: μŠ€λƒ…ν•˜μ§€ μ•ŠμŒ.
  • proximity: 슀크둀 μœ„μΉ˜κ°€ μŠ€λƒ… μœ„μΉ˜μ— κ°€κΉŒμ›Œμ§€λ©΄ μžμ—°μŠ€λŸ½κ²Œ μŠ€λƒ…
  • mandatory: 슀크둀 μœ„μΉ˜κ°€ μŠ€λƒ… μœ„μΉ˜μ™€ μ •ν™•νžˆ μΌμΉ˜ν•΄μ•Όλ§Œ μŠ€λƒ…
scroll-snap-type 속성 값을 mandatory 둜 μ„ μ–Έ μ‹œ μ£Όμ˜ν• μ μ€, μ½˜ν…μΈ  κ°„μ˜ 간격이 넓을 λ•Œ κ°•μ œλ‘œ μŠ€λƒ…μ„ ν•˜κ²Œ 되면 쀑간 μ½˜ν…μΈ λ₯Ό κ±΄λ„ˆλ›°κ³  λ‹€μŒ μ½˜ν…μΈ λ‘œ μ΄λ™ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•  수 μžˆλ‹€λŠ” 점이닀.

See the Pen scroll snap by barzz12 (@inpaSkyrim) on CodePen.

 

scroll-snap-align

scroll-snap-align 속성은 슀크둀 μŠ€λƒ…μ΄ μ μš©λ˜λŠ” μš”μ†Œκ°€ μŠ€λƒ… μœ„μΉ˜μ— μ •λ ¬λ˜λŠ” 방식을 μ§€μ •ν•œλ‹€. scroll-snap-typeμ—μ„œ μ§€μ •ν•œ 좕을 κΈ°μ€€μœΌλ‘œ snap area의 정렬을 μ •ν•œλ‹€.

  • none: snap position을 μ§€μ •ν•˜μ§€ μ•ŠμŒ
  • start: 슀크둀 μŠ€λƒ… μœ„μΉ˜λ₯Ό snap area μ‹œμž‘ 뢀뢄에 λ§žμΆ”λ„λ‘ 지정
  • end: 슀크둀 μŠ€λƒ… μœ„μΉ˜λ₯Ό snap area의 끝 뢀뢄에 λ§žμΆ”λ„λ‘ 지정
  • center: 슀크둀 μŠ€λƒ… μœ„μΉ˜λ₯Ό snap area의 κ°€μš΄λ° 뢀뢄에 λ§žμΆ”λ„λ‘ 지정
/* μŠ€λƒ… μœ„μΉ˜μ— 맞좰 μš”μ†Œ μ‹œμž‘ 뢀뢄을 μ •λ ¬ */
.item {
  scroll-snap-align: start;
}

/* μŠ€λƒ… μœ„μΉ˜μ— 맞좰 μš”μ†Œ 쀑앙 뢀뢄을 μ •λ ¬ */
.item {
  scroll-snap-align: center;
}

/* μŠ€λƒ… μœ„μΉ˜μ— 맞좰 μš”μ†Œ 끝 뢀뢄을 μ •λ ¬ */
.item {
  scroll-snap-align: end;
}

슀크둀-λΆ€λ“œλŸ½κ²Œ

 

scroll-padding

scroll-padding 속성은 슀크둀 μ˜μ—­μ˜ νŒ¨λ”©(padding)을 μ‘°μ •ν•˜λŠ” 속성이닀. 이 속성을 μ‚¬μš©ν•˜λ©΄ 슀크둀 μŠ€λƒ…μ΄ μ μš©λ˜λŠ” μ˜μ—­μ„ 확보할 수 μžˆλ‹€. 

μ •λ§λ‘œ μš”μ†Œμ˜ padding 값이 λ³€κ²½λ˜λŠ” 것이 μ•„λ‹ˆκ³ , ν•΄λ‹Ή λ·° 포트(viewport)의 κ°€μ§œ padding이 μ μš©λ˜λŠ” 것이닀.

/* 슀크둀 μ˜μ—­ μœ„/μ•„λž˜λ‘œ νŒ¨λ”© 100px μΆ”κ°€ */
.container {
  scroll-snap-type: y mandatory; 
  scroll-padding: 100px 0 100px 0; /* `scroll-padding-top`, `scroll-padding-right`, `scroll-padding-bottom`, `scroll-padding-left`  */
}

/* 슀크둀 μ˜μ—­ 상/ν•˜/쒌/우 λͺ¨λ‘μ— νŒ¨λ”© 50px μΆ”κ°€ */
.container {
  scroll-snap-type: y mandatory; 
  scroll-padding: 50px;
}

슀크둀-λΆ€λ“œλŸ½κ²Œ

 

scroll-margin

scroll-padding κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ·° 포트의 κ°€μ§œ margin μ˜μ—­μ„ μ§€μ •ν•˜λŠ” 속성이닀.

/* 슀크둀 μŠ€λƒ…μ΄ μ μš©λ˜λŠ” μ˜μ—­μ˜ 상/ν•˜/쒌/우 λ§ˆμ§„μ„ 100px둜 지정 */
.container {
  scroll-margin: 100px; /*  `scroll-margin-top`, `scroll-margin-right`, `scroll-margin-bottom`, `scroll-margin-left` */
}

/* 슀크둀 μŠ€λƒ…μ΄ μ μš©λ˜λŠ” μ˜μ—­μ˜ 상/ν•˜ λ§ˆμ§„μ„ 50px, 쒌/우 λ§ˆμ§„μ„ 100px둜 지정 */
.container {
  scroll-margin: 50px 100px;
}

슀크둀-λΆ€λ“œλŸ½κ²Œ


μ΄λŸ¬ν•œ scroll-padding , scroll-margin 속성을 μ‘μš©ν•˜μžλ©΄, 이전 ν˜Ήμ€ λ‹€μŒ μ½˜ν…μΈ μ— λŒ€ν•œ μ˜ˆμƒ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•  수 μžˆλ‹€.

슀크둀-λΆ€λ“œλŸ½κ²Œ

 

scroll-snap-stop

scroll-snap-stop 속성은 슀크둀 μŠ€λƒ… μœ„μΉ˜μ— λ„λ‹¬ν–ˆμ„ λ•Œ μŠ€ν¬λ‘€μ„ 쀑지할 지 μ—¬λΆ€λ₯Ό μ§€μ •ν•œλ‹€.

  • normal: 슀크둀이 μŠ€λƒ…λ˜λ”λΌλ„ 계속 진행될 수 있음
  • always: 슀크둀이 μŠ€λƒ… μœ„μΉ˜μ— λ„λ‹¬ν•˜λ©΄ 쀑지
/* 슀크둀 μŠ€λƒ…μ΄ μš”μ†Œμ˜ λμ—μ„œ μ€‘λ‹¨λ˜λ„λ‘ 지정 */
.item {
  scroll-snap-stop: always;
}

/* 슀크둀 μŠ€λƒ…μ΄ μš”μ†Œμ˜ μ€‘μ•™μ—μ„œλ§Œ μ€‘λ‹¨λ˜λ„λ‘ 지정 */
.item {
  scroll-snap-stop: normal;
}

# 참고자료

https://wit.nts-corp.com/2018/08/28/5317

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Scroll_Snap