๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/JavaScript jQuery

[JavaScript / jQuery] Scroll ์ด๋ฒคํŠธ๋กœ ์žฌ๋ฏธ์žˆ๋Š” ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 3. 6.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์˜ค๋Š˜์€ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ์–ด๋–ค ์‹์œผ๋กœ ํ™œ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค.
  • ํ™•์‹คํžˆ ๊ทธ๋ƒฅ ๋ฌธ๋ฒ•๋งŒ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋ณด๋‹ค ์ง์ ‘ ๊ตฌ๊ธ€๋งํ•˜๋ฉฐ ์ด๊ฒƒ์ €๊ฒƒ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ˆ˜์—…์—์„œ๋Š” ๊ฐ„๋‹จํžˆ "์ด๋Ÿฐ ๊ฒƒ๋„ ํ•ด๋ณด์„ธ์š”~" ๋ผ๋ฉฐ ์ˆ™์ œ๋ฅผ ๋‚ด์ฃผ์‹œ์ง€๋งŒ.. ๋‚˜๋ž€ ์‚ฌ๋žŒ์€ ๋˜ ๋””ํ…Œ์ผ์— ์ง‘์ฐฉํ–ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ฉ”์ธ ํ™”๋ฉด์ด ์•„๋ž˜์ชฝ์œผ๋กœ ์–ด๋Š์ •๋„ ์Šคํฌ๋กค๋˜๋ฉด ๋กœ๊ณ ๊ฐ€ ์ปค์ง€๊ณ , ๋‹ค์‹œ ์Šคํฌ๋กค์„ ์˜ฌ๋ฆฌ๋ฉด ๋กœ๊ณ ๊ฐ€ ์›๋ž˜๋Œ€๋กœ ๋Œ์•„์˜ค๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๊ทผ๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด์˜ css ์ค‘ ์„œ๋ธŒ๋ฉ”๋‰ด๋ฆฌ์ŠคํŠธ, ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ, ๋ฉ”์ธํ™”๋ฉด ์ƒ๋‹จ ์‚ฌ์ง„ ์ด๋Ÿฐ ๊ฒƒ๋“ค์˜ ์œ„์น˜๊ฐ€ ๋‹ค ์กฐ๊ธˆ์”ฉ ํ‹€์–ด์ง€๋”๋ผ.. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ๋“ค์˜ ์œ„์น˜์™€ ๊ฒน์ณ์ง€๋Š” ๋ถ€๋ถ„๋“ค ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์œ„์ชฝ์— ๋‘๊ณ  ์–ด๋–ค ๊ฒƒ์„ ์•„๋ž˜์ชฝ์— ๋‘˜์ง€๋ฅผ ์กฐ์ •ํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์„ JavaScript ๋กœ ๊ตฌํ˜„ํ•˜๋Š๋ผ ์‹œ๊ฐ„์ด ์ข€ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

๐Ÿ’œ ๋ฉ”์ธ ํ™”๋ฉด

  • ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ ๊ฒƒ์€, ์Šคํฌ๋กค์„ ํ•˜๋ฉด ์ƒ๋‹จ Navbar ๊ฐ€ ๊ณ ์ •๋˜๊ณ , ์–ด๋Š ์ •๋„ ์•„๋ž˜์ชฝ์œผ๋กœ ์Šคํฌ๋กค๋˜๋ฉด ๋กœ๊ณ ๊ฐ€ ์กฐ๊ธˆ ์ปค์กŒ๋‹ค๊ฐ€ ๋‹ค์‹œ ์Šคํฌ๋กค์„ ์˜ฌ๋ฆฌ๋ฉด ๋กœ๊ณ ๊ฐ€ ์›๋ž˜๋Œ€๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋„ ์กฐ๊ธˆ!
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๊ธฐ๋Šฅ์„ ๋„ฃ์œผ๋ฉด์„œ ๋ถ€์ˆ˜์ ์œผ๋กœ ์„œ๋ธŒ๋ฉ”๋‰ด๋ฆฌ์ŠคํŠธ, ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ, ๋ฉ”์ธํ™”๋ฉด ์ƒ๋‹จ ์‚ฌ์ง„์˜ ์œ„์น˜์™€ ๊ฒน์ณค์„ ๋•Œ ๋ณด์ด๋Š” ์ˆœ์„œ ๋“ฑ์„ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค CSS

.navbar {
  min-width: 500px;
  position: fixed;
  width: 100%;
  z-index: 5;
}

#logo {
  color: rgb(112, 74, 25);
  font-weight: bold;
  font-size: 25px;
  flex-grow: 0.95;
  transition: all 0.5s;
}

.list-group {
  position: fixed;
  width: 100%;
  margin-top: 100px;
  z-index: 3;
  display: none;
  transition: margin-top 0.5s;
}

.alert {
  margin-top: 100px;
  position: fixed;
  width: 100%;
  z-index: 1;
  transition: margin-top 0.5s;
}
  • ์ƒ๋‹จ Navbar ์— position: fixed ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์ •์‹œํ‚ค๋ฉด์„œ ์„œ๋ธŒ๋ฉ”๋‰ด๋ฆฌ์ŠคํŠธ, ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ, ๋ฉ”์ธํ™”๋ฉด ์ƒ๋‹จ ์‚ฌ์ง„์˜ ์œ„์น˜๋“ค์ด ํ‹€์–ด์ ธ์„œ, ์ด๋ ‡๊ฒŒ ํ‹€์–ด์ง€๋Š” ์š”์†Œ๋“ค์—๋„ ๋˜‘๊ฐ™์ด position: fixed ์™€ width: 100% ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ์ด์ œ ์›ํ•˜๋Š” ํฌ๊ธฐ๋กœ ๋ชจ๋‘ ์ƒ๋‹จ ๊ณ ์ •์ด ๋˜์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ์š”์†Œ๋“ค์ด ์„œ๋กœ ๊ฒน์ณ์ง€๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ z-index๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ๊ฐ€ ์ œ์ผ ๋’ค์— ๋ฐฐ์น˜๋˜๊ณ , ๊ทธ ์œ„์— ์„œ๋ธŒ๋ฉ”๋‰ด๋ฆฌ์ŠคํŠธ, ๊ทธ ์œ„์— Navbar ๊ฐ€ ์œ„์น˜ํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ์š”์†Œ๋“ค์ด ๋ณ€ํ•˜๋Š” ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก transition ์†์„ฑ์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ๋ณดํ†ต์€ ํ•ด๋‹น ํƒœ๊ทธ์˜ ๋ชจ๋“  ์š”์†Œ(all)์— transition ์„ ๋ถ€์—ฌํ•˜๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‹ˆ ํƒœ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„๋“ค์˜ ์›€์ง์ž„์ด ์ข€ ์ด์ƒํ•ด์„œ margin-top ์š”์†Œ์— ๋„ฃ์–ด๋ณด์•˜๋‹ค. (์ข€ ๋‚˜์•„์ง€๊ธด ํ–ˆ๋Š”๋ฐ margin-top ์— transition ์†์„ฑ์ด ๋ถ€์—ฌ ๊ฐ€๋Šฅํ•œ ๊ฒŒ ๋งž๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค...)

๐Ÿค JavaScript

$(window).on('scroll', function(){
    if (window.scrollY > 100){
        $('#logo').css('font-size', '30px');
        $('.list-group').css('margin-top', '115px');
        $('.alert').css('margin-top', '115px');
    } else {
        $('#logo').css('font-size', '25px');
        $('.list-group').css('margin-top', '100px');
        $('.alert').css('margin-top', '100px');
    }
})
  • ๋ฉ”์ธํ™”๋ฉด์—์„œ Y์ถ•(์ƒ๋‹จ๋ถ€ํ„ฐ 0์œผ๋กœ ์‹œ์ž‘) ๊ธฐ์ค€์œผ๋กœ 100 ์ด์ƒ ์Šคํฌ๋กค์ด ๋‚ด๋ ค๊ฐ”์„ ๋•Œ ๋กœ๊ณ ์˜ ๊ธ€์”จ ํฌ๊ธฐ๊ฐ€ ๋” ์ปค์ง€๊ฒŒ ํ–ˆ๋‹ค.
  • ๋กœ๊ณ  ๊ธ€์”จ๊ฐ€ ์ปค์ง€๋ฉด์„œ Navbar์˜ ๋†’์ด๋„ ๋ณ€ํ•˜๋ฏ€๋กœ ์„œ๋ธŒ๋ฉ”๋‰ด๋ฆฌ์ŠคํŠธ์™€ ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ์˜ ์œ„์น˜๊ฐ€ ์กฐ๊ธˆ์”ฉ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๊ฒŒ margin-top ๊ฐ’์„ ์ข€ ๋” ํฌ๊ฒŒ ์žก์•„์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  100 ๋ณด๋‹ค ์ž‘์•„์ง€๋Š” ๊ฒฝ์šฐ ๋ฐ”๋€ ๋ถ€๋ถ„๋“ค์ด ์›๋ž˜๋Œ€๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด

  • ์ˆ˜์—…์—์„œ๋Š” ๊ธฐ์กด ๋ฉ”์ธํŽ˜์ด์ง€์˜ ํ•˜๋‹จ์— ์ด ํšŒ์›๊ฐ€์ž… ๋™์˜ํ•˜๋Š” ์–‘์‹ ๋ถ€๋ถ„์„ ๋งŒ๋“œ์…จ๋Š”๋ฐ, ๋‚˜๋Š” ์•„์ง ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ ๋‹ค๋ฅธ ํ™ˆํŽ˜์ด์ง€๋“ค์ฒ˜๋Ÿผ ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํŒ์—…ํ˜•ํƒœ๋กœ ํšŒ์›๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œจ๋“ ์ง€ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์„œ ํšŒ์›๊ฐ€์ž…์„ ํ•  ์ˆ˜ ์žˆ๋“ ์ง€.. ์—ฌํŠผ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ a ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํด๋ฆญํ•˜๋ฉด signup.html ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค. signup.html ํŒŒ์ผ์€ ์ผ๋‹จ ์ˆ˜์—…์„ ๋“ค์–ด์•ผํ•˜๊ธฐ์— ๋Œ€๊ฐ• ๋งŒ๋“ค์—ˆ๋‹ค.
  • ์ˆ˜์ •์„ ์ง„ํ–‰ํ• ์ˆ˜๋ก JavaScript, CSS ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๋‚ด์šฉ์ด ๋งŽ์•„์กŒ๋Š”๋ฐ, ์–ด์ฐจํ”ผ ๋ฉ”์ธํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ ํšŒ์›๊ฐ€์ž…ํ™”๋ฉด์ด๋ผ ๊ธฐ์กด์˜ JavaScript, CSS ํŒŒ์ผ์—์„œ ํšŒ์›๊ฐ€์ž…์— ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ข€ ๋ถ„๋ฆฌํ–ˆ๋‹ค. (์• ์ดˆ์— ์ปดํฌ๋„ŒํŠธํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ํŽธํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ์ด ๋“ ๋‹ค.)
  • ์ผ๋‹จ ๋ฉ”์ธํ™”๋ฉด๊ณผ ํฐ ์ด์งˆ๊ฐ์ด ์—†์—ˆ์œผ๋ฉด ํ•ด์„œ Navbar ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋Š”๋ฐ ํšŒ์›๊ฐ€์ž…ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ ๊ธฐ์กด Navbar ์˜ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์ด๋‚˜ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์€ ํ•„์š”์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ด ๋ถ€๋ถ„๋งŒ ๋บ๋‹ค. Dark Mode ์ „ํ™˜ํ•˜๋Š” ๊ฑด ๊ทธ๋Œ€๋กœ ๋‘๊ณ  JavaScript ๋ฅผ ์ข€ ์ˆ˜์ •ํ•œ ํ›„ ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.
  • ์ด์ œ ๊ฐ€์งœ(...) ํšŒ์›๊ฐ€์ž… ๋™์˜์„œ๋ฅผ ๊ฑฐ์˜ ๋๊นŒ์ง€ ์ฝ์œผ๋ฉด "๋‚ด์šฉ์„ ๋ชจ๋‘ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค." ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋˜ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ํ›„์—๋Š” ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋”ฑ 1๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค CSS

#sign-up-content {
  width: 500px;
  height: 600px;
  font-size: 16px;
  margin: 100px auto;
  padding: 20px 30px;
  border: 4px double gold;
  border-radius: 10px;
  overflow-y: scroll;
}

.title {
  font-weight: bold;
  text-align: center;
  padding: 20px 0;
}
  • ํ˜„์žฌ๋กœ์„œ๋Š” ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์„ ๊พธ๋ฏธ๋Š” ๊ฒŒ ๋ชฉ์ ์ด ์•„๋‹ˆ๊ธฐ์— ์‹ฌํ”Œํ•˜๊ฒŒ ๊ตฌ์ƒ‰๋งŒ ๋งž์ถฐ์ฃผ์—ˆ๋‹ค.
  • ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ๋ชฉ์ ์ด๊ณ  ๊ฐ€๋กœ ์Šคํฌ๋กค์€ ํ•„์š”๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ overflow ์†์„ฑ์ด ์•„๋‹Œ overflow-y ์†์„ฑ scroll ๋กœ ๋„ฃ์–ด ๋„˜์น˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์Šคํฌ๋กค์ด ์ƒ๊ธฐ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

๐Ÿค JavaScript

// div ์˜ ์Šคํฌ๋กค๋ฐ” ๋‚ด๋ฆฐ ์–‘(scrollTop) + ๋ˆˆ์— ๋ณด์ด๋Š” div ๋†’์ด(clientHeight) = div ์˜ ์‹ค์ œ๋†’์ด(scrollHeight)
$('#sign-up-content').on('scroll', function(){
    let top = document.querySelector('#sign-up-content').scrollTop;
    let sHeight = document.querySelector('#sign-up-content').scrollHeight;
    let cHeight = document.querySelector('#sign-up-content').clientHeight;
    
    if (top + cHeight > sHeight - 20){
        alert('๋‚ด์šฉ์„ ๋ชจ๋‘ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.');
        $('#sign-up-content').unbind('scroll'); // scroll ์ด๋ฒคํŠธ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ ํ›„ ์‚ญ์ œ
    }
})
  • ์Šคํฌ๋กค๋ฐ”๋ฅผ ๋‚ด๋ฆฐ ์–‘์„ ์ธก์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด .scrollTop, ๋ˆˆ์— ๋ณด์ด๋Š” ๋†’์ด๋ฅผ ์ธก์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด .scrollHeight ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘˜์„ ํ•ฉํ•œ ์–‘์€ ์‹ค์ œ ๋†’์ด๊ฐ€ ๋˜๋Š”๋ฐ, ๊ทธ ์‹ค์ œ ๋†’์ด๋ฅผ ์ธก์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด  .scrollHeight ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ์‹ค์ œ๋†’์ด์—์„œ 20 ์ •๋„ ๋บ€ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์žก๊ณ  ๋‚ด๊ฐ€ ์Šคํฌ๋กค์„ ์ญ‰ ๋‚ด๋ ค์„œ ๊ทธ ๊ธฐ์ค€๊ฐ’์ด ๋„˜์—ˆ์„ ๋•Œ ์›ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ .unbind ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์‚ญ์ œํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
728x90
๋ฐ˜์‘ํ˜•