javascript+es6

[ javascript ] 17. window,스크롤, 마우스 좌표, getBoundingClientRect, document

변쌤(이젠강남) 2023. 10. 16. 01:11
반응형

window, 스크롤, 마우스 좌표, getBoundingClientRect

 

 

# window

window.open(url, windowName, [windowFeatures]);
window.open(url, 창이름,옵션);
옵션의 이름 설명
width 창 너비
height 창 높이
location 주소 표시줄 표시 여부 (yes 또는 no)
scrollbars 스크롤 막대 표시 여부
resizable 창 크기의 변경 기능 여부
toolbar 도구 모음 표시 여부
status 상태 표시줄 표시 여부
menubar 메뉴 막대 표시 여부 
let w = window.open(
    'http://www.naver.com',
    'naver',
    'height=600,width=600');

setTimeout(() => {
    w.close();
}, 3000);

 

 

# 스크롤 효과

    mdn
scrollTo  스크롤 위치 바로가기
scroll  스크롤 위치 바로가기

 

# scrollTo : 문서의 지정위치로 이동

window.scrollTo({ left: x, top: y, behavior: "smooth" })

 

behavior 옵션
- auto : 기본값, 바로 위치로 이동
- smooth : 부드럽게 이동

 

 

# 스크롤 위치

이벤트 : scroll 

속성 내용
window.scrollX 윈도우 가로 스크롤값
window.scrollY 윈도우 세로 스크롤값
window.addEventListener('scroll', e => {
  console.log('스크롤가로:', window.scrollX,'스크롤세로:', window.scrollY);
});

 

 

window.pageYOffset

현재 문서의 세로 스크롤 위치를 가져옵니다.

 

document.documentElement.scrollTop

문서의 최상단에서 스크롤된 세로 픽셀 값을 가져옵니다.


document.body.scrollTop: 문서의 <body> 요소의 최상단에서 스크롤된 세로 픽셀 값을 가져옵니다. (몇몇 브라우저에서만 지원됩니다.)

 

 

# 마우스의 좌표를 확인

속성 내용
event.clientX 브라우저 좌측 상단 기준 X 좌표 
event.clientY 브라우저 좌측 상단 기준 Y 좌표
event.pageX 브라우저 전체 페이지 좌측 상단 기준 X 좌표
event.pageY 브라우저 전체 페이지 좌측 상단 기준 Y 좌표
event.screenX 디바이스 좌측 상단 기준 X 좌표
event.screenY 디바이스 좌측 상단 기준 Y 좌표
event.offsetX 요소 좌측 상단 기준 X 좌표
event.offsetY 요소 좌측 상단 기준 Y 좌표

 

 

pageX, pageY는 페이지 스크롤 분량의 정보도 포함하며, 
screenX, screenY는 웹 페이지를 보고 있는 디바이스(컴퓨터, 스마트폰)의 좌측 위를 기준으로 합니다.

 

document.addEventListener('mousemove', e => {
    console.log('e.clientX, e.clientY' , e.clientX, e.clientY)
    console.log('e.pageX, e.pageY', e.pageX, e.pageY)
    console.log( 'e.screenX, e.screenY',e.screenX, e.screenY)
    console.log( 'e.offsetX, e.offsetY',e.offsetX, e.offsetY)
})

 

 

const width =
    window.innerWidth ||
    document.documentElement.clientWidth ||
    document.body.clientWidth;

const height =
    window.innerHeight ||
    document.documentElement.clientHeight ||
    document.body.clientHeight;

 

 

결과

 

 

속성 내용
getBoundingClientRect 엘리먼트의 크기와 뷰포트에 상대적인 위치 정보를 제공  바로가기
offsetTop 부모를 기준으로 상대위치  바로가기
offsetLeft 부로를 기준으로 상대위치

 

 

 

# Element.getBoundingClientRect()

Element.getBoundingClientRect() 메서드는 엘리먼트의 크기와 뷰포트에 상대적인 위치 정보를 제공하는 DOMRect 객체를 반환합니다.

 

domRect = element.getBoundingClientRect();

 

반환 값은 padding과 border-width를 포함해 전체 엘리먼트가 들어 있는 가장 작은 사각형인 DOMRect 객체입니다. left, top, right, bottom, x, y, width, height 프로퍼티는 전반적인 사각형의 위치와 크기를 픽셀 단위로 나타냅니다. width와 height가 아닌 다른 프로퍼티는 뷰포트의 top-left에 상대적입니다.

 

getBoundingClientRect

 

 

 

 

ele.getBoundingClientRect().x : 현재 창기준 x좌표
ele.getBoundingClientRect().y : 현재 창기준 y좌표
ele.getBoundingClientRect().width : 엘리먼트 가로
ele.getBoundingClientRect().height : 엘리먼트 세로
ele.getBoundingClientRect().top : 현재 창기준 세로 시작점 부터 엘리먼트 윗변 까지의 거리
ele.getBoundingClientRect().left : 현재 창기준 가로 시작점 부터 엘리먼트 왼쪽변 까지의 거리
ele.getBoundingClientRect().right : 현재 창기준 가로 시작점 부터 엘리먼트 오른쪽변 까지의 거리
ele.getBoundingClientRect().bottom : 현재 창기준 세로 시작점 부터 엘리먼트 아래변 까지의 거리

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">    
    <title>Document</title>
    <style>        
        .box{
            width: 200px; height: 200px;
            position: absolute; left: 300px; top: 200px; 
            border: 1px solid #000;
            background: pink; box-sizing: border-box;
        }
    </style>
    
</head>
<body>
    <div class="box">xx</div>
    <script>
    let box = document.querySelector(".box").getBoundingClientRect();
    console.log(`x: ${box.x}`);
    console.log(`y: ${box.x}`);
    console.log(`left: ${box.left}`);
    console.log(`top: ${box.top}`);
    console.log(`right: ${box.right}`);
    console.log(`bottom: ${box.bottom}`);
    console.log(`width: ${box.width}`);
    console.log(`height: ${box.height}`);
    </script>
</body>
</html>

 

결과

getBoundingClientRect

x : 뷰포트로부터 요소의 왼쪽 상단 모서리 가로 위치값

y : 뷰포트로부터 요소의 왼쪽 상단 모서리 세로 위치값

left : 뷰포트로 부터 요소의 왼쪽 위치값

top : 뷰포트로 부터 요소의 위쪽 위치값

right : 뷰포트로 부터 요소의 오른쪽 위치값

bottom : 뷰포트로 부터 요소의 아래쪽 위치값

width : 요소의 가로 크기(padding, border 포함)

height : 요소의 세로 크기(padding, border 포함)

 

 

# 요소의 너비 높이 추출 

offsetWidth, offsetHeight, clientWidth, clientHeight, scrollWidth, scrollHeight

 

  • offsetWidth와 offsetHeight: 요소의 보더와 스크롤바를 포함한 전체 너비와 높이를 반환합니다.
  • clientWidth와 clientHeight: 요소의 패딩을 포함한 콘텐츠 영역의 너비와 높이를 반환합니다.
  • scrollWidth와 scrollHeight: 콘텐츠의 전체 너비와 높이를 반환합니다. (스크롤이 필요할 경우, 스크롤된 영역 포함)

 

 

 

offsetWidth와  getBoundingClientRect의 차이점

 

offsetWidth는 엘리먼트의 레이아웃 width(정수형)를 리턴하는 읽기 전용 프로퍼티입니다.

가상 선택자인 before, after를 제외한 모든 CSS width, border, padding, scrollbar 등을 포함해서 계산을 합니다.

만약 엘리먼트가 display: none 이거나 부모가 none 이면 0을 리턴합니다.

getBoundingClientRect 뷰포트에서 상대적인 엘리먼트의 크기를 리턴합니다.
엘리먼트 크기는 width, height + padding과 같습니다.

두 프로퍼티의 차이는 offsetWidth는 정수형 값으로 반올림하며 getBoundingClientRect는 소수점까지 값을 리턴합니다.

 

 

# new Event()

새로운 이벤트 객체를 생성하는 생성자 함수입니다. 이 생성자 함수를 사용하여 이벤트 객체를 만들 수 있습니다.

 event = new Event(typeArg, eventInit);

 


typeArg: 생성할 이벤트의 종류를 지정하는 문자열입니다. 이는 이벤트의 유형을 나타내는 문자열로서, "click", "mouseover", "keydown" 등이 될 수 있습니다.
eventInit (선택적): 이벤트의 초기화 객체입니다. 주로 bubbles, cancelable 등의 속성을 설정할 때 사용됩니다.

 

 

# dispatchEvent 메서드

DOM 요소에 이벤트를 프로그래밍적으로 전달하는 데 사용.  Event 객체를 인자로 받아 해당 이벤트를 발생시킵니다.

 

 EventTarget 인터페이스에 속하는 모든 DOM 요소에서 사용할 수 있습니다. 이벤트를 수신할 수 있는 모든 DOM 요소, 즉 이벤트를 발생시킬 수 있는 요소에 dispatchEvent를 사용할 수 있습니다.

 

dispatchEvent를 사용하여 특정 이벤트를 발생시키면 이벤트가 버블링되어 상위 요소로 전파됩니다. 따라서 해당 요소에 이벤트 리스너가 등록되어 있는 경우 이벤트가 발생하고 해당 리스너가 실행됩니다.

 

형식) 

//이벤트 생성
let clickEvent = new Event('click');


//생성된 이벤트 객체를 dispatchEvent() 메서드를 사용하여 DOM 요소에 전달하여 해당 이벤트를 발생
element.dispatchEvent(clickEvent);

 

 

function showMessage() {
    box.innerText = "버튼이 클릭되었습니다.";
}

// 버튼에 클릭 이벤트 리스너 등록
button.addEventListener("click", showMessage);

// 이벤트를 트리거하여 버튼을 클릭한 것처럼 함
function triggerEvent() {
    // 새로운 클릭 이벤트 생성
    let event = new Event("click");
    // 버튼에 생성한 이벤트를 전달
    button.dispatchEvent(event);
    // 이벤트를 발생시키는 것
    
}

// 함수 실행
triggerEvent()

 

 

# document.documentElement  

 

  1. 속성:
    • document.documentElement.scrollTop: 문서의 세로 스크롤 위치를 픽셀 단위로 나타냅니다.
    • document.documentElement.scrollLeft: 문서의 가로 스크롤 위치를 픽셀 단위로 나타냅니다.
    • document.documentElement.scrollHeight: 문서의 세로 스크롤 가능한 전체 높이를 픽셀 단위로 나타냅니다.
    • document.documentElement.scrollWidth: 문서의 가로 스크롤 가능한 전체 너비를 픽셀 단위로 나타냅니다.
    • 그 외에도 HTML 요소의 다양한 속성을 읽거나 변경할 수 있습니다.
  2. 메서드:
    • document.documentElement.scrollTo(x, y): 문서를 지정된 좌표(x, y)로 스크롤합니다.
    • document.documentElement.scrollBy(x, y): 현재 스크롤 위치에서 지정된 양(x, y)만큼 스크롤합니다.

 

 

 

  1. scrollTop:
    • document.documentElement.scrollTop 속성은 문서의 가장 위쪽에서 스크롤된 거리를 나타냅니다. 픽셀 단위로 반환됩니다.
    • 이 값을 변경하여 스크롤 위치를 조절할 수 있습니다. 예를 들어, document.documentElement.scrollTop = 0은 페이지의 맨 위로 스크롤합니다.
  2. scrollLeft:
    • document.documentElement.scrollLeft 속성은 문서의 가장 왼쪽에서 스크롤된 거리를 나타냅니다. 픽셀 단위로 반환됩니다.
    • 이 값을 변경하여 가로 스크롤 위치를 조절할 수 있습니다.
  3. scrollTo(x, y):
    • document.documentElement.scrollTo(x, y) 메서드는 문서를 지정된 좌표(x, y)로 스크롤합니다.
    • 예를 들어, document.documentElement.scrollTo(0, 0)은 페이지의 맨 위로 스크롤합니다.
  4. scrollBy(x, y):
    • document.documentElement.scrollBy(x, y) 메서드는 현재 스크롤 위치에서 지정된 양(x, y)만큼 스크롤합니다.
    • 양수 값은 아래쪽 및 오른쪽으로, 음수 값은 위쪽 및 왼쪽으로 스크롤합니다.
  5. scrollHeight:
    • document.documentElement.scrollHeight 속성은 문서의 내용이 넘쳐나는 경우 전체 스크롤 가능한 높이를 나타냅니다.
  6. scrollWidth:
    • document.documentElement.scrollWidth 속성은 문서의 내용이 넘쳐나는 경우 전체 스크롤 가능한 너비를 나타냅니다.

 

 

// 뷰포트 너비와 높이
let viewportWidth = document.documentElement.clientWidth;
let viewportHeight = document.documentElement.clientHeight;

// 문서의 전체 너비와 높이
let documentWidth = document.documentElement.scrollWidth;
let documentHeight = document.documentElement.scrollHeight;

// 문서의 오프셋 너비와 높이
let offsetWidth = document.documentElement.offsetWidth;
let offsetHeight = document.documentElement.offsetHeight;

console.log('Viewport Width: ' + viewportWidth);
console.log('Viewport Height: ' + viewportHeight);
console.log('Document Width: ' + documentWidth);
console.log('Document Height: ' + documentHeight);
console.log('Offset Width: ' + offsetWidth);
console.log('Offset Height: ' + offsetHeight);

 

 

반응형