不常用的浏览器 API —— Visual Viewport

720 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

这一节继续看不常用的浏览器 API,本文要介绍的是 Visual Viewport,它表示的是可视窗口的能力,这一部分内容使用的也不多,涉及到一些窗口相关的基础知识,我们可以借着机会学习一下。

在移动页面中有两种窗口一个是真实页面布局的 layout 窗口,另一个就是我们要学习的 visual 窗口。layout 窗口指的是页面上的所有元素,而 visual 指的是屏幕上可以看到的内容,这里有一个非常重要的点:当用户缩放屏幕是 Visual Viewport 会发生变化,而 Layout Viewport 是不受影响的。

在 window 上有一个 visualViewport 对象封装了这部分 API 内容,我们可以通过 visualViewport 来访问到页面的可视窗口信息,相对而言在移动端使用的可能会多一些。

关于 viewportHandler 的使用场景我其实没有遇到,这里我直接引用 MDN 上面的例子来看:

let pendingUpdate = false;
function viewportHandler(event) {
  if (pendingUpdate) return;
  pendingUpdate = true;
  requestAnimationFrame(() => {
    pendingUpdate = false;
    var layoutViewport = document.getElementById('layoutViewport');
    var viewport = event.target;
    var offsetLeft = viewport.offsetLeft;
    var offsetTop = viewport.height
                - layoutViewport.getBoundingClientRect().height
                + viewport.offsetTop;
    bottomBar.style.transform = 'translate(' +
                                offsetLeft + 'px,' +
                                offsetTop + 'px) ' +
                                'scale(' + 1/viewport.scale + ')'
    })
}
window.visualViewport.addEventListener('scroll', viewportHandler);
window.visualViewport.addEventListener('resize', viewportHandler);

上面的是一个监听的例子,这里会在发生滚动和切换页面大小时处理,这里在 event 回调中也可以获取到 viewport 数据。

关于 viewport 还有一个更常见的地方,通常我们在写 HTML 时都会有这一行:

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

更多时候这部分内容是自动生成的,这部分内容实际上做的事情和 API 也是一样的,我们设置 width=device-width, initial-scale=1.0 这个值也是为了使网页在移动页面上正常呈现,这里设置的效果是使得 Layout Viewport 和 Visual Viewport 展示的大小一致。