☰
ELEMENTOR / PRACTICE

Як прибрати CLS і стрибки layout в Elementor

Як прибрати CLS і стрибки layout в Elementor

CLS (Cumulative Layout Shift) — це показник Core Web Vitals, який відображає, наскільки сильно елементи сторінки несподівано зміщуються під час завантаження. Якщо заголовок раптом опускається, кнопка переміщується під курсором, а картки змінюють висоту після появи зображень, користувач бачить саме проблему зі стабільністю layout.

В Elementor такі стрибки найчастіше спричиняють зображення без зарезервованих розмірів, вебшрифти, динамічний контент, банери, спливаючі вікна та скрипти, які змінюють стилі після першого рендерингу. Нижче — послідовний спосіб знайти джерело CLS і виправити його без маскування проблеми випадковими відступами.

Що таке CLS і чому сторінка «стрибає»

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

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

Важливо відрізняти CLS від звичайної анімації. Очікуваний рух елемента, наприклад плавне відкриття меню після кліку, не обов’язково є проблемою CLS. Критичними є саме неочікувані зміщення без дії користувача.

  • Зображення, відео та iframe не мають зарезервованої висоти.
  • Динамічний блок з’являється після отримання даних із сервера або стороннього сервісу.
  • Пізно завантажений шрифт змінює ширину тексту та висоту заголовків.
  • JavaScript після завантаження змінює відступи, розміри або порядок елементів.
  • Рекламні, cookie- чи popup-блоки вставляються в потік сторінки замість накладання поверх нього.

Почніть із пошуку елемента, який викликає зміщення

Не варто одразу додавати min-height до всіх секцій. Спочатку потрібно визначити, який саме елемент змінює layout. Перевірте сторінку в режимі інкогніто або в чистому вікні браузера, оскільки кеш, авторизована панель WordPress і розширення можуть змінити результат.

У PageSpeed Insights перегляньте діагностику, пов’язану зі зміщенням елементів. У Chrome DevTools корисно відкрити вкладку Performance, записати завантаження сторінки та проаналізувати події Layout Shift. Під час наведення на таку подію браузер підсвічує елементи, які змістилися.

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

  • Перевірте сторінку після повного очищення кешу, а не лише після повторного відкриття.
  • Порівняйте результат для нового відвідувача та авторизованого користувача.
  • Подивіться, чи не зміщується сторінка після завантаження cookie-банера, віджета чату або аналітичного скрипту.
  • Окремо протестуйте сторінку без кешувальних і оптимізаційних плагінів, якщо вони змінюють порядок завантаження CSS або JavaScript.

Зображення: зарезервуйте простір до їх завантаження

Найпоширеніша причина стрибків в Elementor — зображення, для якого браузер не може заздалегідь визначити пропорції. Завантажуйте файл із правильними розмірами та використовуйте відповідний розмір у віджеті. Велике фото, зменшене лише через CSS, збільшує обсяг завантаження і не вирішує проблему геометрії.

Для фотографій у картках, галереях і прев’ю важливо заздалегідь визначити співвідношення сторін. Це особливо корисно, якщо всі картки повинні мати однакову висоту. Властивість object-fit дозволяє заповнити область без спотворення зображення, але потрібно враховувати можливе обрізання важливих деталей.

Якщо Elementor або тема вже виводять width і height для зображення, не перекривайте їх без потреби. Додатковий CSS потрібен лише тоді, коли фактичний layout справді вимагає єдиного співвідношення сторін.

  • Використовуйте оптимізовані WebP або AVIF там, де це підтримує ваш процес публікації.
  • Не завантажуйте зображення в кілька разів більші за область, у якій вони відображаються.
  • Для головного зображення, яке видно одразу, обережно застосовуйте lazy loading: надто агресивне відкладене завантаження може погіршити сприйняття першого екрана.
  • Для iframe, відео та карт надавайте контейнеру фіксоване або пропорційне співвідношення сторін.
selector img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
}

Перевірте шрифти, заголовки та відступи

Шрифт може бути джерелом CLS, якщо спочатку браузер показує текст системним шрифтом, а потім замінює його вебшрифтом. Через іншу ширину символів змінюється кількість рядків у заголовку, висота текстового блоку та положення елементів нижче.

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

Не змінюйте через JavaScript розмір заголовка, line-height або відступи після завантаження. Стилі для різних брейкпоінтів краще задати в CSS або налаштуваннях Elementor до першого рендерингу.

  • Перевірте, чи збігається fallback-шрифт із вебшрифтом за шириною та пропорціями.
  • Уникайте великої кількості різних font-weight на одній сторінці.
  • Задайте передбачуваний line-height для заголовків і основного тексту.
  • Не покладайтеся на JavaScript для вимірювання тексту та подальшої корекції відступів.

Стабілізуйте динамічні блоки в Elementor

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

Для таких блоків потрібно передбачити початкову геометрію. Це може бути min-height, фіксоване співвідношення сторін, skeleton-заглушка або заздалегідь відомий розмір компонента. Висоту слід підбирати за реальним контентом і окремо перевіряти на мобільних екранах.

Не використовуйте надмірно велику min-height як універсальне виправлення. Порожній простір, який залишається на сторінці, погіршує UX і може бути таким самим недоліком, як і стрибок.

  • Задайте min-height для блоку, якщо його приблизна висота відома заздалегідь.
  • Для карток у сітці вирівняйте область зображення та тексту, щоб одна картка не штовхала весь ряд.
  • Показуйте заглушку тієї самої форми, що й майбутній контент.
  • Не вставляйте важливі блоки над основним текстом без зарезервованого місця.
.dynamic-card {
  min-height: 320px;
}

.dynamic-media {
  aspect-ratio: 16 / 9;
  overflow: hidden;
}

Банери, popup і JavaScript: типові приховані причини

Cookie-банер, рекламний блок або повідомлення про акцію не повинні раптово вставлятися у звичайний потік контенту. Якщо такий елемент з’являється зверху сторінки після її побудови, він зсуває весь видимий вміст. Для постійних повідомлень заздалегідь резервуйте область, а для overlay-компонентів використовуйте позиціонування, яке не штовхає сусідні блоки.

Окрему увагу приділіть Elementor Motion Effects, скриптам віджетів, sticky-елементам і стороннім сервісам. Анімація має працювати з transform або opacity, а не змінювати висоту, ширину, margin чи положення елементів у потоці без потреби.

Якщо після оптимізації JavaScript проблема з’явилася або зникла, це важлива підказка: відкладене виконання скрипта може змінити момент появи елемента, але не завжди усуває саму причину. Спочатку стабілізуйте layout, а вже потім налаштовуйте оптимізацію.

  • Не додавайте верхній банер після завантаження без заздалегідь виділеної області.
  • Перевірте віджети чату, карт, відгуків, реклами та соціальних стрічок.
  • Для анімацій віддавайте перевагу transform і opacity.
  • Обережно застосовуйте відкладене виконання JavaScript: воно може приховати проблему під час одного тесту, але створити її під час іншого.

Фінальна перевірка після виправлень

Після змін очистіть кеш WordPress, кеш плагіна оптимізації, CDN і браузера. Якщо використовується генерація або об’єднання CSS, переконайтеся, що оптимізатор створив актуальні файли. Інакше ви можете тестувати стару версію стилів.

Повторіть перевірку в PageSpeed Insights і в DevTools Performance. Оцінюйте не тільки підсумковий CLS, а й список зміщених елементів. Хороший результат має бути стабільним у кількох завантаженнях, на різних ширинах екрана та за повільнішого мережевого з’єднання.

Перевірте сторінку вручну: чи не переміщується кнопка під курсором, чи не змінюється висота першого екрана, чи не з’являється горизонтальний скрол і чи не перекриває popup основний контент. Після цього протестуйте шаблони, які використовують ті самі віджети: виправлення в одному Elementor-блоці може вплинути на інші сторінки.

  • Зробіть окремі тести для мобільної та десктопної версій.
  • Порівняйте сторінку до і після змін у Performance.
  • Перевірте повільне завантаження шрифтів, зображень і сторонніх віджетів.
  • Не оцінюйте CLS за одним локальним запуском: результати можуть відрізнятися через кеш і мережу.

Поширені запитання

Чи можна прибрати CLS, просто додавши min-height?

Іноді min-height допомагає зарезервувати простір для динамічного блока, але це не універсальне рішення. Спочатку знайдіть елемент, який зміщується, а висоту підбирайте за реальним контентом і окремо для різних екранів.

Чи спричиняє lazy loading зображень стрибки layout?

Сам lazy loading не обов’язково викликає CLS. Проблема виникає, якщо для зображення немає визначених width, height або aspect-ratio. Браузер тоді не знає, скільки місця потрібно зарезервувати до завантаження файла.

Як зрозуміти, що CLS викликають шрифти?

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

Чому PageSpeed показує CLS, хоча в редакторі Elementor усе стабільно?

Редактор Elementor може завантажувати сторінку в іншому режимі, із уже доступними стилями та ресурсами. Перевіряйте опубліковану сторінку як новий відвідувач, без панелі адміністратора, кешу та редакторських накладок.

Висновок

Щоб прибрати CLS в Elementor, потрібно стабілізувати геометрію сторінки ще до завантаження пізніх ресурсів. Задайте розміри або співвідношення сторін для медіа, передбачте місце для динамічних блоків, оптимізуйте шрифти та не змінюйте layout скриптами після першого рендерингу.

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

← Усі матеріали Elementor