Oprava animácií JavaScript závislých od médií pre responzívne webové stránky

Oprava animácií JavaScript závislých od médií pre responzívne webové stránky
Oprava animácií JavaScript závislých od médií pre responzívne webové stránky

Pochopenie problému podmienených animácií JavaScriptu

Pri použití responzívneho webového dizajnu je často potrebné začleniť odlišné správanie pre rôzne druhy zariadení alebo veľkosti obrazoviek. V tejto situácii môže byť náročné použiť JavaScript na ovládanie animácií na základe mediálnych dopytov. Keď dve animácie – jedna pre každé zariadenie – nefungujú súčasne, ako sa očakávalo, ide o bežný problém.

V tomto scenári sa používajú dve JavaScriptové animácie: jedna pre „navigačný posúvač“ (vhodná pre väčšie obrazovky) a druhá pre „cta posúvanie“ (výzva na akciu) určená pre menšie zariadenia. Obtiažnosť spočíva v zabezpečení toho, aby sa každá animácia prehrávala oddelene podľa šírky obrazovky pri predchádzaní kolíziám.

Keď sú dve animácie nastavené v rôznych značkách skriptu a iba jedna z nich funguje správne, nastáva problém. Ak ich implementujete neopatrne, ich zlúčenie pod jednou podmienkou alebo kombinovanie značiek skriptu môže viesť k ďalším problémom, najmä pri použití mediálnych dopytov, ako je napríklad `window.matchMedia()`.

Tento príspevok sa bude zaoberať tým, ako používať podmienky médií na usporiadanie vášho JavaScriptu tak, aby každá animácia fungovala podľa plánu. Na zabezpečenie bezproblémových prechodov medzi mobilnými a väčšími obrazovkami bude klásť veľký dôraz na vhodné podmienené vyhlásenia a mediálne dopyty.

Príkaz Príklad použitia
window.matchMedia() JavaScript používa túto techniku ​​na aplikovanie mediálnych dopytov. Na základe veľkosti obrazovky určí, či dokument vyhovuje danému CSS mediálnemu dopytu a spustí príslušné JavaScriptové operácie. Tento skript uľahčuje rozlíšenie animácií pre väčšie displeje od mobilných.
addEventListener("change", callback) Tento príkaz sleduje zmeny stavu mediálneho dotazu. Funkcia poskytnutá ako spätné volanie sa vykoná, keď šírka obrazovky prekročí vopred stanovený prah (napríklad 450 pixelov). Umožňuje dynamickú odozvu bez potreby obnovovania stránky.
removeEventListener("scroll", callback) Odstránením nezmyselného spracovania udalostí na nesprávnej veľkosti obrazovky tento príkaz optimalizuje rýchlosť odstránením prijímača udalosti rolovania, keď už nie je potrebný. Pri striedaní mediálnych dopytov je to nevyhnutné.
window.pageYOffset Tento atribút vráti počet pixelov, ktoré sa v dokumente posunuli nahor a nadol. Používa sa na zistenie, či používateľ roluje nahor alebo nadol, a na sledovanie polohy rolovania.
element.style.top Tento príkaz upravuje vrchnú vlastnosť CSS prvku, ktorá riadi vertikálnu polohu prvku na stránke. Tu sa používa na určenie, kde v rolovaní používateľa má byť zobrazený alebo skrytý navigačný panel.
element.style.left Tento príkaz posúva prvky horizontálne úpravou ľavej vlastnosti CSS, rovnako ako element.style.top. Na mobilných zariadeniach sa používa na posúvanie tlačidla s výzvou na akciu dovnútra a von zo zobrazenia.
mediaQuery.matches Táto vlastnosť overuje, či sa mediálny dotaz a dokument teraz zhodujú. Aby ste sa uistili, že sa vhodná animácia použije na mobilných zariadeniach, nie na stolných počítačoch, je nevyhnutné podmienečne spustiť príslušné animácie na základe šírky obrazovky.
prevScrollpos >prevScrollpos > currentScrollPos Ak chcete určiť smer posúvania (nahor alebo nadol), táto podmienka kontroluje miesta posúvania z predchádzajúcej a aktuálnej iterácie. Rozhodujúce je určiť, ako by mali položky reagovať na posúvanie – napríklad odhalením alebo skrytím tlačidiel alebo navigačných panelov.
onscroll Integrovaný obslužný program udalostí, ktorý sa spúšťa posúvaním používateľa. Porovnaním predchádzajúcej a aktuálnej pozície rolovania vykoná rolovacie animácie.

Správa animácií JavaScript na základe veľkosti obrazovky

Skoršie príklady skriptov JavaScript boli vytvorené s cieľom vyriešiť problém dvoch rôznych animácií – jednej pre stolné počítače a jednej pre mobilné zariadenia. Hlavnou výzvou je zabezpečiť, aby sa každá animácia spustila iba vtedy, keď je to potrebné, v závislosti od šírky obrazovky zariadenia. The window.matchMedia() Na dosiahnutie tohto cieľa sa používa technika, ktorá umožňuje kódu identifikovať prípady, v ktorých sú splnené špecifické podmienky dopytu na médiá. Skripty zaisťujú, že každá animácia funguje oddelene na základe veľkosti obrazovky použitím rôznych podmienok pre počítače (min. šírka: 450 pixelov) a mobilné zariadenia (maximálna šírka: 450 pixelov).

Správanie pri posúvaní na väčšej obrazovke pre navigačný panel je spracované v prvom skripte. V závislosti od smeru posúvania sa navigácia lišta buď zostane viditeľná alebo zmizne, keď sa používateľ posunie nahor alebo nadol. Pomocou prevScrollpos a currentScrollPos premenné, toto sa riadi porovnaním predchádzajúcej a aktuálnej pozície rolovania. Posúvanie nahor spôsobí, že sa navigačný panel znova zobrazí nastavením jeho hornej polohy na 0, a posúvanie nadol spôsobí jeho zmiznutie posunutím mimo zobrazenia so zápornou hornou hodnotou.

Druhý skript sa zaoberá tlačidlom „call-to-action“ (CTA) na mobilných zariadeniach. Všetky veľkosti obrazovky zobrazujú tlačidlo CTA, ale animuje sa iba vtedy, keď je šírka obrazovky menšia ako 450 pixelov. Keď používateľ roluje nahor, tlačidlo sa zasunie z ľavej strany obrazovky; keď sa posunú nadol, tlačidlo zmizne z dohľadu. Toto správanie je porovnateľné s rovnakou logikou porovnávania pozície posúvania ako navigačný panel. Namiesto toho, aby zmenila hornú hodnotu, upraví ľavú polohu tlačidla, čo spôsobí, že sa objaví alebo zmizne v závislosti od smeru posúvania.

Tieto dva skripty majú fungovať oddelene od seba. Sú však zapuzdrené do podmienených výrazov, ktoré overujú šírku obrazovky, aby sa predišlo konfliktom. s mediaQuery.matches, mediálne dotazy môžu byť použité priamo v JavaScripte, čo umožňuje skriptom dynamicky prechádzať medzi dvoma animáciami bez toho, aby sa navzájom rušili. Tento modulárny prístup udržiavaním nadbytočných animácií v rámci ich určených šírok obrazovky zvyšuje efektivitu a zaručuje bezproblémovú prevádzku na stolných počítačoch a mobilných zariadeniach.

Spracovanie podmienených animácií na základe mediálnych dopytov pomocou JavaScriptu

Toto riešenie spracováva podmienené animácie závislé od šírky obrazovky pomocou JavaScriptu v spojení s window.matchMedia funkciu.

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;
}

Modulárny prístup využívajúci samostatné prijímače udalostí pre rôzne veľkosti obrazovky

Táto verzia je efektívnejšia a modulárnejšia, pretože pre každý mediálny dotaz používa rôzne prijímače udalostí rolovania.

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);

Použitie podmienenej logiky na Unified Scroll Handler pre mediálne dotazy

Táto metóda používa jeden poslucháč udalostí rolovania s podmienenými kontrolami v závislosti od mediálnych dopytov na spracovanie oboch animácií.

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;
}

Optimalizácia JavaScriptu pre responzívne animácie

Rozhodujúcim prvkom vývoja webových stránok, ktoré sú responzívne, je zabezpečiť, aby prechody a animácie reagovali odlišne na zariadeniach rôznych veľkostí. Efektívna správa podmienok je rozhodujúca pri práci s mediálnymi dopytmi a JavaScriptom, najmä ak sa majú animácie spúšťať iba na určitých veľkostiach obrazovky. To je miesto, kde dynamickí poslucháči udalostí a window.matchMedia() vstúpiť do hry. Pomocou týchto nástrojov môžu vývojári zabezpečiť, aby sa animácie spúšťali len vtedy, keď sú splnené určité kritériá, čím sa zlepšuje používateľská skúsenosť a výkon na desktopových aj mobilných platformách.

Spracovanie množstva animácií, ktoré sa spúšťajú naraz, predstavuje ďalší problém pre animácie JavaScript, ktoré závisia od média. Rozdelenie funkčnosti na lepšie spravovateľné modulárne poslucháče udalostí môže v tejto situácii robiť zázraky. Je efektívnejšie oddeliť rôzne funkcionality a aktivovať ich na základe konkrétnych mediálnych dopytov, ako spúšťať všetky skripty naraz. To zaisťuje, že každý skript funguje na príslušnom zariadení tak, ako má, a pomáha šetriť zbytočné zaťaženie prehliadača.

Optimalizácia výkonu pre mobilné zariadenia je obzvlášť dôležitá pri práci s responzívnymi animáciami. Keďže mobilné zariadenia majú často nižší výpočtový výkon ako stolné počítače, výkon na mobilných zariadeniach možno zlepšiť znížením zložitosti skriptov. Tento prípad použitia onscroll obsluha udalostí efektívne zaručuje plynulú prevádzku animácií špecifických pre mobilné zariadenia, ako je „cta scroll“ bez zaťažovania zdrojov zariadenia. Okrem toho zaručuje, že väčšie zariadenia načítajú animácie úmerné iba veľkosti obrazovky.

Často kladené otázky o JavaScriptových animáciách a mediálnych dopytoch

  1. Ako môžem použiť mediálne dopyty v JavaScripte?
  2. JavaScript vám umožňuje aplikovať mediálne dopyty s window.matchMedia(). Tento spôsob môžete použiť na spúšťanie rôznych skriptov na základe šírky obrazovky.
  3. Ako môžem ovládať animácie na základe veľkosti obrazovky?
  4. Použite window.matchMedia() na určenie šírky obrazovky na ovládanie animácií. Potom podľa potreby pridajte alebo odstráňte prijímače udalostí. To zaručuje, že v závislosti od veľkosti obrazovky sa prehrá iba príslušná animácia.
  5. Aký je najlepší spôsob optimalizácie animácií posúvania?
  6. Znížením počtu operácií vykonaných v rámci udalosti rolovania window.onscroll možno efektívnejšie použiť pri optimalizácii animácie posúvania. Keď sa zistí rolovanie, až potom sa vykoná požadovaná logika animácie.
  7. Ako spracujem viacero animácií v JavaScripte?
  8. Viaceré animácie je možné spravovať ich rozdelením do rôznych podmienok a poslucháčov udalostí. Tým sa znižuje možnosť konfliktov, pretože každá animácia funguje samostatne.
  9. Čo robí prevScrollpos a currentScrollPos robiť v rolovacej animácii?
  10. Tieto premenné monitorujú, kde sa používateľ posúva. Predchádzajúca pozícia rolovania sa uloží prevScrollposa uloží sa aktuálna pozícia rolovania currentScrollPos. Porovnaním je možné zistiť, či používateľ roluje nahor alebo nadol.

Záverečné myšlienky o animáciách založených na dopyte médií

Na záver, vytvorenie responzívneho webu si vyžaduje správu JavaScript animácií pre rôzne zariadenia. Vývojári môžu poskytnúť optimálnu používateľskú skúsenosť spúšťaním špecifických animácií na základe šírky obrazovky pomocou nástrojov, ako sú napr window.matchMedia().

Pri správnej implementácii môžu webové stránky zlepšiť svoje vizuálne správanie a výkon na rôznych zariadeniach. Jedným zo spôsobov, ako to dosiahnuť, je selektívne použitie animácií posúvania a ich izolácia. Táto metóda zaručuje plynulé prechody medzi animáciami pre počítače a mobilné zariadenia a pomáha predchádzať konfliktom medzi skriptami.

Referencie pre mediálne dopyty a animácie JavaScript
  1. Tento článok bol inšpirovaný osvedčenými postupmi pre responzívny webový dizajn a používanie JavaScriptu, ktoré nájdete na Mozilla Developer Network (MDN) . MDN poskytuje hĺbkovú dokumentáciu o tom, ako efektívne používať window.matchMedia() a ďalšie techniky dopytovania médií v JavaScripte.
  2. Ďalšie zdroje na optimalizáciu animácií založených na posúvaní boli zhromaždené z CSS triky , ktorá ponúka prehľad o tom, ako rolovacie animácie fungujú a možno ich prispôsobiť pre rôzne veľkosti obrazovky.
  3. Zdrojom tipov a stratégií na optimalizáciu výkonu na správu JavaScriptu v rôznych zariadeniach boli Smashing Magazine , ktorý zdôrazňuje dôležitosť modulárnych skriptov pre responzívne webové aplikácie.