назад до уроку

Нескінченна сторінка

важливість: 5

Створіть нескінченну сторінку. Коли відвідувач прокручує її до кінця, поточна дата-час автоматично додається до тексту (щоб відвідувач міг прокручувати більше).

ось таким чином:

Будь ласка, зверніть увагу на дві важливі особливості прокрутки:

  1. Прокручування є “еластичним”. У деяких браузерах/пристроях ми можемо прокрутити трохи далі початку або кінця документа (буде показано пусте місце, а потім документ автоматично “повернеться” до нормального стану).
  2. Прокрутка неточна. Коли ми прокручуємо до кінця сторінки, насправді ми можемо бути на відстані 0-50 пікселів від реального низу документа.

Отже, “прокрутка до кінця” має означати, що відвідувач знаходиться на відстані не більше 100 пікселів від кінця документа.

P.S. У реальному житті ми можемо захотіти показати “більше повідомлень” або “більше товарів”.

Відкрити пісочницю для завдання.

Основою рішення є функція, яка додає більше дат на сторінку (або завантажує більше речей у реальному житті), поки ми знаходимося в кінці сторінки.

Ми можемо негайно викликати її та додати window.onscroll як обробник.

Найважливіше запитання: “Як ми виявимо, що сторінка прокручується вниз?”

Скористаємось координатами, відносними до вікна.

Документ представлений (і міститься) у тегу <html>, тобто document.documentElement.

Ми можемо отримати відносні до вікна координати всього документа як document.documentElement.getBoundingClientRect(), властивість bottom буде відносною до вікна координатою низа документа.

Наприклад, якщо висота всього HTML-документа дорівнює 2000px, тоді:

// коли ми знаходимося вгорі сторінки
// top відносний до вікна дорівнює 0
document.documentElement.getBoundingClientRect().top = 0

// bottom відносний до вікна дорівнює 2000
// документ великий, тому він, ймовірно, знаходиться далеко за нижньою частиною вікна
document.documentElement.getBoundingClientRect().bottom = 2000

Якщо ми прокрутимо 500px нижче, то:

// Верхня частина документа знаходиться над вікном на 500px
document.documentElement.getBoundingClientRect().top = -500
// Нижня частина документа на 500px ближче
document.documentElement.getBoundingClientRect().bottom = 1500

Коли ми прокручуємо до кінця, припускаючи, що висота вікна дорівнює 600px:

// Верхня частина документа знаходиться над вікном на 1400px
document.documentElement.getBoundingClientRect().top = -1400
// Нижня частина документа знаходиться під вікном на 600px
document.documentElement.getBoundingClientRect().bottom = 600

Зауважте, що bottom не може бути 0, оскільки він ніколи не досягає верхньої частини вікна. Найнижча межа bottom координати – це висота вікна (ми припустили, що це 600), ми більше не можемо прокручувати вгору.

Ми можемо отримати висоту вікна як document.documentElement.clientHeight.

Для нашого завдання нам потрібно знати, коли нижня частина документа знаходиться на відстані не більше ніж 100px від неї (тобто: 600-700px, якщо висота 600).

Отже, ось функція:

function populate() {
  while(true) {
    // нижня частина документа
    let windowRelativeBottom = document.documentElement.getBoundingClientRect().bottom;

    // якщо користувач не прокрутив достатньо далеко (>100px до кінця)
    if (windowRelativeBottom > document.documentElement.clientHeight + 100) break;

    // додамо більше даних
    document.body.insertAdjacentHTML("beforeend", `<p>Date: ${new Date()}</p>`);
  }
}

Відкрити рішення в пісочниці.