Як не гаяти час на завантаження невидимого контенту

6 хв. читання

Браузер не розрізняє невидимий вміст від видимого

Зазвичай не весь вміст вебсторінки поміщається на одному екрані.

Коли сторінка відкривається, браузер обчислює розміри та позиції всіх DOM-елементів на ній. Елементи завантажуються, навіть якщо більшість вмісту ховається і буде видимою, лише коли користувач прогорне сторінку.

Браузеру потрібно трохи часу на повне завантаження DOM, адже без вказівок розробників він не розрізняє видимі елементи та сховані. У прикладі вебсторінки, описаної далі, ми проілюструємо цей важливий факт — браузер застосовує правила CSS і обчислює елемент навіть тоді, коли він або його батьківський елемент:

  • перебувають поза зоною видимості;

  • сховані як overflow;

  • мають значення visibility:hidden.

Чим більше розмір HTML сторінки, тим більше часу браузеру потрібно, щоб показати вміст, і тим довше користувачі чекатимуть, поки щось з'явиться на екрані. Ніхто не любить чекати. То як скоротити час обробки та відтворення величезних сторінок?

Ми зосередимося на вебзастосунках, що представляють табличні дані, але цей метод працює для будь-якої сторінки зі структурованим вмістом.

Як скоротити час завантаження вмісту поза зоною видимості

Існує два способи не завантажувати елементи, які розташовані поза зоною видимості.

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

Досить популярний метод — пришвидшити завантаження сторінки, зберігаючи в DOM лише вміст вікна перегляду на поточній позиції прокручування. У таких підходах DOM не змінюється, але його вузли сховані, якщо вони не потрапляють в екран перегляду.

Такі підходи погані й для користувачів, і для розробників. Розробники мають оптимізувати додатковий код JavaScript, тоді як користувачів дратує, коли вони не можуть знайти весь вміст сторінки за допомогою звичайної функції пошуку (Ctrl+F) у браузері. Також неможливо використовувати посилання на елементи в таких сторінках.

Що зручніше — сайти з динамічно вставленим вмістом чи сайти, розбиті на сторінки? Не знаємо, як ви, а ми вважаємо віртуальне прокручування чи не найдратівливішою річчю у світі.

Властивість CSS content-visibility:auto

З погляду ефективності та зусиль розробників, content-visibility незрівнянно пришвидшує завантаження сторінки. Якщо застосувати цю властивість до елемента, браузер повністю ігноруватиме його вміст, поки сторінка не прогортається до нього.

content-visibility каже браузеру, що дочірні елементи цільового елемента не виходять за межі своїх батьківських елементів. Тобто, коли елемент поза екраном, його дочірні елементи також сховані. Очевидно, якщо браузер показує лише елементи у вікні перегляду, то сторінка стає видимою та інтерактивною набагато швидше, ніж така сама сторінка з усім завантаженим вмістом поза екраном.

Однак щоб знати, які елементи з'являються у вікні під час прокручування, браузеру потрібно розмістити всі елементи content-visibility на свої місця, навіть якщо вони поза екраном. Такий макет створюється досить швидко, адже браузеру потрібен лише розмір елемента, чітко зазначений у його властивостях CSS.

Величезні таблиці — ідеальний варіант для використання content-visibility, оскільки точну висоту кожного рядка можна легко попередньо обчислити у коді JavaScript та призначити рядку за допомогою властивості CSS height.

Якщо для елемента не вказано значення height, то браузер вважає, що його висота дорівнює 0. Аби побачити, що відбувається, ви можете клацнути кнопки Row content-visibility, no height на зразку сторінки contentvisibility.onrender.com, а потім спробуйте прокрутити сторінку до останнього рядка у зразку таблиці.

Попри найвищу швидкість завантаження, content-visibility не заважає користувачам шукати вміст поза зоною видимості на екрані за допомогою стандартної комбінації клавіш Ctrl+F. Також можна вільно посилатися на цей вміст.

Приклад сторінки

Тепер, після тривалого вступу, перегляньте ілюстрації contentvisibility.onrender.com. Коли ви відкриваєте зразок сторінки, то бачите таблицю, що складається з 5000 рядків з 20 комірками в кожному рядку. Для швидшого завантаження таблицю побудовано з елементів div замість спеціалізованих теґів HTML table, tr і td.

Як не гаяти час на завантаження невидимого контенту

Рожеве тло охоплює ділянку елемента div, що містить таблицю.

Як не гаяти час на завантаження невидимого контенту

Висота root div дорівнює висоті екрана. Якщо ви трохи прокрутите сторінку, то побачите таке:

Як не гаяти час на завантаження невидимого контенту

Усі сірі кнопки змінюються не більше, ніж клас root div. Коли клас змінюється, нові правила CSS застосовуються до root div або його безпосередніх дочірніх елементів.

Отже, коли ви натискаєте кнопку Screen overflow clipped, клас root div змінюється, а до div застосовується CSS-властивість overflow:clip:

Як не гаяти час на завантаження невидимого контенту

Вертикальна смуга прокрутки зникає разом із переповненням екрана:

Як не гаяти час на завантаження невидимого контенту

На екрані залишається лише 0,5% таблиці. Але зверніть увагу, скільки часу вам доведеться чекати, поки браузер намалює крихітний шматочок таблиці. А тепер порівняйте з часом очікування на повне завантаження таблиці.

Якщо ви натиснете кнопку Container invisible, до root div застосується властивість visibility:hidden:

Як не гаяти час на завантаження невидимого контенту

Ви не побачите невидимої таблиці, але знатимете, коли браузер завершить завантаження, тому що з'явиться смуга вертикальної прокрутки.

Як не гаяти час на завантаження невидимого контенту

Ви зауважили, що невидима таблиця завантажується швидше, ніж така сама видима таблиця?

Тоді ви можете оцінити приголомшливий вплив content-visibility на швидкість завантаження сторінки. Якщо натиснути кнопку Row content-visibility, до root div застосується інший клас. У результаті div позбувається раніше отриманих властивостей:

Як не гаяти час на завантаження невидимого контенту

А до рядків div застосовується властивість content-visibility:

Як не гаяти час на завантаження невидимого контенту

Таблиця з'являється майже миттєво після натискання кнопки. Також стає доступний пошук. Показуються координати комірок таблиці. Координати останньої комірки таблиці — 19 499. Наприклад, ми шукаємо 4999, що є індексом останнього рядка.

Як не гаяти час на завантаження невидимого контенту

Для порівняльного аналізу натискаємо жовтогарячу кнопку Start benchmarking. Скрипт десять разів змінить клас root div для кожного з кількох тестових класів і виміряє два відтинки часу:

  • час на заміну класу root div, про всяк випадок;

  • час, витрачений браузером на завантаження таблиці.

Докладніше цей код ви можете переглянути тут. Але зважайте, що його адаптовано для поточної статті: змінено правила CSS та назви класів.

Коли скрипт завершує вимірювання, з'являється таблиця з результатами порівняльного аналізу:

Як не гаяти час на завантаження невидимого контенту

Тепер ви бачите, що браузер витрачає приблизно так само багато часу на завантаження — і коли вміст поза вікном перегляду, і коли він частково схований чи невидимий взагалі.

Але якщо для браузера вказати властивість content-visibility, він ігнорує невидимий вміст, доки той не з'явиться на екрані. В результаті швидкість завантаження зростає у 3634/227=16 разів.

Властивість content-visibility можна використовувати з будь-яким контентом, але вона найліпше підходить для структурованого вмісту з фіксованою або передбачуваною висотою. Якщо ви розробляєте застосунки, де багато табличних даних, то слід забути про віртуальні прокручування та розбивання на сторінки. На жаль, пам'ять браузера обмежує розмір даних, які можна завантажити в браузер.

Приклад коду можна завантажити з GitHub.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація