我正在寻找在iPhone的Safari浏览器中跟踪用户缩放和平移页面的选项。Safari提供了移动和手势事件,理论上我可以不断累加平移和缩放操作,但这似乎有些过度,因为浏览器必须在内部跟踪它们。
这些信息是否通过文档对象模型(DOM)公开?
当您进行缩放时,window.innerWidth
会被调整,但document.documentElement.clientWidth
不会调整,因此:
var zoom = document.documentElement.clientWidth / window.innerWidth;
(我已经测试过iOS4,在没有 viewport
<meta>
的情况下).
但是,我不会把它用于任何重要的事情。移动浏览器中DOM视口大小/像素大小非常混乱。
<body>
<div id=measurer style="position:absolute;width:100%"></div>
并使用计算:
function getZoom(){
return document.getElementById('measurer').offsetWidth / window.innerWidth;
}
PS: Windows手机需要不同的解决方案(捏缩不会更改视口 - 在Windows上的捏缩具有自己的独立视口,无法让JavaScript看到)。
编辑:Android视觉视口调整和滚动事件可能有所帮助?请参见https://developer.mozilla.org/en-US/docs/Web/API/VisualViewport#Events
我用以下方式测量缩放(仅适用于iOS):
screenOrientedWidth = screen.width;
if (window.orientation == 90) {
screenOrientedWidth = screen.height;
}
return screenOrientedWidth / window.innerWidth;
它不取决于内容有多宽。
然而,在iOS Safari中,window.innerWidth
在gestureend
处理程序内部是不正确的。您应该将此类计算推迟到稍后执行。在GWT中,我使用scheduleDeferred
,但是我无法告诉您如何在纯JavaScript中实现这一点。
如果您正在使用任何带有location:fixed属性的元素,这可能会变得复杂,因为location:fixed坐标是相对于未缩放的窗口而言的,而窗口坐标是相对于缩放后的视口而言的。更多信息:如何在IOS浏览器上定位固定位置元素进行缩放?
document.documentElement.clientWidth
不包括滚动条,而window.innerWidth
则包括。高度同理。 - icedwater