๋“ค์–ด๊ฐ€๋ฉฐ๐Ÿ˜ƒ


๊ต์œก์‹œ๊ฐ„์— ๊ฐ„๋‹จํ•œ ์ฑ„ํŒ…์ฐฝ์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋Š”๋ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ด๋Š” div๊ฐ€ ๋„˜์น˜๋ฉด ์ตœ์‹  ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ตœ ์ƒ๋‹จ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ณ„์† ๋ณด์ด๋Š” ๊ฑธ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

์Šคํฌ๋กค ์ด๋ฒคํŠธ ์ ์šฉ ์ „

์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ๋ชจ๋“  ์ฑ„ํŒ…์ฐฝ๋“ค์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์œ„์—์„œ ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์Œ“์ด๊ณ , ๊ฐ€์žฅ ์ตœ์‹  ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š” ๋งจ ์•„๋ž˜ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ธฐ์— ์›๋ฆฌ๊ฐ€ ๊ถ๊ธˆํ–ˆ๊ณ  UX๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ ์Šคํฌ๋กค ์†์„ฑ์„ ์กฐ์ •ํ•˜๋ฉด ๋๋Š”๋ฐ ์˜ค๋Š˜์€ ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ๋†’์ด ๊ด€๋ จ ์†์„ฑ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๋ ค ํ•œ๋‹ค.




scrollTop


scrollTop์€ DOM ์š”์†Œ์˜ ์ˆ˜์ง ์Šคํฌ๋กค ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์ด๋‹ค. ์ˆ˜์ง ์Šคํฌ๋กค๋ฐ”๋ฅผ ๊ฐ€์ง„ ์š”์†Œ์—์„œ ์Šคํฌ๋กค๋ฐ”์˜ ์œ„์น˜๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž.

์šฐ์„  3๊ฐœ์˜ ๋ธ”๋Ÿญ์„ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ๋ธ”๋Ÿญ๋“ค์„ container๋กœ ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค. (๊ฐ๊ฐ์˜ ๋†’์ด๋Š” ์ฃผ์„ ์ฐธ๊ณ ) container๋Š” ์ผ๋ถ€๋Ÿฌ ์•ˆ์˜ ์š”์†Œ๊ฐ€ ๋„˜์น˜๋„๋ก 300px๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๊ณ  overflow-y: scroll ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

<div class="container">
  {/* height: 300px */}
  <div id="first">first</div> {/* height: 100px */}
  <div id="second">second</div> {/* height: 200px */}
  <div id="third">third</div> {/* height: 100px */}
</div>


๊ทธ๋ฆฌ๊ณ  ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค ์Šคํฌ๋กค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€๋ณด์ž

    <script>
      const container = document.querySelector(".container");

      {/* ์‹ค์‹œ๊ฐ„ scrollTop ๋กœ๊ทธ ์ฐ๊ธฐ */}
         function handleScroll() {
           const scrollTop = container.scrollTop;
           console.log("Scroll position:", scrollTop);
         }

         container.addEventListener("scroll", handleScroll);
    </script>

์Šคํฌ๋กค ์ด๋ฒคํŠธ ์ ์šฉ ์ „

์œ„์˜ ์ด๋ฏธ์ง€์—์„œ ๋ณด๋Š”๊ฒƒ์ฒ˜๋Ÿผ scroll ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ์— scrollTop ๋กœ๊ทธ๊ฐ€ ๊ณ„์† ์ฐํžˆ๊ณ  ์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  scrollTop ์„ค์ •์„ ์ œ์–ดํ•ด๋ณด์ž.

<script>
  const container = document.querySelector(".container"); container.scrollTop =
  100;
</script>

scrollTop 100

์Šคํฌ๋กค์ด ์ƒ์„ฑ๋œ ์˜์—ญ์—์„œ scrollTop = n์„ ์ •ํ•ด์ฃผ๋ฉด ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋  ๋•Œ ๊ทธ ๊ฐ’๋งŒํผ ์Šคํฌ๋กค ๊ฐ’์ด ์ง€์ •๋œ๋‹ค. ๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š” 3๊ฐœ์˜ ๋ฐ•์Šค์ค‘ ์ œ์ผ ์ƒ๋‹จ์˜ ๋ฐ•์Šค ๋†’์ด๊ฐ€ โ€œ100xโ€ ์ด์˜€๊ธฐ ๋•Œ๋ฌธ์— scrollTop = 100 ์œผ๋กœ ์ธํ•ด ์ฒซ๋ฒˆ์งธ ๋ธ”๋Ÿญ์ด ์™„์ „ํžˆ ์ˆจ๊ฒจ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

์—‡!! ๊ทธ๋ ‡๋‹ค๋ฉด scroll์„ ๊ฒŒ์† ์•„๋ž˜๋กœ ์œ ์ง€ํ•œ๋‹ค๋ฉด ์ฑ„ํŒ…๋ฐฉ์—์„œ ๊ณ„์† ์ตœ์‹  ์ฑ„ํŒ…์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๊ฑด๊ฐ€???๐Ÿคท๐Ÿปโ€โ™€๏ธ
ํ—ˆํ—ˆ ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋‹ค.๐Ÿ˜Ž ์ด๋ก ์ƒ scrollTop = ๋‚ด๊ฐ€ ์›ํ•˜๋Š” DOM์˜ ๋†’์ด ๋ฉด ๋˜์•ผํ•˜๋Š”๋ฐ,,, ๊ทธ๋ ‡์ง€๋งŒ ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š๋‹ค. ์ฑ„ํŒ…์ด ์ฃผ๊ณ ๋ฐ›์•„์ง€๋ฉด ๊ทธ ์ฑ„ํŒ…๋ฐฉ์˜ ๋†’์ด ์†์„ฑ์€ ๊ณ„์† ๋ณ€ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง€์†์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋†’์ด ์†์„ฑ์„ ์•Œ์•„์•ผํ•œ๋‹ค.



scrollHeight


scrollHeight ๋Š” DOM ์š”์†Œ์˜ ์‹ค์ œ ๋†’์ด๊ฐ’์ด๋‹ค. ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ์˜์—ญ ์™ธ์— ์ „์ฒด ๊ฐ’์„ ๋œปํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ container ์˜ ๋ณด์—ฌ์ง€๋Š” ๋†’์ด๋Š” 300px ์ด์ง€๋งŒ ์‹ค์ œ ๋‚ด๋ถ€์— 3๊ฐœ์˜ ๋ธ”๋Ÿญ์ด ์†ํ•ด์žˆ๋‹ค. ๊ทธ 3๊ฐœ์˜ ๋†’์ด ๊ฐ’์„ ๋‹ค ๋”ํ•œ๊ฒŒ 400px ์ด๊ณ  ์ด๊ฒƒ์ด scrollHeight ๊ฐ’์ด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋†’์ด ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ?



clientHeight


clientHeight ๋Š” ํ˜„์žฌ ๋ณด์—ฌ์ง€๋Š” ๊ฐ’์ด๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ container์˜ ๋†’์ด ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋˜ 300px ์ด client ๊ฐ’์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์‹ค์ œ๋กœ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

scrollHeight, clientHeight


์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋กœ ์ •๋ฆฌํ•ด๋ดค๋‹ค.

scrollHeight, clientHeight



์ฑ„ํŒ…๋ฐฉ ์•„๋ž˜๋กœ ์œ ์ง€์‹œํ‚ค๊ธฐ


๊ทธ๋ ‡๋‹ค๋ฉด ์ฑ„ํŒ…์ฐฝ์€ ์ฑ„ํŒ…์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ์‹ค์ œ DOM ์˜ ๊ฐ€์žฅ ์•„๋ž˜์— ์ตœ์‹  ์ฑ„ํŒ…์ด ๋ฐฐ์น˜๋˜๊ธฐ ๋•Œ๋ฌธ์— scrollHeight ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.

chatDiv.scrollTop = chatDiv.scrollHeight;



์‚ฌ์‹ค ๊ฒฐ๋ก ์€ ์ด๊ฒŒ ๋์ด๋‹ค. ๋งค์šฐ ๋‹จ์ˆœํ•˜๋‹ค.๐Ÿ™ƒ

scrollTop Log

์ง ! ์œ„์˜ ์†์„ฑ์„ ์ ์šฉ์‹œ์ผœ์ฃผ๋ฉด ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์ฑ„ํŒ…์„ ๊ณ„์† ์ถ”๊ฐ€ํ•ด๋„ ํ™”๋ฉด์ด ๊ณ„์† ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.





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