返回课程

无限页面

重要性:5

创建一个无限页面。当访问者滚动到页面末尾时,它会自动将当前日期时间追加到文本中(以便访问者可以继续滚动)。

像这样

请注意滚动的两个重要特征

  1. 滚动是“弹性的”。在某些浏览器/设备中,我们可以滚动到文档开始或结束之外(会显示下面的空白区域,然后文档会自动“弹回”正常状态)。
  2. 滚动是不精确的。当我们滚动到页面末尾时,实际上我们可能距离文档底部 0-50 像素。

因此,“滚动到末尾”应该意味着访问者距离文档末尾不超过 100 像素。

附注:在现实生活中,我们可能希望显示“更多消息”或“更多商品”。

打开任务沙箱。

该解决方案的核心是一个函数,它在页面末尾时向页面添加更多日期(或在现实生活中加载更多内容)。

我们可以立即调用它,并将其作为 window.onscroll 处理程序添加。

最重要的是:“如何检测页面是否滚动到底部?”

让我们使用相对于窗口的坐标。

文档由 <html> 标签表示(并包含在其中),即 document.documentElement

我们可以获取整个文档相对于窗口的坐标,即 document.documentElement.getBoundingClientRect()bottom 属性将是文档底部的相对于窗口的坐标。

例如,如果整个 HTML 文档的高度为 2000px,那么

// when we're on the top of the page
// window-relative top = 0
document.documentElement.getBoundingClientRect().top = 0

// window-relative bottom = 2000
// the document is long, so that is probably far beyond the window bottom
document.documentElement.getBoundingClientRect().bottom = 2000

如果我们向下滚动 500px,那么

// document top is above the window 500px
document.documentElement.getBoundingClientRect().top = -500
// document bottom is 500px closer
document.documentElement.getBoundingClientRect().bottom = 1500

当我们滚动到底部时,假设窗口高度为 600px

// document top is above the window 1400px
document.documentElement.getBoundingClientRect().top = -1400
// document bottom is below the window 600px
document.documentElement.getBoundingClientRect().bottom = 600

请注意,bottom 不能为 0,因为它永远不会到达窗口顶部。bottom 坐标的最低限制是窗口高度(我们假设为 600),我们不能再向上滚动它。

我们可以通过 document.documentElement.clientHeight 获取窗口高度。

对于我们的任务,我们需要知道文档底部何时距离它不超过 100px(即:600-700px,如果高度为 600)。

所以这是函数

function populate() {
  while(true) {
    // document bottom
    let windowRelativeBottom = document.documentElement.getBoundingClientRect().bottom;

    // if the user hasn't scrolled far enough (>100px to the end)
    if (windowRelativeBottom > document.documentElement.clientHeight + 100) break;

    // let's add more data
    document.body.insertAdjacentHTML("beforeend", `<p>Date: ${new Date()}</p>`);
  }
}

在沙盒中打开解决方案。