移动设备:使用 css 获取屏幕区域大小和位置,而不仅仅是视口的

Mobile devices: get screen area size and position with css, not just viewport's

这个问题说明了我花了几个月的时间才弄清楚的问题:

is mobile viewport size larger than screen size?

也就是说,在移动浏览器的屏幕区域中呈现的内容有时只是视口的一部分。仅当 meta viewport 标签指定的 zoom-out 为当前缩放值时它们才相同。

这个模型出现了一些问题,例如:css-sticky headers 没有出现在屏幕上,并且居中的元素(相对于视口)没有相对于屏幕居中。最终用户会根据缩放丢失一些信息。

如果有一些 css 值涉及屏幕区域大小和位置,我可以尝试解决这些定位问题。他们是谁?

或者,至少,是否可以通过 javascript 获得可见的屏幕矩形?

EDIT1

我在移动屏幕位置时直接检查 window、window.screen、文档和 document.documentElement 下的属性变化,但除了需要真正的视口时没有检测到变化移动,因为屏幕移出其当前边界。

EDIT2

第一个回答没有解决问题。我把代码放在 运行 和 console.log 每 1 秒的结果:

http://wlee.eu5.net/viewport.php

在 Chrome 模拟移动设备上打开它并稍微滚动一下。即使屏幕已移动,记录的尺寸也不会更改,直到屏幕达到真实视口限制。

您可以看到它指向“我居中”文本,该文本始终位于视口的中心,而不是屏幕。此外,视口有红色轮廓。

我认为移动浏览器会占用一部分视口以显示在屏幕上,而这正是我正在寻找的这一部分的位置。

如果网页应该适应移动设备,那么向您的网页添加 viewport 元标记是一个很好的做法,这样您的视口将在所有设备上得到平等的体现。您可以阅读有关此元标记的更多信息 here.

CSS中有vwvhvminvmax个尺寸单位,与用户设备的视口参数有关.如果您想让元素适应用户视口的大小,请以这些单位而不是像素或百分比指定其大小。您可以阅读有关使用这些单位的更多信息 here.

如果您不仅仅希望将对象按比例缩放到当前视口,您当然可以使用 JavaScript 检索视口信息。这是一个函数,正是这样做的:

function GetCurrentViewportLocation() {
    const xOffset = window.pageXOffset,
          yOffset = window.pageYOffset,
          vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),
          vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
    
    return {
        topLeft: { x: xOffset, y: yOffset },
        topRight: { x: xOffset + vw, y: yOffset },
        bottomLeft: { x: xOffset, y: yOffset + vh },
        bottomRight: { x: xOffset + vw, y: yOffset + vh },
    }
}

放大屏幕会相应地更新坐标。

找到了!它属于 window.visualViewport.

https://developer.mozilla.org/en-US/docs/Web/API/VisualViewport

方法 JSON.stringify 无法获取 visualViewport 属性,因此我无法在滚动页面时看到它们发生变化。

总结

visualViewport。pageLeft/Top 获取相对于页面的滚动视口。

visualViewport.offsetLeft/Top 获取相对于视口的屏幕矩形。这个矩形是移动浏览器在缩放页面时在屏幕上显示的内容,缩放不会改变页面滚动。

没有 css 找到这个。我会继续寻找。