Reparation af medieafhængige JavaScript-animationer til responsive websteder

JavaScript

Forstå problemet med betingede JavaScript-animationer

Det er ofte nødvendigt at inkorporere særskilt adfærd for forskellige enhedstyper eller skærmstørrelser, når du bruger responsivt webdesign. Det kan være udfordrende at bruge JavaScript i denne situation til at styre animationer baseret på medieforespørgsler. Når to animationer – en for hver enhed – ikke fungerer samtidigt som forventet, er det et almindeligt problem.

To JavaScript-animationer bruges i dette scenarie: en til en "navigationsrulle" (egnet til større skærme) og en anden til en "cta-rulle" (call-to-action) beregnet til mindre enheder. Vanskeligheden ligger i at sikre, at hver animation afspilles separat i henhold til skærmbredden, mens kollisioner afværges.

Når to animationer er sat i forskellige script-tags, og kun én af dem fungerer korrekt, opstår der et problem. Hvis de implementeres skødesløst, kan flette dem under en enkelt betingelse eller kombinere script-tags resultere i yderligere problemer, især når du bruger medieforespørgsler såsom `window.matchMedia()`.

Dette indlæg vil gennemgå, hvordan du bruger mediebetingelser til at organisere din JavaScript, så hver animation fungerer efter hensigten. For at give problemfri overgange mellem mobile og større skærme, vil det lægge stor vægt på passende betingede erklæringer og medieforespørgsler.

Kommando Eksempel på brug
window.matchMedia() JavaScript bruger denne teknik til at anvende medieforespørgsler. Baseret på skærmstørrelsen bestemmer den, om dokumentet opfylder den givne CSS-medieforespørgsel og starter de relevante JavaScript-handlinger. Dette script gør det nemmere at skelne animationer til større skærme i forhold til mobile.
addEventListener("change", callback) Denne kommando holder øje med ændringer af status for medieforespørgslen. Funktionen, der leveres som tilbagekald, udføres, når skærmbredden overstiger en forudbestemt tærskel (såsom 450 pixels). Det tillader dynamisk respons uden at kræve sideopdateringer.
removeEventListener("scroll", callback) Ved at eliminere meningsløs hændelseshåndtering på den forkerte skærmstørrelse optimerer denne kommando hastigheden ved at fjerne scrollhændelseslytteren, når den ikke længere er påkrævet. Når der veksles mellem mediehenvendelser, er det bydende nødvendigt.
window.pageYOffset Mængden af ​​pixels, der er blevet rullet op og ned i dokumentet, returneres af denne attribut. Den bruges til at registrere, om brugeren ruller op eller ned, og til at spore rullepositionen.
element.style.top Denne kommando justerer et elements øverste CSS-egenskab, som styrer elementets lodrette position på siden. Her bruges det til at bestemme, hvor i brugerens rulle navigationslinjen skal vises eller skjules.
element.style.left Denne kommando flytter elementer vandret ved at justere den venstre CSS-egenskab, ligesom element.style.top gør. På mobile enheder bruges den til at skubbe knappen til handling ind og ud af syne.
mediaQuery.matches Denne egenskab verificerer, om medieforespørgslen og dokumentet nu matcher. For at sikre, at den passende animation anvendes på mobile enheder i modsætning til desktops, er det vigtigt at køre de passende animationer baseret på skærmbredden.
prevScrollpos >prevScrollpos > currentScrollPos For at bestemme rulleretningen (op eller ned) kontrollerer denne betingelse rulleplaceringerne fra de tidligere og aktuelle iterationer. Det er afgørende at bestemme, hvordan elementer skal reagere på rulning – for eksempel ved at afsløre eller skjule knapper eller navigationslinjer.
onscroll En integreret hændelseshandler, der udløses ved at rulle af brugeren. Ved at sammenligne de tidligere og aktuelle rullepositioner udfører den de rullebaserede animationer.

Håndtering af JavaScript-animationer baseret på skærmstørrelse

De tidligere eksempler på JavaScript-scripts blev lavet for at løse problemet med at have to forskellige animationer - en til desktop og en til mobile enheder. At sikre, at hver animation kun starter, når det er nødvendigt, afhængigt af enhedens skærmbredde, er den primære udfordring. De teknik bruges til at opnå dette, hvilket gør det muligt for koden at identificere tilfælde, hvor specifikke medieforespørgselsbetingelser er opfyldt. Scripts sørger for, at hver animation fungerer separat baseret på skærmstørrelse ved at bruge forskellige betingelser for desktop (min-bredde: 450px) og mobil (maks. bredde: 450px).

Rulleadfærd på større skærm for navigationslinjen håndteres i det første script. Afhængigt af rulleretningen vil bjælken forbliver enten synlig eller forsvinder, når brugeren ruller op eller ned. Ved hjælp af og variabler, styres dette ved at sammenligne de tidligere og aktuelle rullepositioner. Rulning op får navigationslinjen til at dukke op igen ved at sætte dens øverste position til 0, og scrollning ned får den til at forsvinde ved at flytte den ud af syne med en negativ topværdi.

Det andet script omhandler knappen "call-to-action" (CTA) på mobile enheder. Alle skærmstørrelser viser CTA-knappen, men den animerer kun, når skærmbredden er mindre end 450 pixels. Når brugeren ruller op, glider knappen ind fra venstre side af skærmen; når de ruller ned, forsvinder knappen fra visningen. Med den samme logik til sammenligning af rullepositioner som navigationslinjen er denne adfærd sammenlignelig. Men i stedet for at ændre den øverste værdi, ændrer den knappens venstre placering, så den enten vises eller forsvinder baseret på rulleretningen.

De to scripts er beregnet til at fungere adskilt fra hinanden. De er dog indkapslet i betingede udtryk, der verificerer skærmbredden for at forhindre konflikter. Med , kan medieforespørgsler bruges direkte i JavaScript, hvilket gør det muligt for scripts at skifte dynamisk mellem de to animationer uden at forstyrre hinanden. Ved at holde uvedkommende animationer inden for deres angivne skærmbredder øger denne modulære tilgang effektiviteten og garanterer problemfri drift på stationære og mobile enheder.

Håndtering af betingede animationer baseret på medieforespørgsler med JavaScript

Denne løsning håndterer betingede animationer afhængig af skærmbredden ved at bruge JavaScript i forbindelse med window.matchMedia fungere.

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ær tilgang ved hjælp af separate begivenhedslyttere til forskellige skærmstørrelser

Denne version er mere effektiv og modulær, da den bruger forskellige rullehændelseslyttere til hver medieforespørgsel.

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

Anvendelse af betinget logik på en Unified Scroll Handler til medieforespørgsler

Denne metode bruger en enkelt rullehændelseslytter med betingede kontroller afhængigt af medieforespørgsler til at håndtere begge animationer.

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

Optimering af JavaScript til responsive animationer

En afgørende komponent i udviklingen af ​​websteder, der er responsive, er at sikre, at overgange og animationer reagerer forskelligt på enheder af forskellig størrelse. Effektiv tilstandsstyring er afgørende, når du arbejder med medieforespørgsler og JavaScript, især når animationer kun er beregnet til at blive lanceret på bestemte skærmstørrelser. Det er her, dynamiske begivenhedslyttere og komme i spil. Ved hjælp af disse værktøjer kan udviklere sikre sig, at animationer kun starter, når visse kriterier er opfyldt, hvilket forbedrer brugeroplevelsen og ydeevnen på både desktop- og mobilplatforme.

Håndtering af adskillige animationer, der kører på én gang, giver endnu en vanskelighed for JavaScript-animationer, der afhænger af medier. Opdeling af funktionalitet i mere håndterbare, modulære begivenhedslyttere kan gøre underværker i denne situation. Det er mere effektivt at adskille forskellige funktionaliteter og aktivere dem baseret på bestemte medieforespørgsler i stedet for at udføre alle scripts på én gang. Dette sikrer, at hvert script fungerer efter hensigten på den relevante enhed og hjælper med at spare unødvendig browserbelastning.

Ydeevneoptimering for mobile enheder er især afgørende, når du arbejder med responsive animationer. Fordi mobile enheder ofte har lavere processorkraft end desktops, kan ydeevnen på mobile enheder forbedres ved at reducere scriptkompleksiteten. Dette eksempel på at bruge hændelseshåndtering garanterer effektivt den glatte drift af mobilspecifikke animationer såsom "cta scroll" uden at beskatte enhedens ressourcer. Desuden garanterer det, at større enheder kun indlæser animationer i forhold til skærmstørrelsen.

  1. Hvordan bruger jeg medieforespørgsler i JavaScript?
  2. JavaScript giver dig mulighed for at anvende medieforespørgsler med . Du kan bruge denne måde til at køre forskellige scripts baseret på skærmens bredde.
  3. Hvordan styrer jeg animationer baseret på skærmstørrelse?
  4. Bruge for at bestemme skærmbredden for at styre animationer. Tilføj eller fjern derefter begivenhedslyttere efter behov. Dette garanterer, at afhængigt af skærmstørrelsen, kun den relevante animation afspilles.
  5. Hvad er den bedste måde at optimere scroll-animationer på?
  6. Ved at reducere antallet af handlinger, der udføres inde i rullehændelsen, kan bruges mere effektivt i scroll-animationsoptimering. Når der registreres en rulle, udføres først den nødvendige animationslogik.
  7. Hvordan håndterer jeg flere animationer i JavaScript?
  8. Flere animationer kan administreres ved at dele dem op i forskellige forhold og begivenhedslyttere. Dette mindsker muligheden for konflikter, fordi hver animation fungerer separat.
  9. Hvad gør og gøre i en rulle-animation?
  10. Disse variabler overvåger, hvor brugeren scroller. Den forrige rulleposition gemmes i , og den aktuelle rulleposition gemmes i . Det er muligt at se, om brugeren scroller op eller ned ved at sammenligne dem.

Afslutningsvis kræver oprettelsen af ​​en responsiv hjemmeside håndtering af JavaScript-animationer til forskellige enheder. Udviklere kan give en optimal brugeroplevelse ved at udløse specifikke animationer baseret på skærmbredde gennem brug af værktøjer som f.eks. .

Når de implementeres korrekt, kan websteder forbedre deres visuelle adfærd og ydeevne på forskellige enheder. En måde at gøre dette på er ved at anvende scroll-animationer selektivt og isolere dem. Denne metode garanterer sømløse overgange mellem desktop- og mobilanimationer og hjælper med at forhindre scriptsammenstød.

  1. Denne artikel er inspireret af bedste praksis for responsivt webdesign og JavaScript-brug, som findes på Mozilla Developer Network (MDN) . MDN leverer dybdegående dokumentation om, hvordan man effektivt bruger og andre medieforespørgselsteknikker i JavaScript.
  2. Yderligere ressourcer til optimering af scroll-baserede animationer blev indsamlet fra CSS tricks , der giver indsigt i hvordan fungerer og kan tilpasses til forskellige skærmstørrelser.
  3. Ydeevneoptimeringstips og strategier til administration af JavaScript på tværs af forskellige enheder blev hentet fra Smashing Magazine , som understreger vigtigheden af ​​modulære scripts til responsive webapplikationer.