JavaScript 코드를 사용하여 브라우저 너비를 얻는 방법은 무엇입니까?


180

현재 브라우저 너비를 얻기 위해 JavaScript 함수를 작성하려고합니다.

나는 이것을 찾았다.

javascript:alert(document.body.offsetWidth);

그러나 몸의 너비가 100 %라면 실패한다는 문제.

더 나은 기능이나 해결 방법이 있습니까?

답변:


133

2017 년 업데이트

원래 답변은 2009 년에 작성되었습니다. 여전히 작동하는 동안 2017 년에 업데이트하고 싶습니다. 브라우저는 여전히 다르게 동작 할 수 있습니다. jQuery 팀이 브라우저 간 일관성을 유지하는 데 큰 역할을한다고 확신합니다. 그러나 전체 라이브러리를 포함 할 필요는 없습니다. jQuery 소스에서 관련 부분은 dimension.js의 37 행에 있습니다. 여기에서 독립형으로 작동하도록 추출되고 수정됩니다.

function getWidth() {
  return Math.max(
    document.body.scrollWidth,
    document.documentElement.scrollWidth,
    document.body.offsetWidth,
    document.documentElement.offsetWidth,
    document.documentElement.clientWidth
  );
}

function getHeight() {
  return Math.max(
    document.body.scrollHeight,
    document.documentElement.scrollHeight,
    document.body.offsetHeight,
    document.documentElement.offsetHeight,
    document.documentElement.clientHeight
  );
}

console.log('Width:  ' +  getWidth() );
console.log('Height: ' + getHeight() );


원래 답변

모든 브라우저는 다르게 동작하므로 먼저 값을 테스트 한 다음 올바른 값을 사용해야합니다. 이를위한 기능은 다음과 같습니다.

function getWidth() {
  if (self.innerWidth) {
    return self.innerWidth;
  }

  if (document.documentElement && document.documentElement.clientWidth) {
    return document.documentElement.clientWidth;
  }

  if (document.body) {
    return document.body.clientWidth;
  }
}

높이와 마찬가지로 :

function getHeight() {
  if (self.innerHeight) {
    return self.innerHeight;
  }

  if (document.documentElement && document.documentElement.clientHeight) {
    return document.documentElement.clientHeight;
  }

  if (document.body) {
    return document.body.clientHeight;
  }
}

사용하여 스크립트에서이 두 가지를 전화 getWidth()또는 getHeight(). 브라우저의 기본 속성이 정의되어 있지 않으면를 반환 undefined합니다.


11
브라우저 창 너비를 기반으로 간단한 리디렉션을 위해 33k 라이브러리를 포함 할 필요가 없기 때문에 가장 좋은 대답
David Aguirre

1
이것은 jQuery 구현과 일관되게 올바른 (또는 예상되는) 결과를 생성합니다.
Emmanuel John

3
...이 세 가지 각각의 결과가 표시되고 모든 결과 (너비)가 다릅니다. 예를 들어 Chrome의 self.innerWidth 423경우 document.documentElement.clientWidth 326및을 참조하십시오 document.body.clientWidth 406. 이 경우 질문 : 어느 것이 정확하고 어느 것을 사용해야합니까? 예를 들어 Google지도의 크기를 조정하고 싶습니다. 326 또는 423의 큰 차이. 너비가 ~ 700이면 759, 735, 742 (큰 차이는 아님)를 참조하십시오.
Andris

1
@ user2118559 var pageWidth = Math.max(self.innerWidth || 0, document.documentElement.clientWidth || 0, document.body.clientWidth || 0);var windowWidth = self.innerWidth || -1;// "body"또는 "screen"또는 "document"때문에 html의 넘친 내용을 확인하면 이해할 수있는 "window"가 아닙니다. # i.stack.imgur.com/6xPdH.png
압둘라 아이 딘

1
예제의 복사-붙여 넣기 오류, 함수 getWidth()참조self.innerHeight
theGecko

309

엉덩이아프다 . 나는 넌센스를 생략하고 사용하는 것이 좋습니다 jQuery를 그냥 수행 할 수 있습니다, $(window).width().


2
올바르게 기억한다면 jQuery는 많은 차원을 핵심으로 끌어 들였습니다. 당신이 제안하는 것을하기 위해 여전히 차원이 필요합니까?
Nosredna 2016 년

당신이하지 않는 것으로 밝혀졌습니다. 굉장합니다. 답변 당 수정 헤드 업 주셔서 감사합니다.
chaos

6
jQuery의 $ (window) .width () 지원은 버전 1.2 이후입니다.
chaos

18
아래 답변의 예에 따라 $ (window) .width ()가 innerWidth / clientWidth와 항상 동일한 값을 반환하지는 않습니다. jQuery의 버전은 브라우저 스크롤 막대를 고려하지 않습니다 (어쨌든 FF). 이것은 CSS @media 쿼리가 잘못된 너비로 트리거되는 것처럼 많은 혼란을 초래했습니다. 기본 코드를 사용하면 스크롤 막대의 모양이 고려되므로보다 안정적으로 보입니다.
코더

5
창 너비를 얻기 위해 30k 줄의 코드를 추가하는 것은 나쁜 해결책입니다!
codechimp

49
var w = window.innerWidth;
var h = window.innerHeight;
var ow = window.outerWidth; //including toolbars and status bar etc.
var oh = window.outerHeight;

둘 다 정수를 반환하고 jQuery가 필요하지 않습니다. 크로스 브라우저 호환

jQuery가 width () 및 height ()에 대해 잘못된 값을 반환하는 경우가 종종 있습니다.


1
Safari iphone에서 이것을 사용하는 데 문제가 있습니다.
nu everest

17

왜 matchMedia를 언급하지 않습니까?

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

그렇게 많이 테스트하지는 않았지만 안드로이드 기본 브라우저와 안드로이드 크롬 브라우저, 데스크탑 크롬으로 테스트했지만 지금까지는 잘 작동하는 것처럼 보입니다.

물론 그것은 숫자 값을 반환하지 않지만 부울을 반환합니다-일치하거나 그렇지 않으면 질문에 정확히 맞지 않을 수도 있지만 그것은 우리가 어쨌든 원하는 것이며 아마도 저자가 원하는 것입니다.


1
IE10 + 만 지원합니다.
qarthandso

17
IE9 이상을 사용하는 경우 인터넷을 사용할 자격이 없습니다.
다리우스. V

Safari iphone은 이것을 지원하지 않는 것 같습니다.
nu everest

최신 iOS Safari 버전은 matchMedia를 지원해야합니다. 출처 : caniuse.com/#feat=matchmedia
Vargr

8

W3schools와 크로스 브라우저에서 IE의 암흑 시대로 거슬러 올라갑니다!

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

var h = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight;

var x = document.getElementById("demo");
x.innerHTML = "Browser inner window width: " + w + ", height: " + h + ".";

alert("Browser inner window width: " + w + ", height: " + h + ".");

</script>

</body>
</html>

이 접근법은 다른 솔루션 (jQuery 사용 제외)보다 훨씬 짧기 때문에 아름답게 작동하며 받아 들일 수있는 대답이 될 수 있습니다.
Simon Steinberger

2
document.documentElement가 정의되지 않은 경우 오류가 발생하지 않습니까?
PhiLho

6

위에 제시된 기능의 짧은 버전은 다음과 같습니다.

function getWidth() {
    if (self.innerWidth) {
       return self.innerWidth;
    }
    else if (document.documentElement && document.documentElement.clientHeight){
        return document.documentElement.clientWidth;
    }
    else if (document.body) {
        return document.body.clientWidth;
    }
    return 0;
}

4
모든 조건이 거짓이면 값을 반환하지 못합니다.
Mike C

10
당신은 다른 사람이 필요하지 않습니다 :)
Nick

0

Travis의 답변에 대한 현대 JS에 적합한 솔루션 :

const getPageWidth = () => {
  const bodyMax = document.body
    ? Math.max(document.body.scrollWidth, document.body.offsetWidth)
    : 0;

  const docElementMax = document.documentElement
    ? Math.max(
        document.documentElement.scrollWidth,
        document.documentElement.offsetWidth,
        document.documentElement.clientWidth
      )
    : 0;

  return Math.max(bodyMax, docElementMax);
};

0

트래비스의 답변에 중요한 추가 사항; 스크롤바 너비를 계산하려면 getWidth ()를 문서 본문에 넣어야하며, 그렇지 않으면 브라우저의 스크롤바 너비를 getWidth ()에서 빼야합니다. 제가 한 ;

<body>
<script>
function getWidth(){
return Math.max(document.body.scrollWidth,
document.documentElement.scrollWidth,
document.body.offsetWidth,
document.documentElement.offsetWidth,
document.documentElement.clientWidth);
}
var aWidth=getWidth();
</script>
</body>

나중에 어디서나 aWidth 변수를 호출하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.