Ehdollisten JavaScript-animaatioiden ongelman ymmärtäminen
Responsiivista verkkosuunnittelua käytettäessä on usein tarpeen sisällyttää erilainen käyttäytyminen eri laitteille tai näytön kokoille. Tässä tilanteessa JavaScriptin käyttäminen mediakyselyihin perustuvien animaatioiden ohjaamiseen voi olla haastavaa. Kun kaksi animaatiota – yksi jokaiselle laitteelle – ei toimi samanaikaisesti odotetulla tavalla, se on yleinen ongelma.
Tässä skenaariossa käytetään kahta JavaScript-animaatiota: yksi "navigointivieritys" (sopii suuremmille näytöille) ja toinen "cta scroll" (toimintakehotus), joka on tarkoitettu pienemmille laitteille. Vaikeus on varmistaa, että jokainen animaatio toistetaan erikseen näytön leveyden mukaan samalla kun vältetään törmäykset.
Kun kaksi animaatiota on asetettu eri komentosarjatunnisteisiin ja vain yksi niistä toimii oikein, ilmenee ongelma. Jos ne toteutetaan huolimattomasti, niiden yhdistäminen yhden ehdon alle tai komentosarjatunnisteiden yhdistäminen voi aiheuttaa lisäongelmia, erityisesti käytettäessä mediakyselyitä, kuten "window.matchMedia()".
Tässä viestissä käydään läpi mediaolosuhteiden käyttäminen JavaScriptin järjestämiseen niin, että jokainen animaatio toimii tarkoitetulla tavalla. Jotta siirtyminen mobiililaitteiden ja suurempien näyttöjen välillä olisi saumaton, se painottaa voimakkaasti asianmukaisia ehdollisia lausekkeita ja mediakyselyitä.
Komento | Esimerkki käytöstä |
---|---|
window.matchMedia() | JavaScript käyttää tätä tekniikkaa mediakyselyjen soveltamiseen. Näytön koon perusteella se määrittää, täyttääkö asiakirja tietyn CSS-mediakyselyn, ja käynnistää asiaankuuluvat JavaScript-toiminnot. Tämä komentosarja helpottaa suurempien näyttöjen animaatioiden erottamista mobiilinäytöistä. |
addEventListener("change", callback) | Tämä komento tarkkailee mediakyselyn tilan muutoksia. Takaisinsoittona toimitettu toiminto suoritetaan, kun näytön leveys ylittää ennalta määrätyn kynnyksen (kuten 450 pikseliä). Se mahdollistaa dynaamisen vasteen ilman sivun päivittämistä. |
removeEventListener("scroll", callback) | Poistamalla turhan tapahtumien käsittelyn väärässä näytön koossa tämä komento optimoi nopeuden poistamalla vieritystapahtuman kuuntelijan, kun sitä ei enää tarvita. Kun vaihdat tiedotusvälineiden tiedustelut, se on välttämätöntä. |
window.pageYOffset | Tämä määrite palauttaa asiakirjassa ylös ja alas vieritettyjen pikselien määrän. Sitä käytetään tunnistamaan, vierittääkö käyttäjä ylös vai alas, ja seuraamaan vierityskohtaa. |
element.style.top | Tämä komento säätää elementin ylimmän CSS-ominaisuuden, joka ohjaa elementin pystysuoraa sijaintia sivulla. Täällä sitä käytetään määrittämään, missä käyttäjän vierityskohdassa navigointipalkki tulee näyttää tai piilottaa. |
element.style.left | Tämä komento siirtää elementtejä vaakasuunnassa säätämällä vasenta CSS-ominaisuutta, aivan kuten element.style.top tekee. Mobiililaitteissa sitä käytetään liu'uttamaan toimintakehotuspainiketta sisään ja pois näkyvistä. |
mediaQuery.matches | Tämä ominaisuus tarkistaa, vastaavatko mediakysely ja asiakirja nyt. Jotta varmistetaan, että mobiililaitteissa käytetään oikeaa animaatiota pöytätietokoneiden sijaan, on välttämätöntä suorittaa asianmukaiset animaatiot ehdollisesti näytön leveyden perusteella. |
prevScrollpos >prevScrollpos > currentScrollPos | Tämä ehto tarkistaa vierityssuunnan (ylös tai alas) vierityspaikat edellisestä ja nykyisestä iteraatiosta. On ratkaisevan tärkeää määrittää, kuinka kohteiden tulee reagoida vieritykseen – esimerkiksi paljastamalla tai piilottamalla painikkeita tai navigointipalkkeja. |
onscroll | Integroitu tapahtumakäsittelijä, jonka käyttäjä käynnistää vierittämällä. Vertaamalla edellistä ja nykyistä vieritysasentoa se suorittaa vierityspohjaiset animaatiot. |
JavaScript-animaatioiden hallinta näytön koon perusteella
Aiemmat esimerkit JavaScript-skripteistä tehtiin kahden erilaisen animaation ongelman ratkaisemiseksi – yksi työpöydälle ja toinen mobiililaitteille. Ensisijainen haaste on varmistaa, että jokainen animaatio käynnistyy vain silloin, kun sitä tarvitaan, riippuen laitteen näytön leveydestä. The window.matchMedia() Tämän saavuttamiseksi käytetään tekniikkaa, jonka avulla koodi voi tunnistaa tapaukset, joissa tietyt mediakyselyn ehdot täyttyvät. Skriptit varmistavat, että jokainen animaatio toimii erikseen näytön koon mukaan käyttämällä erilaisia ehtoja työpöydälle (min-leveys: 450px) ja mobiililaitteille (max-leveys: 450px).
Ensimmäisessä skriptissä käsitellään navigointipalkin suuremman näytön vierittämistä. Rullauksen suunnasta riippuen navigointi palkki joko pysyy näkyvissä tai katoaa, kun käyttäjä vierittää ylös tai alas. Käyttämällä prevScrollpos ja currentScrollPos muuttujat, tätä hallitaan vertaamalla edellistä ja nykyistä vieritysasentoa. Ylös vierittäminen saa navigointipalkin uudelleen näkyviin asettamalla sen ylimmäksi asentoon 0, ja alaspäin vierittäminen saa sen katoamaan siirtämällä sen pois näkyvistä negatiivisella yläarvolla.
Toinen skripti käsittelee "toimintakehotus" (CTA) -painiketta mobiililaitteissa. Kaikissa näytöissä näkyy CTA-painike, mutta se animoituu vain, kun näytön leveys on alle 450 pikseliä. Kun käyttäjä vierittää ylöspäin, painike liukuu sisään näytön vasemmasta reunasta; kun ne vieritetään alaspäin, painike katoaa näkyvistä. Samalla vierityspaikan vertailulogiikalla kuin navigointipalkissa tämä toiminta on vertailukelpoista. Sen sijaan, että se muuttaisi yläarvoa, se muuttaa painikkeen vasenta sijaintia, jolloin se joko ilmestyy tai katoaa vierityssuunnan perusteella.
Kahden skriptin on tarkoitus toimia erillään toisistaan. Ne on kuitenkin kapseloitu ehdollisiin lausekkeisiin, jotka varmistavat näytön leveyden ristiriitojen estämiseksi. Kanssa mediaQuery.matches, mediakyselyjä voidaan käyttää suoraan JavaScriptissä, jolloin skriptit voivat siirtyä dynaamisesti kahden animaation välillä häiritsemättä toisiaan. Tämä modulaarinen lähestymistapa lisää tehokkuutta ja takaa saumattoman toiminnan pöytäkoneilla ja mobiililaitteilla, kun se pitää ylimääräiset animaatiot niille määritetyillä näytön leveyksillä.
Mediakyselyihin perustuvien ehdollisten animaatioiden käsittely JavaScriptillä
Tämä ratkaisu käsittelee näytön leveydestä riippuvia ehdollisia animaatioita käyttämällä JavaScriptiä yhdessä window.matchMedia toiminto.
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;
}
Modulaarinen lähestymistapa, jossa käytetään erillisiä tapahtumanseurantalaitteita erikokoisille näytöille
Tämä versio on tehokkaampi ja modulaarinen, koska se käyttää erilaisia vieritystapahtuman kuuntelijoita jokaisessa mediakyselyssä.
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);
Ehdollisen logiikan soveltaminen mediakyselyjen yhtenäiseen vierityskäsittelijään
Tämä menetelmä käsittelee molempia animaatioita yhtä vieritystapahtuman kuuntelijaa ja ehdollisia tarkistuksia mediakyselyistä riippuen.
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;
}
JavaScriptin optimointi reagoivia animaatioita varten
Tärkeä osa responsiivisten verkkosivustojen kehittämistä on varmistaa, että siirtymät ja animaatiot reagoivat eri tavalla erikokoisissa laitteissa. Tehokas kunnonhallinta on ratkaisevan tärkeää, kun työskentelet mediakyselyjen ja JavaScriptin kanssa, erityisesti silloin, kun animaatiot on tarkoitus käynnistää vain tietyissä näytöissä. Täällä dynaamiset tapahtumakuuntelijat ja window.matchMedia() tulla peliin. Näiden työkalujen avulla kehittäjät voivat varmistaa, että animaatiot käynnistyvät vain, kun tietyt kriteerit täyttyvät, mikä parantaa käyttökokemusta ja suorituskykyä niin työpöytä- kuin mobiilialustoillakin.
Lukuisten samanaikaisesti suoritettavien animaatioiden käsittely on toinen vaikeus mediasta riippuvaisille JavaScript-animaatioille. Toimivuuden jakaminen paremmin hallittaviin, modulaarisiin tapahtumakuuntelijoihin voi tehdä ihmeitä tässä tilanteessa. On tehokkaampaa erottaa eri toiminnot ja aktivoida ne tiettyjen mediakyselyjen perusteella sen sijaan, että suoritettaisiin kaikki komentosarjat kerralla. Tämä varmistaa, että jokainen komentosarja toimii tarkoitetulla tavalla asianmukaisella laitteella ja auttaa säästämään turhaa selaimen kuormitusta.
Mobiililaitteiden suorituskyvyn optimointi on erityisen tärkeää, kun työskentelet reagoivien animaatioiden kanssa. Koska mobiililaitteiden prosessointiteho on usein pienempi kuin pöytätietokoneiden, mobiililaitteiden suorituskykyä voidaan parantaa vähentämällä komentosarjojen monimutkaisuutta. Tämä esimerkki käyttää rullaa tapahtumakäsittelijä takaa tehokkaasti mobiilikohtaisten animaatioiden, kuten "cta scrollin", sujuvan toiminnan ilman laitteen resursseja. Lisäksi se takaa, että suuremmat laitteet lataavat vain näytön kokoon suhteutettuja animaatioita.
Usein kysytyt kysymykset JavaScript-animaatioista ja mediakyselyistä
- Kuinka käytän mediakyselyitä JavaScriptissä?
- JavaScriptin avulla voit käyttää mediakyselyjä window.matchMedia(). Voit käyttää tätä tapaa ajaaksesi erilaisia skriptejä näytön leveyden mukaan.
- Kuinka ohjaan animaatioita näytön koon perusteella?
- Käyttää window.matchMedia() määrittääksesi näytön leveyden animaatioiden ohjaamiseksi. Lisää tai poista sitten tapahtumakuuntelijoita tarpeen mukaan. Tämä takaa, että näytön koosta riippuen vain asiaankuuluva animaatio toistetaan.
- Mikä on paras tapa optimoida vieritysanimaatioita?
- Vähentämällä vieritystapahtuman sisällä suoritettavien toimintojen määrää, window.onscroll voidaan käyttää tehokkaammin vieritysanimaatioiden optimoinnissa. Kun vieritys havaitaan, vaadittu animaatiologiikka suoritetaan vasta sitten.
- Kuinka käsittelen useita animaatioita JavaScriptissä?
- Useita animaatioita voidaan hallita jakamalla ne eri olosuhteisiin ja tapahtumakuuntelijoihin. Tämä vähentää ristiriitojen mahdollisuutta, koska jokainen animaatio toimii erikseen.
- Mitä tekee prevScrollpos ja currentScrollPos tehdä rullaanimaatiossa?
- Nämä muuttujat valvovat, missä käyttäjä vierittää. Edellinen vierityskohta tallennetaan prevScrollpos, ja nykyinen vierityskohta tallennetaan currentScrollPos. On mahdollista kertoa, vierittääkö käyttäjä ylös vai alas vertaamalla niitä.
Viimeisiä ajatuksia mediakyselyihin perustuvista animaatioista
Yhteenvetona voidaan todeta, että responsiivisen verkkosivuston luominen edellyttää JavaScript-animaatioiden hallintaa eri laitteille. Kehittäjät voivat tarjota optimaalisen käyttökokemuksen käynnistämällä tiettyjä animaatioita näytön leveyden perusteella käyttämällä työkaluja, kuten window.matchMedia().
Oikein toteutettuina verkkosivustot voivat parantaa visuaalista käyttäytymistään ja suorituskykyään eri laitteilla. Yksi tapa tehdä tämä on käyttää vieritysanimaatioita valikoivasti ja eristää ne. Tämä menetelmä takaa saumattomat siirtymät työpöytä- ja mobiilianimaatioiden välillä ja auttaa estämään skriptien ristiriitoja.
Viitteet JavaScript-mediakyselyihin ja -animaatioihin
- Tämä artikkeli on saanut inspiraationsa responsiivisen web-suunnittelun ja JavaScriptin käytön parhaista käytännöistä Mozilla Developer Network (MDN) . MDN tarjoaa perusteellisen dokumentaation tehokkaasta käytöstä window.matchMedia() ja muut mediakyselytekniikat JavaScriptissä.
- Lisää resursseja vierityspohjaisten animaatioiden optimointiin kerättiin CSS temppuja , joka tarjoaa näkemyksiä siitä, miten rullaa animaatioita toimivat ja voidaan räätälöidä eri näyttökokoja varten.
- Suorituskyvyn optimointivinkit ja -strategiat JavaScriptin hallintaan eri laitteissa hankittiin osoitteesta Smashing Magazine , joka korostaa modulaaristen komentosarjojen merkitystä reagoiville verkkosovelluksille.