На це питання є понад 30 відповідей, і жоден з них не використовує дивовижно просте чисте рішення JS, яке я використовував. Немає необхідності завантажувати jQuery лише для вирішення цього питання, як наполягають багато інших.
Для того, щоб сказати, чи знаходиться елемент у вікні перегляду, спочатку слід визначити положення елементів у тілі. Нам це не потрібно робити рекурсивно, як я колись думав. Натомість ми можемо використовувати element.getBoundingClientRect()
.
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
Це значення - різниця Y між вершиною об'єкта та вершиною тіла.
Тоді ми мусимо сказати, чи елемент знаходиться в межах перегляду. Більшість реалізацій запитують, чи повний елемент знаходиться у вікні перегляду, тому це ми будемо висвітлювати.
Перш за все, верхнє розташування вікна: window.scrollY
.
Ми можемо отримати нижнє положення вікна, додавши висоту вікна до його верхнього положення:
var window_bottom_position = window.scrollY + window.innerHeight;
Дозволяє створити просту функцію для отримання верхнього положення елемента:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
Ця функція поверне верхнє положення елемента у вікні або повернеться, 0
якщо ви передасте йому щось інше, ніж елемент із .getBoundingClientRect()
методом. Цей метод існує давно, тому вам не доведеться турбуватися про те, що ваш браузер не підтримує його.
Тепер вища позиція нашого елемента:
var element_top_position = getElementWindowTop(element);
А або нижнє положення елемента:
var element_bottom_position = element_top_position + element.clientHeight;
Тепер ми можемо визначити, чи знаходиться елемент у вікні перегляду, перевіривши, чи нижнє положення елемента нижче верхнього положення вікна перегляду, і перевіривши, чи верхнє положення елемента вище нижнього положення вікна перегляду:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
Звідти ви можете виконати логіку, щоб додати або видалити in-view
клас на своєму елементі, який ви зможете пізніше обробити ефектами переходу у вашій CSS.
Я абсолютно вражений тим, що не знайшов цього рішення ніде більше, але я вважаю, що це найчистіше і найефективніше рішення, і це не вимагає від вас завантаження jQuery!