Saltar la navegación

8.4.3. Scroll Infinito

Ejemplo: Scroll Infinito

Un ejemplo del uso de AJAX en una página web puede ser el conocido como Scroll infinito (y lo que ello conlleva) que permite visualizar de forma interminable una serie de elementos: imágenes, vídeos, mensajes, ...

Para ello necesitamos JavaScript y el control de la posición donde se encuentre el usuario para "actualizar" los contenidos con más información.

Observa el siguiente ejemplo:

La carga inicial

Construyamos primero la estructura donde se localizará y mostrará la información. En este caso, al ser una información dinámica, no queremos que muestre información inicialmente. Deberá hacerlo sólo cuando cargue la página por primera vez (DOMContentLoaded):

HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Scroll Infinito</title>
    <style>
        #numbers-container {
            padding:5px;        /* Espacio alrededor del contenido */
            text-align: center; /* Contenido centrado */
            margin:auto;    /* Centrado respecto a la ventana */
            width:fit-content;  /* Ancho de contenido ajustado */
            line-height: 25px; /* Espacio entre cada div */
            height: 100vh; /* Tamaño de la ventana de visualización: 100vh = 100% pantalla vertical */
            overflow-y: scroll; /* Activar el desplazamiento vertical */
        }
    </style>
</head>
<body>
<!-- DIV que mostrará información del Scroll -->
<div id="info" style="display: flex;position: sticky;top:0;right:0;">GATOS: <span id="posicion"></span></div>
<!-- DIV que contendrá los números -->
<div id="numbers-container"></div>
<script src="script.js"></script>
</body>
</html>
JavaScript
document.addEventListener('DOMContentLoaded', function () {
    // Inicialmente cargamos los primeros 10 números
    cargaBloques(1, 10);
});

function cargaBloques(inicio, fin) {
    // Creo el contenedor de la página
    let contenedor = document.getElementById('contenedor');
    for (let i = inicio; i <= fin; i++) {
        let div = document.createElement('div');    // Creo DIV
        div.id = i;                   // indico id
        div.textContent = i;          // Muestro el número de imagen
        contenedor.appendChild(div);   // Adjunto el DIV al contenedor de la página
        div.appendChild(document.createElement('br'));  // Adjunto un salto de línea
        let img = document.createElement('img'); // Creo una imagen
        img.src = "https://loremflickr.com/320/240?random=" + i;    // Extraigo una imagen aleatoria
        div.appendChild(img);   // Adjunto la imagen al div
    }
}

El desplazamiento

Para comprobar que se ha desplazado la pantalla, usaremos el "listener" del Scroll.

    // Cuando el usuario se desplace, cargamos más números si es necesario
    document.getElementById('contenedor').addEventListener('scroll', function () {
        document.getElementById("posicion").innerText = (this.scrollTop + this.clientHeight) + ">=" + this.scrollHeight;
        if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
            // El usuario ha llegado al final de la página, cargamos más números
            let ultimo = parseInt(this.children[this.children.length - 1].id) + 1;
            cargaBloques(ultimo, ultimo + 9); // Cargamos 10 números más
        }
    });

Creado con eXeLearning (Ventana nueva)