【问题标题】:Understand which viewport is returned from document.documentElement.clientWidth/Height, and difference with window.innerHeight/innerWidth了解document.documentElement.clientWidth/Height返回哪个视口,与window.innerHeight/innerWidth的区别
【发布时间】:2020-05-16 14:32:15
【问题描述】:

我对 JavaScript 和 DOM 中的 viewport 的概念有点困惑,尤其是应该返回视口宽度的 document.documentElement.clientWidth

事实上,document.documentElementhtml 元素,无论我是否已经为html 元素设置了固定的像素宽度,clientWidth 都会返回视口尺寸。

现在,当我学习 CSS 时,我了解到移动浏览器有两个视口,默认视口和理想视口。 default 视口对于没有响应技术的浏览器很有用。 ideal 视口是我提供 RWD 机制时使用的视口(在这种情况下,我必须使用 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 和媒体查询)。

例如,iPhone 5 的物理屏幕宽度为 640 像素,但其理想的视口为 320 像素。此外,还有 visual viewportlayout viewport 的概念,例如在缩放时发挥作用。

现在我想从document.documentElement.clientWidth 知道台式电脑和手机上返回的视口尺寸(如果有差异)。因为我试过了,我发现window.innerWidth/Height(浏览器内容区域)几乎总是与document.documentElement.clientWidth/Height的值相同(滚动、边距和边框像素值除外)。

这怎么可能?我缺少的 JavaScript DOM 中的“视口”是否有不同的含义?

例如:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Experiment</title>
   <style>

      p{
         float:right;
         width:20%;
      }
   </style>
</head>
<body>

  <p id="par">Hello</p>

   <script>

      console.log(window.innerHeight);
      console.log(window.innerWidth);
      console.log(document.documentElement.clientHeight);
      console.log(document.documentElement.clientWidth);
      console.log(screen.height);
      console.log(screen.width);

   </script>

</body>
</html>

结果(我正在从我的电脑远程调试到我的三星 Galaxy A5,使用本地服务器为我的网页提供服务):

560//browser window viewport (innerHeight)
360
560//viewport (document.documentElement.clientHeight)
360
640 //screen size
360

视口和浏览器视口是一样的。到目前为止我可以接受。现在是同一个页面,但我避开了这个元标记:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

我得到:

1524 //browser window viewport (innerHeight)
980
1524 //viewport (document.documentElement.clientHeight)
980  
640 //screen size
360 

我期望在没有元标记的情况下如何更改视口大小,因为页面映射到 默认视口 (1540x980) 并且稍后将在物理像素中缩小(640x360 更少或更多) .

好的,但我不明白为什么浏览器窗口视口 (innerHeight\innerWidth) 仍然具有与视口 (clientWidth|clientHeight) 相同的尺寸。我本来希望浏览器窗口的视口保持 560x640。

有人可以解释一下吗?

我在 Google Chroome 上对此进行了测试。

【问题讨论】:

    标签: javascript dom viewport


    【解决方案1】:

    CSSOM View spec 定义了window.innerHeight/Widthdocument.documentElement.clientHeight/Width 的视口相同,只是在是否包含滚动条方面有所不同,因此它们应该始终一起更改。 p>

    使用哪个概念视口并没有在那里定义。因为它是由标准正式定义的,所以我认为我们可以认为它使用CSS Device Adaptation spec 中描述的实际视口

    【讨论】:

    • 我看了一下链接。两种方法都引用相同的视口。此外,视口应该与依赖于预设浏览器的实际视口相关,并且可以从用户代理样式表中设置或从媒体查询中覆盖。因此这种方法:stackoverflow.com/questions/3437786/… 确定窗口大小是错误的。即不确定既不使用 window.innerWidth 也不使用 document.documentElement.clientWidth
    • @Umbert - 从历史上看,具有这些属性的浏览器无处不在。我注意到那里接受的答案几乎是 10 年前写的,并且在那段时间发生了很大变化。该链接问题的答案通常试图填补现在非常旧的浏览器的实现中的空白。
    • 因此,现在如何获取浏览器窗口大小?我直观地理解,上一个链接中的过程现在对于桌面浏览器仍然很好,但对于移动浏览器可能会产生误导。我知道这是另一个问题。
    猜你喜欢
    • 2013-07-24
    • 2020-05-27
    • 2012-08-31
    • 2014-01-30
    • 2015-01-10
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多