Nekonečné rolování, na rozdíl od klasického stránkování s klikáním, umožňuje kontinuální načítání obsahu, jak uživatel prohlíží webovou stránku. Tato technika nabízí hladší uživatelský zážitek, především na mobilních zařízeních.
Pojďme se podívat, jak implementovat nekonečné rolování za použití HTML, CSS a JavaScriptu.
Konfigurace frontendu
Začněte s HTML strukturou, která poslouží jako základ pro zobrazení vašeho obsahu. Níže je uveden příklad:
<body>
<h2>Stránka s nekonečným rolováním</h2>
<div class="products__list">
<img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg" />
<img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg" />
<img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg" />
<img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg" />
<img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg" />
<img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg" />
</div>
<noscript>
Tato stránka vyžaduje JavaScript pro správné fungování.
</noscript>
</body>
Tato základní stránka obsahuje sadu zástupných obrázků a odkazuje na externí CSS a JavaScript soubory.
CSS stylování pro rolovatelný obsah
Pro zobrazení zástupných obrázků v mřížce, přidejte následující CSS pravidla do vašeho souboru `style.css`:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html { font-size: 62.5%; }
body {
font-family: Cambria, Times, "Times New Roman", serif;
}
h2 {
text-align: center;
font-size: 5rem;
padding: 2rem;
}
img {
width: 100%;
display: block;
}
.products__list {
display: flex;
flex-wrap: wrap;
gap: 2rem;
justify-content: center;
}
.products__list > * {
width: calc(33% - 2rem);
}
.loading-indicator {
display: none;
position: absolute;
bottom: 30px;
left: 50%;
background: #333;
padding: 1rem 2rem;
color: #fff;
border-radius: 10px;
transform: translateX(-50%);
}
V tomto okamžiku by měla vaše stránka vypadat podobně jako na obrázku (viz originální článek).
Implementace jádra s JS
Nyní upravíme skript `script.js`. Pro implementaci nekonečného rolování musíme detekovat, kdy se uživatel posune téměř na konec obsahu stránky.
"use strict";
window.addEventListener("scroll", () => {
if (
window.scrollY + window.innerHeight >=
document.documentElement.scrollHeight - 100
) {
fetchMoreContent();
}
});
Následně vytvoříme asynchronní funkci `fetchMoreContent()` pro načtení dalších dat.
async function fetchMoreContent() {
try {
let response = await fetch("https://fakestoreapi.com/products?limit=3");
if (!response.ok) {
throw new Error("Chyba při načítání dat");
}
let data = await response.json();
console.log(data);
} catch (error) {
console.error("Chyba při načítání nového obsahu:", error);
} finally {
console.log("Funkce fetch byla spuštěna");
}
}
Pro testování můžeme využít API od fakestoreapi.
Pro ověření, že se data načítají při rolování, sledujte konzoli prohlížeče:

Zjistíte, že data se načítají opakovaně, což může negativně ovlivnit výkon. Pro prevenci tohoto problému zavedeme proměnnou `isFetching`, která bude monitorovat stav načítání:
let isFetching = false;
Nyní upravíme funkci `fetchMoreContent()`, aby se načítala data až po dokončení předchozího načítání.
async function fetchMoreContent() {
if (isFetching) return;
isFetching = true;
try {
let response = await fetch("https://fakestoreapi.com/products?limit=3");
if (!response.ok) {
throw new Error("Chyba při síťové komunikaci");
}
let data = await response.json();
} catch (error) {
console.error("Chyba při získávání obsahu:", error);
} finally {
console.log("Funkce načítání dokončena");
isFetching = false;
}
}
Zobrazení nového obsahu
Aby se nový obsah zobrazoval, když uživatel rolujete, vytvořte funkci, která přidá nové obrázky do kontejneru.
Nejprve vyberte rodičovský prvek:
const productsList = document.querySelector(".products__list");
Poté definujte funkci pro vkládání nového obsahu:
function displayNewContent(data) {
data.forEach((item) => {
const imgElement = document.createElement("img");
imgElement.src = item.image;
imgElement.alt = item.title;
productsList.appendChild(imgElement);
});
}
Nakonec upravte funkci `fetchMoreContent()` tak, aby předávala získaná data funkci `displayNewContent()`.
async function fetchMoreContent() {
if (isFetching) return;
isFetching = true;
try {
let response = await fetch("https://fakestoreapi.com/products?limit=3");
if (!response.ok) {
throw new Error("Chyba při síťovém požadavku");
}
let data = await response.json();
displayNewContent(data);
} catch (error) {
console.error("Problém při stahování nového obsahu:", error);
} finally {
console.log("Data načtena");
isFetching = false;
}
}
Nyní by mělo nekonečné rolování správně fungovat.

Pro zlepšení uživatelského zážitku můžeme zobrazit indikátor načítání. Začněme přidáním HTML pro indikátor:
<h2 class="loading-indicator">Načítání...</h2>
Následně vybereme tento element:
const loadingIndicator = document.querySelector(".loading-indicator");
Vytvořte funkce pro zobrazení a skrytí indikátoru:
function showLoadingIndicator() {
loadingIndicator.style.display = "block";
console.log("Načítání...");
}
function hideLoadingIndicator() {
loadingIndicator.style.display = "none";
console.log("Načítání dokončeno.");
}
A integrujeme je do funkce `fetchMoreContent()`:
async function fetchMoreContent() {
if (isFetching) return;
isFetching = true;
showLoadingIndicator();
try {
let response = await fetch("https://fakestoreapi.com/products?limit=3");
if (!response.ok) {
throw new Error("Chyba při síťovém požadavku");
}
let data = await response.json();
displayNewContent(data);
} catch (error) {
console.error("Chyba při načítání:", error);
} finally {
console.log("Stahování dokončeno");
hideLoadingIndicator();
isFetching = false;
}
}
Což vede k funkčnímu indikátoru načítání.
Zde jsou doporučení a osvědčené postupy:
- Nenačítejte příliš mnoho položek najednou. Může to přetížit prohlížeč a negativně ovlivnit jeho výkon.
- Místo načítání obsahu ihned po události rolování použijte funkci „debounce“ pro zpoždění načítání. To zabrání nadměrnému množství síťových požadavků.
- Nekonečné rolování nemusí preferovat každý uživatel. Proto nabídněte volbu stránkování pro případ potřeby.
- Informujte uživatele, pokud již není k dispozici další obsah, aby se zabránilo nekonečným pokusům o načtení.
Profesionální načítání obsahu
Nekonečné rolování je skvělý způsob, jak umožnit uživatelům plynule procházet váš obsah, především na mobilních zařízeních. S pomocí rad a tipů z tohoto článku jej můžete snadno implementovat na vaše webové stránky.
Nezapomeňte, že je důležité, aby uživatelé věděli, co se na stránce děje, proto zobrazujte indikátory průběhu a chybová hlášení.