Sužinokite, kaip naudoti „Intersection Observer“ API, norint įdiegti „lazy loading“ ir „infinite scroll“, gerinant svetainės našumą ir vartotojo patirtį.
Intersection Observer: žiniatinklio našumo optimizavimas naudojant „Lazy Loading“ ir „Infinite Scroll“
Šiuolaikiniame žiniatinklio kūrimo pasaulyje našumas yra svarbiausias dalykas. Vartotojai tikisi greitų ir jautrių svetainių, nepriklausomai nuo jų vietos ar įrenginio. „Intersection Observer“ API suteikia galingą būdą žymiai pagerinti žiniatinklio našumą įdiegiant tokias technikas kaip „lazy loading“ (atidėtas įkėlimas) ir „infinite scroll“ (begalinis slinkimas). Šiame straipsnyje pateikiamas išsamus vadovas, kaip suprasti ir naudoti „Intersection Observer“ API, siekiant sukurti geresnę vartotojo patirtį pasaulinei auditorijai.
Kas yra „Intersection Observer“ API?
„Intersection Observer“ API suteikia būdą asinchroniškai stebėti tikslinio elemento susikirtimo su protėvio elementu arba dokumento peržiūros sritimi (angl. viewport) pokyčius. Paprasčiau tariant, tai leidžia aptikti, kada elementas tampa matomas ekrane (arba kito elemento atžvilgiu), nuolat neatliekant apklausų ar nenaudojant daug resursų reikalaujančių įvykių klausytojų. Tai yra labai svarbu norint optimizuoti našumą, nes galite atidėti tam tikrų veiksmų įkėlimą ar vykdymą, kol jų iš tikrųjų prireiks.
Pagrindinės sąvokos:
- Tikslinis elementas (Target Element): Elementas, kurio susikirtimą norite stebėti.
- Šakninis elementas (Root Element): Protėvio elementas, kuris veikia kaip peržiūros sritis (arba ribojantis rėmelis) susikirtimui. Jei nustatyta
null
, naudojama dokumento peržiūros sritis. - Slenkstis (Threshold): Skaičius arba skaičių masyvas, nurodantis, kokiam tikslinio elemento matomumo procentui esant turėtų būti vykdoma atgalinio skambučio funkcija. Slenkstis 0 reiškia, kad funkcija vykdoma, kai tik matomas bent vienas tikslinio elemento pikselis. Slenkstis 1.0 reiškia, kad turi būti matoma 100 % tikslinio elemento.
- Atgalinio skambučio funkcija (Callback Function): Funkcija, kuri vykdoma, kai susikirtimas pasikeičia ir atitinka nurodytą slenkstį.
- Susikirtimo santykis (Intersection Ratio): Reikšmė nuo 0 iki 1, nurodanti, kokia tikslinio elemento dalis yra matoma šakniniame elemente.
„Lazy Loading“: resursų įkėlimas pagal poreikį
„Lazy loading“ (atidėtas įkėlimas) yra technika, kuri atideda resursų (paveikslėlių, vaizdo įrašų, scenarijų ir kt.) įkėlimą, kol jų prireikia, dažniausiai – kai jie netrukus pasirodys matomumo lauke. Tai žymiai sumažina pradinį puslapio įkėlimo laiką ir pagerina našumą, ypač puslapiuose su daug resursų. Užuot iš karto įkėlus visus paveikslėlius, įkeliami tik tie, kuriuos vartotojas greičiausiai pamatys iškart. Vartotojui slenkant, įkeliama daugiau paveikslėlių. Tai ypač naudinga vartotojams, turintiems lėtą interneto ryšį arba ribotus duomenų planus.
„Lazy Loading“ įgyvendinimas su „Intersection Observer“
Štai kaip įgyvendinti atidėtą įkėlimą naudojant „Intersection Observer“ API:
- Paruoškite HTML: Pradėkite nuo laikinų paveikslėlių arba tuščių
<img>
žymų sudata-src
atributu, kuriame yra tikrasis paveikslėlio URL. - Sukurkite „Intersection Observer“: Sukurkite naują
IntersectionObserver
objektą, perduodami jam atgalinio skambučio funkciją ir neprivalomą parinkčių objektą. - Stebėkite tikslinius elementus: Naudokite
observe()
metodą, kad pradėtumėte stebėti kiekvieną tikslinį elementą (šiuo atveju – paveikslėlį). - Atgalinio skambučio funkcijoje: Kai tikslinis elementas susikerta su peržiūros sritimi (pagal nurodytą slenkstį), pakeiskite laikiną paveikslėlį tikruoju paveikslėlio URL.
- Nutraukite elemento stebėjimą: Kai paveikslėlis įkeliamas, nutraukite tikslinio elemento stebėjimą, kad išvengtumėte tolesnių nereikalingų atgalinių skambučių.
Kodo pavyzdys: paveikslėlių „Lazy Loading“
Šis pavyzdys demonstruoja paveikslėlių atidėtą įkėlimą naudojant „Intersection Observer“ API.
<!-- HTML -->
<img data-src="image1.jpg" alt="Image 1" class="lazy-load">
<img data-src="image2.jpg" alt="Image 2" class="lazy-load">
<img data-src="image3.jpg" alt="Image 3" class="lazy-load">
<script>
const lazyLoadImages = document.querySelectorAll('.lazy-load');
const options = {
root: null, // Naudoti peržiūros sritį kaip šakninį elementą
rootMargin: '0px',
threshold: 0.2 // Įkelti, kai matoma 20% paveikslėlio
};
const lazyLoad = (image, observer) => {
image.src = image.dataset.src;
image.onload = () => {
image.classList.remove('lazy-load');
observer.unobserve(image);
};
};
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
lazyLoad(entry.target, observer);
}
});
}, options);
lazyLoadImages.forEach(image => {
observer.observe(image);
});
</script>
„Lazy Loading“ privalumai:
- Sumažintas pradinis įkėlimo laikas: Įkeliant tik reikalingus resursus iš anksto, žymiai sumažinamas pradinis puslapio įkėlimo laikas, o tai lemia greitesnę ir jautresnę vartotojo patirtį.
- Duomenų srauto taupymas: Vartotojai atsisiunčia tik tuos resursus, kurių jiems iš tikrųjų reikia, taip taupydami duomenų srautą, ypač mobiliesiems įrenginiams ar vartotojams su ribotais duomenų planais.
- Pagerintas našumas: Atidėjus resursų įkėlimą, atlaisvinami naršyklės resursai, o tai pagerina bendrą našumą ir užtikrina sklandesnį slinkimą.
- SEO nauda: Greitesnis įkėlimo laikas yra teigiamas paieškos sistemų reitingavimo veiksnys.
„Infinite Scroll“: sklandus turinio įkėlimas
„Infinite scroll“ (begalinis slinkimas) yra technika, kuri įkelia daugiau turinio vartotojui slenkant puslapį žemyn, sukuriant sklandžią ir nenutrūkstamą naršymo patirtį. Tai dažnai naudojama socialinių tinklų srautuose, elektroninės prekybos produktų sąrašuose ir naujienų svetainėse. Užuot skaidžius turinį į atskirus puslapius, naujas turinys automatiškai įkeliamas ir pridedamas prie esamo turinio, kai vartotojas pasiekia dabartinio turinio pabaigą.
„Infinite Scroll“ įgyvendinimas su „Intersection Observer“
„Intersection Observer“ API galima naudoti norint nustatyti, kada vartotojas pasiekė turinio pabaigą, ir suaktyvinti daugiau turinio įkėlimą.
- Sukurkite stebėjimo elementą: Puslapio turinio pabaigoje pridėkite stebėjimo elementą (pvz.,
<div>
). Šis elementas bus naudojamas nustatyti, kada vartotojas pasiekė puslapio apačią. - Sukurkite „Intersection Observer“: Sukurkite naują
IntersectionObserver
objektą, stebintį stebėjimo elementą. - Atgalinio skambučio funkcijoje: Kai stebėjimo elementas susikerta su peržiūros sritimi, paleiskite daugiau turinio įkėlimą. Paprastai tai apima API užklausos siuntimą, norint gauti kitą duomenų partiją.
- Pridėkite naują turinį: Gavus naują turinį, pridėkite jį prie esamo turinio puslapyje.
- Perkelkite stebėjimo elementą: Pridėjus naują turinį, perkelkite stebėjimo elementą į naujai pridėto turinio pabaigą, kad būtų galima toliau stebėti slinkimą.
Kodo pavyzdys: „Infinite Scroll“
Šis pavyzdys demonstruoja begalinį slinkimą naudojant „Intersection Observer“ API.
<!-- HTML -->
<div id="content">
<p>Pradinis turinys</p>
</div>
<div id="sentinel"></div>
<script>
const content = document.getElementById('content');
const sentinel = document.getElementById('sentinel');
let page = 1; // Pradinis puslapio numeris
let loading = false; // Žymė, apsauganti nuo kelių įkėlimų vienu metu
const options = {
root: null, // Naudoti peržiūros sritį kaip šakninį elementą
rootMargin: '0px',
threshold: 0.1 // Įkelti, kai matoma 10% stebėjimo elemento
};
const loadMoreContent = async () => {
if (loading) return;
loading = true;
// Imituoti duomenų gavimą iš API (pakeiskite savo tikruoju API iškvietimu)
setTimeout(() => {
const newContent = Array.from({ length: 10 }, (_, i) => `<p>Turinys iš ${page + 1} puslapio, ${i + 1} elementas</p>`).join('');
content.innerHTML += newContent;
page++;
loading = false;
}, 1000);
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting && !loading) {
loadMoreContent();
}
});
}, options);
observer.observe(sentinel);
</script>
Svarstymai apie „Infinite Scroll“:
- Prieinamumas: Užtikrinkite, kad begalinis slinkimas būtų prieinamas vartotojams su negalia. Pateikite alternatyvias navigacijos parinktis, pvz., mygtuką „Įkelti daugiau“, vartotojams, kurie negali naudoti pelės ar slinkties ratuko. Taip pat įsitikinkite, kad įkėlus naują turinį tinkamai valdomas fokusas, kad ekrano skaitytuvų naudotojai žinotų apie pokyčius.
- Našumas: Optimizuokite naujo turinio įkėlimą, kad išvengtumėte našumo problemų. Naudokite tokias technikas kaip „debouncing“ ar „throttling“, kad apribotumėte API užklausų dažnumą.
- Vartotojo patirtis: Pateikite vaizdinį grįžtamąjį ryšį, rodantį, kad įkeliamas daugiau turinio. Venkite perkrauti vartotojus per dideliu kiekiu turinio vienu metu. Apsvarstykite galimybę apriboti vienos užklausos metu įkeliamų elementų skaičių.
- SEO: Begalinis slinkimas gali neigiamai paveikti SEO, jei jis netinkamai įdiegtas. Užtikrinkite, kad paieškos sistemos galėtų nuskaityti ir indeksuoti visą jūsų turinį. Naudokite tinkamą HTML struktūrą ir apsvarstykite galimybę įdiegti puslapiavimą paieškos sistemų robotams.
- History API: Naudokite „History“ API, kad atnaujintumėte URL vartotojui slenkant, leisdami jam bendrinti ar pažymėti konkrečias puslapio dalis.
Naršyklių suderinamumas ir „Polyfills“
„Intersection Observer“ API yra plačiai palaikomas šiuolaikinėse naršyklėse. Tačiau senesnės naršyklės gali jo nepalaikyti. Siekiant užtikrinti suderinamumą su visomis naršyklėmis, galite naudoti „polyfill“. „Polyfill“ yra kodo dalis, kuri suteikia naujesnės API funkcionalumą senesnėse naršyklėse.
Yra keletas „Intersection Observer“ „polyfill'ų“. Populiarus pasirinkimas yra oficialus W3C „polyfill“. Norėdami naudoti „polyfill“, tiesiog įtraukite jį į savo HTML prieš savo JavaScript kodą, kuris naudoja „Intersection Observer“ API.
<script src="intersection-observer.js"></script>
<script src="your-script.js"></script>
Geroji praktika ir optimizavimo technikos
- Pasirinkite tinkamą slenkstį: Eksperimentuokite su skirtingomis slenksčio reikšmėmis, kad rastumėte optimalų balansą tarp našumo ir vartotojo patirties. Mažesnis slenkstis anksčiau suaktyvins atgalinio skambučio funkciją, o didesnis ją atidės.
- Naudokite „Debounce“ arba „Throttle“ API užklausoms: Apribokite API užklausų dažnumą begaliniam slinkimui, kad neperkrautumėte serverio ir pagerintumėte našumą. „Debouncing“ užtikrina, kad funkcija bus iškviesta tik praėjus tam tikram laikui nuo paskutinio iškvietimo. „Throttling“ užtikrina, kad funkcija bus iškviesta ne dažniau kaip vieną kartą per nurodytą laikotarpį.
- Optimizuokite paveikslėlių įkėlimą: Naudokite optimizuotus paveikslėlių formatus (pvz., WebP) ir suspauskite paveikslėlius, kad sumažintumėte failo dydį. Apsvarstykite galimybę naudoti turinio pristatymo tinklą (CDN), kad paveikslėliai būtų tiekiami iš serverių, esančių arčiau vartotojo vietos.
- Naudokite įkėlimo indikatorių: Pateikite vaizdinį grįžtamąjį ryšį, rodantį, kad resursai yra įkeliami. Tai gali būti paprastas suktukas ar eigos juosta.
- Tinkamai apdorokite klaidas: Įdiekite klaidų apdorojimą, kad tinkamai valdytumėte atvejus, kai resursai neįkeliami. Rodykite vartotojui klaidos pranešimą ir suteikite galimybę bandyti įkelti resursą iš naujo.
- Nutraukite elementų stebėjimą, kai jie nebereikalingi: Naudokite
unobserve()
metodą, kad nustotumėte stebėti elementus, kai jie nebereikalingi. Tai atlaisvina naršyklės resursus ir pagerina našumą. Pavyzdžiui, sėkmingai įkėlus paveikslėlį, turėtumėte nutraukti jo stebėjimą.
Prieinamumo aspektai
Įgyvendinant „lazy loading“ ir „infinite scroll“, labai svarbu atsižvelgti į prieinamumą, siekiant užtikrinti, kad jūsų svetainė būtų naudojama visiems, įskaitant vartotojus su negalia.
- Suteikite alternatyvią navigaciją: Begaliniam slinkimui suteikite alternatyvias navigacijos parinktis, pvz., mygtuką „Įkelti daugiau“ arba puslapiavimą, vartotojams, kurie negali naudoti pelės ar slinkties ratuko.
- Valdykite fokusą: Įkeliant naują turinį su begaliniu slinkimu, užtikrinkite, kad fokusas būtų tinkamai valdomas. Perkelkite fokusą į naujai įkeltą turinį, kad ekrano skaitytuvų naudotojai žinotų apie pokyčius. Tai galima pasiekti nustatant
tabindex
atributą į-1
naujo turinio konteinerio elementui ir tada iškviečiantfocus()
metodą tam elementui. - Naudokite semantinį HTML: Naudokite semantinius HTML elementus, kad suteiktumėte savo turiniui struktūrą ir prasmę. Tai padeda ekrano skaitytuvams suprasti turinį ir suteikti geresnę vartotojo patirtį. Pavyzdžiui, naudokite
<article>
elementus susijusiam turiniui grupuoti. - Pateikite ARIA atributus: Naudokite ARIA (Accessible Rich Internet Applications) atributus, kad suteiktumėte papildomos informacijos pagalbinėms technologijoms. Pavyzdžiui, naudokite
aria-live
atributą, norėdami nurodyti, kad puslapio sritis dinamiškai atnaujinama. - Testuokite su pagalbinėmis technologijomis: Išbandykite savo svetainę su pagalbinėmis technologijomis, pvz., ekrano skaitytuvais, kad įsitikintumėte, jog ji prieinama vartotojams su negalia.
Pavyzdžiai iš realaus pasaulio
Daugelis populiarių svetainių ir programų naudoja „lazy loading“ ir „infinite scroll“, kad pagerintų našumą ir vartotojo patirtį. Štai keletas pavyzdžių:
- Socialinių tinklų platformos (pvz., Facebook, Twitter, Instagram): Šios platformos naudoja begalinį slinkimą, kad įkeltų daugiau turinio vartotojui slenkant savo srautą. Jos taip pat naudoja „lazy loading“, kad įkeltų paveikslėlius ir vaizdo įrašus tik tada, kai jie netrukus pasirodys matomumo lauke.
- Elektroninės prekybos svetainės (pvz., Amazon, Alibaba, eBay): Šios svetainės naudoja „lazy loading“ produktų paveikslėliams įkelti ir begalinį slinkimą, kad įkeltų daugiau produktų sąrašų vartotojui slenkant puslapį. Tai ypač svarbu elektroninės prekybos svetainėms, kuriose yra daug produktų.
- Naujienų svetainės (pvz., The New York Times, BBC News): Šios svetainės naudoja „lazy loading“ paveikslėliams ir vaizdo įrašams įkelti bei begalinį slinkimą, kad įkeltų daugiau straipsnių vartotojui slenkant puslapį.
- Paveikslėlių talpinimo platformos (pvz., Unsplash, Pexels): Šios platformos naudoja „lazy loading“ paveikslėliams įkelti vartotojui slenkant puslapį, žymiai pagerindamos našumą ir sumažindamos duomenų srauto suvartojimą.
Išvada
„Intersection Observer“ API yra galingas įrankis žiniatinklio našumui optimizuoti, įgyvendinant tokias technikas kaip „lazy loading“ ir „infinite scroll“. Naudodami šį API, galite žymiai sumažinti pradinį puslapio įkėlimo laiką, taupyti duomenų srautą, pagerinti bendrą našumą ir sukurti geresnę vartotojo patirtį pasaulinei auditorijai. Įgyvendindami šias technikas, nepamirškite atsižvelgti į prieinamumą, kad jūsų svetainė būtų prieinama visiems. Suprasdami šiame straipsnyje išdėstytas koncepcijas ir gerąją praktiką, galite pasinaudoti „Intersection Observer“ API, kad sukurtumėte greitesnes, jautresnes ir prieinamesnes svetaines.