일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- tanstack query
- tailwind
- 그리디
- reduxtoolkit
- React Query
- 리덕스
- JavaScript
- styled component
- 프로그래머스
- 토이프로젝트
- React
- 리액트 라우터 돔
- Form
- 토이 프로젝트
- revalidatepath
- 코딩테스트
- 동적계획법
- 리액트
- TypeScript
- Supabase
- react pattern
- 리액트 패턴
- 타입스크립트
- 코테
- 프론트엔드
- 자바스크립트
- 스택
- 코어자바스크립트
- react router dom
- Next.js
- Today
- Total
느려도 한걸음씩
원하는 곳으로 스크롤하기 - (getBountdingClientRect , scrollTo, scrollIntoView) 본문
원하는 곳으로 스크롤하기 - (getBountdingClientRect , scrollTo, scrollIntoView)
hoj0806 2024. 10. 20. 16:43웹 페이지에서 버튼을 눌러 원하는 곳으로 스크롤 되게 해보자
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', e => {
const s1coords = section1.getBoundingClientRect();
console.log(s1coords);
window.scrollTo({
left: s1coords.left,
top: s1coords.top,
});
});
btnScrollTo는 버튼 요소이고 section1이 버튼을 눌렀을때 스크롤되길 원하는 요소이다
버튼 요소에 이벤트리스너를 달아주고 getBountdingClientRect 함수를 통해 해당 요소의 좌표값을 구해준다
s1coords를 콘솔에 출력하면 이렇게 생겼는데 해당 요소로부터 떨어져있는 거리가 나와있다 top과 left를 통해 요소의 상단과 왼쪽 위치를 구 할수 있다
window.scrollTo 메서드에 객체를 넣어주는데 left와 top에 해당 값을 넣어준다 하지만 이렇게만 작성하면 제대로 작동하지 않을것이다
현재 브라우저의 스크롤 위치에 따라 이동하는 위치가 달라진다 getBoundingClientRect()는 화면에 보이는 영역을 기준으로 요소의 위치를 계산하기 때문이다 따라서 좌표에 window.pageXOffset, window.pageYOffset을 더해줘 스크롤 위치가 문서 전체에 정확하게 계산되게 만들어준다 또한 behavior 프로퍼티를 이용해 부드러운 스크롤링 효과를 줄수도 있다
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', e => {
const s1coords = section1.getBoundingClientRect();
window.scrollTo({
left: s1coords.left + window.pageXOffset,
top: s1coords.top + window.pageYOffset,
behavior: 'smooth',
});
});
사실 이렇게 복잡하게 좌표계산을 통해 움직이지 않아도 된다 scrollIntoView를 메서드를 이용해 behavior값만 주기만 하면 원하는 좌표를 자동으로 계산해 스크롤이 이동하게 해준다 그러나 옛날 브라우저에서는 작동하지 않을 수도 있다
const section1 = document.querySelector('#section--1');
// DOM 요소 선택후 scrollIntoView 메서드 사용
section1.scrollIntoView({ behavior: 'smooth' });
참고문서
https://developer.mozilla.org/ko/docs/Web/API/Element/getBoundingClientRect
Element.getBoundingClientRect() - Web API | MDN
Element.getBoundingClientRect() 메서드는 엘리먼트의 크기와 뷰포트에 상대적인 위치 정보를 제공하는 DOMRect 객체를 반환합니다.
developer.mozilla.org
https://developer.mozilla.org/ko/docs/Web/API/Window/scrollTo
Window.scrollTo() - Web API | MDN
문서의 지정된 위치로 스크롤합니다.
developer.mozilla.org
https://developer.mozilla.org/ko/docs/Web/API/Element/scrollIntoView
element.scrollIntoView - Web API | MDN
Element 인터페이스의 scrollIntoView() 메소드는 scrollIntoView()가 호출 된 요소가 사용자에게 표시되도록 요소의 상위 컨테이너를 스크롤합니다.
developer.mozilla.org
'FE develop > Javascript' 카테고리의 다른 글
자바스크립트 비동기 이해하기 - (2) 비동기 콜백 (0) | 2025.04.16 |
---|---|
자바스크립트 비동기 이해하기 - (1) 동기 vs 비동기 (0) | 2025.04.16 |
DOM - 이벤트 위임(Event Delegation) (1) | 2024.10.22 |
자바스크립트에서 특수문자 표시하기 (1) | 2024.08.02 |
import / export 문법 (0) | 2024.03.26 |