본문 바로가기
JavaScript

JavaScript] Window sizes and scrolling

by Fastlane 2022. 11. 14.
728x90
반응형

출처 : https://javascript.info/size-and-scroll-window

browser window의 width, height를 어떻게 구할 수 있을까? document의 full width, height를 어떻게 구할 수 있을까?

JavaScript로 page를 어떻게 scroll할 수 있을까?

Width/height of the window

window 가로세로를 알기 위해서, document.documentElement.clientWidth/clientHeight를 사용할 수 있다. 

window.innerWidth/innerHeight는 scrollbar를 포함한다. 

alert( window.innerWidth ); // window 가로 전체
alert( document.documentElement.clientWidth ); // window 가로에서 scrollbar를 뺀 것

Width/height of the document

root document element는 document.documentElement이다. 그리고 모든 컨텐츠를 갖고 있으며 document.documentElement.scrollWidth/scrollHeight로 document의 전체 사이즈를 측정할 수 있다. 

 

하지만 Chrome/Safari/Opera에서 잘 작동하지 않고, scroll이 없는 경우 documentElement.scrollHeight는 documentElement.clientHeight보다 작아진다. 

 

안정적으로 값을 얻기 위해서는 이 properties의 maxium을 찾아야 한다. 

let scrollHeight = Math.max(
  document.body.scrollHeight, document.documentElement.scrollHeight,
  document.body.offsetHeight, document.documentElement.offsetHeight,
  document.body.clientHeight, document.documentElement.clientHeight
);

alert('Full document height, with scrolled out part: ' + scrollHeight);

Get the current scroll

DOM elements는 scrollLeft/scrollTop properties값에 현재 scroll 상태를 갖고 있다. 

alert('Current scroll from the top: ' + window.pageYOffset);
alert('Current scroll from the left: ' + window.pageXOffset);

window.scrollX/scrollY를 사용할 수도 있다. 

Scrolling: scrollTo, scrollBy, scrollIntoView

* JavaScript로 page를 scroll하기 위해서는 DOM이 완전히 built되어야 한다. 따라서 <head>에 있는 script로 page를 scroll하려고 하면 동작하지 않는다. 

일반적인 element는 scrollTop/scrollLeft 변경에 의해 scroll된다. 

page에도 동일하게 document.documentElement.scrollTop/scrollLeft를 사용할 수 있다. 

window.scrollBy(x, y), window.scrollTo(pageX, pageY)라는 함수로 더 간단히 처리할 수 있다. 

  • scrollBy(x, y) : 현재 위치로 부터 상대적으로 page를 scroll한다. 예를들어 scrollBy(0, 10)하면 page를 10px scroll down한다. 
  • scrollTo(pageX, pageY) : page를 절대좌표로 scroll한다. visible part의 top-left corner는 document의 top-left corner에 상대적인 (pageX, pageY)좌표값을 갖는다. 처음으로 돌아가려면 scrollTo(0, 0)사용하면 된다. 

scrollIntoView

elem.scrollIntoView(top) : elem visible되도록 page를 scroll한다. 

  • top = true (default) : elem이 window의 top에 나타나도록 page를 scroll한다. 
  • top = false : element의 bottom edge가 window bottom과 나란하게 보이도록 page를 scroll한다. 

Forbid the scrolling

page를 unscrollable하게 하려면 document.body.style.overflow = "hidden"으로 설정하면 된다. 

page는 현재 scroll position에서 고정된다. 

document.body.style.overflow = "hidden"; //스크롤되지 않게 한다. 
document.body.style.overflow = ""; //다시 스크롤되게 한다.

document.body 뿐만 아니라 다른 element에도 적용할 수 있다. 

Summary

Geometry : 

  • document의 visible part의 width/height : document.documentElement.clientWidth/clientHeight
  • scrolled out part 포함된 전체 document의 width/height
let scrollHeight = Math.max(
  document.body.scrollHeight, document.documentElement.scrollHeight,
  document.body.offsetHeight, document.documentElement.offsetHeight,
  document.body.clientHeight, document.documentElement.clientHeight
);

Scrolling : 

  • 현재 스크롤 값 : window.pageYOffset/pageXOffset
  • 현재 scroll 변경
    • window.scrollTo(pageX, pageY)
    • window.scrollBy(x, y)
    • elem.scrollIntoView(top

 

728x90
반응형

댓글