Розуміння проблеми умовної анімації JavaScript
Під час використання адаптивного веб-дизайну часто необхідно включати відмінну поведінку для різних типів пристроїв або розмірів екрана. У цій ситуації може бути складно використовувати JavaScript для керування анімацією на основі медіа-запитів. Коли дві анімації — по одній для кожного пристрою — не працюють одночасно, як очікувалося, це типова проблема.
У цьому сценарії використовуються дві анімації JavaScript: одна для «навігаційного прокручування» (підходить для великих екранів), а інша для «cta прокручування» (заклик до дії), призначеного для невеликих пристроїв. Складність полягає в тому, щоб переконатися, що кожна анімація відтворюється окремо відповідно до ширини екрана, уникаючи зіткнень.
Якщо дві анімації встановлено в різних тегах сценарію, і лише одна з них працює належним чином, виникає проблема. Якщо їх застосувати недбало, об’єднання їх під єдиною умовою або комбінування тегів сценарію може призвести до додаткових проблем, особливо під час використання медіа-запитів, таких як `window.matchMedia()`.
У цій публікації буде описано, як використовувати медіа-умови для організації JavaScript, щоб кожна анімація працювала належним чином. Щоб забезпечити плавний перехід між мобільними та великими екранами, він зробить сильний акцент на відповідних умовних операторах і медіа-запитах.
Команда | Приклад використання |
---|---|
window.matchMedia() | JavaScript використовує цю техніку для застосування медіа-запитів. На основі розміру екрана він визначає, чи відповідає документ заданому медіа-запиту CSS, і ініціює відповідні операції JavaScript. Цей скрипт полегшує розрізнення анімації для великих дисплеїв від мобільних. |
addEventListener("change", callback) | Ця команда стежить за змінами стану медіа-запиту. Функція, що надається як зворотний виклик, виконується, коли ширина екрана перевищує заздалегідь визначене порогове значення (наприклад, 450 пікселів). Це дозволяє динамічну відповідь без необхідності оновлення сторінки. |
removeEventListener("scroll", callback) | Усуваючи безглузду обробку подій на екрані неправильного розміру, ця команда оптимізує швидкість, видаляючи прослуховувач подій прокручування, коли він більше не потрібен. Чергуючи медіа-запити, це обов’язково. |
window.pageYOffset | Цей атрибут повертає кількість пікселів, які було прокручено вгору та вниз у документі. Він використовується для виявлення того, прокручує користувач вгору чи вниз, і для відстеження положення прокручування. |
element.style.top | Ця команда регулює верхню властивість CSS елемента, яка контролює вертикальне положення елемента на сторінці. Тут він використовується для визначення того, де на прокручуванні користувача повинна відображатися або ховатися панель навігації. |
element.style.left | Ця команда переміщує елементи горизонтально, регулюючи ліву властивість CSS, як це робить element.style.top. На мобільних пристроях він використовується для переміщення кнопки із закликом до дії в поле зору та поза ним. |
mediaQuery.matches | Ця властивість перевіряє, чи збігаються медіа-запит і документ. Щоб переконатися, що відповідна анімація застосовується на мобільних пристроях, а не на настільних комп’ютерах, важливо умовно запускати відповідні анімації на основі ширини екрана. |
prevScrollpos >prevScrollpos > currentScrollPos | Щоб визначити напрямок прокручування (вгору або вниз), ця умова перевіряє розташування прокручування з попередньої та поточної ітерацій. Визначення того, як елементи мають реагувати на прокручування, наприклад, відкриваючи або приховуючи кнопки чи навігаційні панелі, має вирішальне значення. |
onscroll | Інтегрований обробник подій, який ініціюється прокручуванням користувачем. Порівнюючи попередні та поточні положення прокручування, він виконує анімацію на основі прокручування. |
Керування анімацією JavaScript на основі розміру екрана
Попередні приклади сценаріїв JavaScript були створені для вирішення проблеми наявності двох різних анімацій — однієї для робочого столу та іншої для мобільних пристроїв. Переконатися, що кожна анімація запускається лише тоді, коли це необхідно, залежно від ширини екрана пристрою, є головним завданням. The Для цього використовується техніка, що дозволяє коду ідентифікувати випадки, коли задовольняються певні умови медіа-запиту. Сценарії гарантують, що кожна анімація функціонує окремо залежно від розміру екрана, використовуючи різні умови для робочого столу (мінімальна ширина: 450 пікселів) і мобільного (максимальна ширина: 450 пікселів).
Поведінка прокручування більшого екрана для панелі навігації обробляється в першому сценарії. Залежно від напрямку прокручування, панель або залишається видимою, або зникає, коли користувач прокручує вгору або вниз. Використовуючи і змінними, це керується шляхом порівняння попередньої та поточної позицій прокручування. Прокручування вгору призводить до того, що навігаційна панель знову з’являється, встановлюючи її верхнє положення на 0, а прокручування вниз спричиняє її зникнення, зміщуючи її з поля зору з від’ємним верхнім значенням.
Другий скрипт працює з кнопкою «заклик до дії» (CTA) на мобільних пристроях. Кнопка CTA відображається на всіх розмірах екрана, але вона анімується лише тоді, коли ширина екрана менше 450 пікселів. Коли користувач прокручує вгору, кнопка ковзає з лівого боку екрана; коли вони прокручуються вниз, кнопка зникає з поля зору. З тією самою логікою порівняння положення прокрутки, що й панель навігації, цю поведінку можна порівняти. Однак замість того, щоб змінювати верхнє значення, воно змінює розташування кнопки ліворуч, змушуючи її з’являтися або зникати залежно від напрямку прокручування.
Два сценарії призначені для роботи окремо один від одного. Однак вони інкапсульовані в умовні вирази, які перевіряють ширину екрана, щоб запобігти конфліктам. с , медіа-запити можна використовувати безпосередньо в JavaScript, дозволяючи сценаріям динамічно переходити між двома анімаціями, не заважаючи одна одній. Зберігаючи сторонню анімацію в межах призначеної ширини екрана, цей модульний підхід підвищує ефективність і гарантує безперебійну роботу на настільних і мобільних пристроях.
Обробка умовних анімацій на основі медіа-запитів за допомогою JavaScript
Це рішення обробляє умовні анімації, залежні від ширини екрана, використовуючи JavaScript у поєднанні з window.matchMedia функція.
var prevScrollpos = window.pageYOffset;
var mediaQueryNav = window.matchMedia("(min-width: 450px)");
var mediaQueryCta = window.matchMedia("(max-width: 450px)");
window.onscroll = function() { scrollFunction(); };
function scrollFunction() {
var currentScrollPos = window.pageYOffset;
if (mediaQueryNav.matches) {
// Navigation scroll for larger screens
if (prevScrollpos > currentScrollPos) {
document.getElementById("navigation").style.top = "0";
} else {
document.getElementById("navigation").style.top = "-90px";
}
}
if (mediaQueryCta.matches) {
// CTA scroll for mobile screens
if (prevScrollpos > currentScrollPos) {
document.getElementById("header-button").style.left = "0.25in";
} else {
document.getElementById("header-button").style.left = "-10in";
}
}
prevScrollpos = currentScrollPos;
}
Модульний підхід із використанням окремих прослуховувачів подій для різних розмірів екрана
Ця версія більш ефективна та модульна, оскільки використовує різні прослуховувачі подій прокручування для кожного медіа-запиту.
var prevScrollpos = window.pageYOffset;
var mediaQueryNav = window.matchMedia("(min-width: 450px)");
var mediaQueryCta = window.matchMedia("(max-width: 450px)");
mediaQueryNav.addEventListener("change", handleNavScroll);
mediaQueryCta.addEventListener("change", handleCtaScroll);
function handleNavScroll(e) {
if (e.matches) {
window.addEventListener("scroll", navScrollFunction);
} else {
window.removeEventListener("scroll", navScrollFunction);
}
}
function handleCtaScroll(e) {
if (e.matches) {
window.addEventListener("scroll", ctaScrollFunction);
} else {
window.removeEventListener("scroll", ctaScrollFunction);
}
}
function navScrollFunction() {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("navigation").style.top = "0";
} else {
document.getElementById("navigation").style.top = "-90px";
}
prevScrollpos = currentScrollPos;
}
function ctaScrollFunction() {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("header-button").style.left = "0.25in";
} else {
document.getElementById("header-button").style.left = "-10in";
}
prevScrollpos = currentScrollPos;
}
// Initial call to apply the correct event listeners
handleNavScroll(mediaQueryNav);
handleCtaScroll(mediaQueryCta);
Застосування умовної логіки до єдиного обробника прокрутки для медіа-запитів
Цей метод використовує один прослуховувач подій прокручування з умовними перевірками залежно від медіа-запитів для обробки обох анімацій.
var prevScrollpos = window.pageYOffset;
var mediaQuery = window.matchMedia("(max-width: 450px)");
window.onscroll = function() { scrollHandler(); };
function scrollHandler() {
var currentScrollPos = window.pageYOffset;
if (mediaQuery.matches) {
// CTA scroll for mobile
if (prevScrollpos > currentScrollPos) {
document.getElementById("header-button").style.left = "0.25in";
} else {
document.getElementById("header-button").style.left = "-10in";
}
} else {
// Navigation scroll for larger screens
if (prevScrollpos > currentScrollPos) {
document.getElementById("navigation").style.top = "0";
} else {
document.getElementById("navigation").style.top = "-90px";
}
}
prevScrollpos = currentScrollPos;
}
Оптимізація JavaScript для адаптивної анімації
Важливим компонентом розробки адаптивних веб-сайтів є переконання, що переходи й анімація реагують по-різному на пристроях різного розміру. Ефективне керування умовами має вирішальне значення під час роботи з медіа-запитами та JavaScript, особливо коли анімація призначена для запуску лише на екранах певного розміру. Тут слухачі динамічних подій і вступають у гру. За допомогою цих інструментів розробники можуть переконатися, що анімація запускається лише тоді, коли задовольняються певні критерії, покращуючи взаємодію з користувачем і продуктивність на настільних і мобільних платформах.
Обробка багатьох анімацій, які запускаються одночасно, представляє ще одну складність для анімацій JavaScript, які залежать від медіа. Розподіл функцій на більш керовані, модульні слухачі подій може творити чудеса в цій ситуації. Ефективніше відокремити різні функції та активувати їх на основі конкретних медіа-запитів, а не виконувати всі сценарії одночасно. Це гарантує, що кожен сценарій працює належним чином на відповідному пристрої та допомагає заощадити непотрібне навантаження на веб-переглядач.
Оптимізація продуктивності для мобільних пристроїв особливо важлива під час роботи з адаптивною анімацією. Оскільки мобільні пристрої часто мають нижчу обчислювальну потужність, ніж настільні комп’ютери, продуктивність мобільних пристроїв можна покращити, зменшивши складність сценарію. Цей екземпляр використання обробник подій ефективно гарантує безперебійну роботу специфічних для мобільних пристроїв анімацій, таких як «прокручування cta», не обкладаючи ресурсами пристрою. Крім того, це гарантує, що великі пристрої завантажують анімацію лише пропорційно розміру екрана.
- Як використовувати медіа-запити в JavaScript?
- JavaScript дозволяє застосовувати медіа-запити з . Ви можете використовувати цей спосіб для запуску різних сценаріїв залежно від ширини екрана.
- Як керувати анімацією залежно від розміру екрана?
- використання для визначення ширини екрана для керування анімацією. Потім за потреби додайте або видаліть прослуховувачі подій. Це гарантує, що залежно від розміру екрана відтворюватиметься лише відповідна анімація.
- Який найкращий спосіб оптимізувати анімацію прокручування?
- Зменшивши кількість операцій, що виконуються всередині події прокручування, можна ефективніше використовувати для оптимізації анімації прокручування. Лише після виявлення прокручування виконується необхідна логіка анімації.
- Як обробляти кілька анімацій у JavaScript?
- Кількома анімаціями можна керувати, розділяючи їх на різні умови та слухачі подій. Це зменшує ймовірність конфліктів, оскільки кожна анімація працює окремо.
- Що робить і робити в анімації прокрутки?
- Ці змінні відстежують, де користувач прокручує. Попередня позиція прокручування зберігається в , і поточна позиція прокручування зберігається в . Порівнявши їх, можна визначити, прокручує користувач вгору чи вниз.
Підсумовуючи, створення адаптивного веб-сайту вимагає керування анімацією JavaScript для різних пристроїв. Розробники можуть забезпечити оптимальну взаємодію з користувачем, запускаючи певні анімації на основі ширини екрана за допомогою таких інструментів, як .
При правильній реалізації веб-сайти можуть покращити свою візуальну поведінку та продуктивність на різних пристроях. Один зі способів зробити це — вибірково застосувати анімацію прокручування та ізольувати їх. Цей метод гарантує плавний перехід між настільною та мобільною анімаціями та допомагає запобігти конфліктам сценаріїв.
- На цю статтю надихнули найкращі практики адаптивного веб-дизайну та використання JavaScript Мережа розробників Mozilla (MDN) . MDN надає детальну документацію щодо ефективного використання та інші методи медіа-запитів у JavaScript.
- Додаткові ресурси щодо оптимізації анімації на основі прокручування було зібрано з Трюки CSS , пропонуючи зрозуміти, як працюють і можуть бути налаштовані для різних розмірів екрана.
- Поради щодо оптимізації продуктивності та стратегії керування JavaScript на різних пристроях були отримані з Журнал Smashing , який підкреслює важливість модульних сценаріїв для адаптивних веб-додатків.