如何使用 JavaScript 代码获取浏览器宽度?

IT技术 javascript html css
2021-01-12 17:44:20

我正在尝试编写一个 JavaScript 函数来获取当前浏览器的宽度。

我找到了这个:

console.log(document.body.offsetWidth);

但它的问题是,如果主体的宽度为 100%,它就会失败。

还有其他更好的功能或解决方法吗?

6个回答

这是一个痛苦的屁股我建议跳过废话并使用jQuery,它可以让您只做$(window).width().

根据下面答案中的示例,我发现 $(window).width() 并不总是返回与 innerWidth / clientWidth 相同的值。jQuery 的版本不考虑浏览器滚动条(无论如何在 FF 中)。这让我对 CSS @media 查询似乎以错误的宽度触发感到很困惑。使用本机代码似乎更可靠,因为它考虑了滚动条的外观。
2021-03-13 17:44:20
@codechimp “添加 30k 行代码来获取窗口宽度是一个糟糕的解决方案!” 继续添加一个 80k 文件只是为了获得窗口宽度。坏是相对的。
2021-03-18 17:44:20
jQuery 中的 $(window).width() 支持从 1.2 版开始,以防它与任何人相关。
2021-03-26 17:44:20
如果我没记错的话,jQuery 已经将很多维度引入了核心。您是否仍然需要尺寸来执行您的建议?
2021-04-11 17:44:20
添加 30k 行代码来获取窗口宽度是一个糟糕的解决方案!
2021-04-12 17:44:20

2017 年更新

我最初的答案是在 2009 年写的。虽然它仍然有效,但我想在 2017 年更新它。浏览器的行为仍然会有所不同。我相信 jQuery 团队在保持跨浏览器一致性方面做得很好。但是,没有必要包含整个库。在 jQuery 源代码中,相关部分可以在维度.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.

与 jQuery 的实现相比,这会产生一致的正确(或预期)结果。
2021-03-30 17:44:20
最佳答案,因为我不必为基于浏览器窗口宽度的简单重定向包含 33k 库
2021-04-02 17:44:20
您的示例中的复制粘贴错误,函数getWidth()引用self.innerHeight
2021-04-03 17:44:20
...这三个中的每一个都显示了一些结果,所有结果(宽度)都不同。例如谷歌浏览器看到self.innerWidth 423document.documentElement.clientWidth 326document.body.clientWidth 406在这种情况下,问题是:哪个是正确的,使用哪个?例如我想调整谷歌地图的大小。326和423差别很大。如果宽度~700,那就看759、735、742(差别不大)
2021-04-10 17:44:20
@user2118559var pageWidth = Math.max(self.innerWidth || 0, document.documentElement.clientWidth || 0, document.body.clientWidth || 0);var windowWidth = self.innerWidth || -1;// 因为“正文”或“屏幕”或“文档”不是“窗口”,如果您检查溢出的 html 内容,您可以理解。# i.stack.imgur.com/6xPdH.png
2021-04-12 17:44:20
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() 返回无效值

在 Safari iphone 上使用它时遇到问题。
2021-03-29 17:44:20

为什么没人提到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 */
}

没有测试那么多,但使用android默认和android chrome浏览器,桌面chrome进行了测试,到目前为止它看起来运行良好。

当然,它不返回数字值,而是返回布尔值——如果匹配或不匹配,那么可能不完全符合问题,但无论如何这就是我们想要的,可能是问题的作者想要的。

仅支持 IE10+。
2021-03-15 17:44:20
如果他们使用 IE9 或更旧的版本,他们就不配上网。
2021-03-22 17:44:20
Safari iphone 似乎不支持这一点。
2021-04-05 17:44:20
较新的 iOS Safari 版本应该支持 matchMedia。来源:caniuse.com/#feat=matchmedia
2021-04-08 17:44:20

从 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)。
2021-03-19 17:44:20
如果 document.documentElement 未定义,它不会抛出错误吗?
2021-03-31 17:44:20