Saltar al contenido principal

Core · Navegación

Paginación

Enlaza a las páginas de una lista que se extiende a lo largo de varias páginas y marca la página actual.

Esta traducción la ha escrito una IA y todavía no la ha revisado ninguna persona. Leer esta página en inglés

Ejemplo

Los enlaces de una lista de 40 páginas, con la actual marcada.

Problemas conocidos

No se conocen problemas.

Código

Copiar el marcado

HTML
<nav aria-label="Pagination">
  <ul class="luz-pagination">
    <li><a class="luz-pagination__link" href="/blog/?page=1" rel="prev">Previous</a></li>
    <li><a class="luz-pagination__link" href="/blog/?page=1" aria-label="Page 1">1</a></li>
    <li><a class="luz-pagination__link" href="/blog/?page=2" aria-label="Page 2" aria-current="page">2</a></li>
    <li><a class="luz-pagination__link" href="/blog/?page=3" aria-label="Page 3">3</a></li>
    <li><a class="luz-pagination__link" href="/blog/?page=3" rel="next">Next</a></li>
  </ul>
</nav>

Variantes y opciones

No hay modificadores. En pantallas estrechas, la lista ocupa más líneas.

Clase o atributoQué hace
.luz-pagination
La lista: una fila de elementos que salta de línea en pantallas estrechas
.luz-pagination__link
Una página, Anterior o Siguiente: un área interactiva de al menos 44 px
aria-current="page"
Marca la página actual con un relleno sólido y un peso de fuente mayor
aria-disabled="true"
Anterior o Siguiente en los extremos, como <span> y no como enlace: color de texto desactivado
.luz-pagination__gap
La «…» de una lista larga: una marca oculta a los lectores de pantalla

Cómo funciona

Un punto de referencia <nav> alrededor de una lista de enlaces, con estilos de components/pagination.css. Cada página tiene una dirección propia, así que el servidor la genera y funcionan el botón Atrás, los marcadores y los motores de búsqueda.

Sin JavaScript.

  • Los números son enlaces, no botones: al seguir uno, se carga otra página.
  • rel="prev" y rel="next" indican qué enlaces llevan a las páginas anterior y siguiente.
  • La página actual es un enlace con aria-current="page", así que se sigue anunciando como enlace y conserva su posición en el orden.
  • En la primera o la última página, Anterior o Siguiente es un <span> con aria-disabled="true": solo texto, sin parada de foco.
  • Conserva el <nav>. Algunos navegadores eliminan la semántica de lista de un <ul> sin viñetas, y el punto de referencia hace que siga anunciándose como lista; si no hay <nav>, añade role="list" al <ul>.

Sin JavaScript

No cambia nada: es una lista de enlaces con CSS. Sin CSS, se lee como una lista de enlaces.

Teclado y ARIA

Pulsa Tab para llegar a cada enlace en orden y Enter para abrirlo.

  • Asigna al elemento <nav> el nombre «Paginación» con aria-label, para distinguirlo de la navegación principal.
  • Asigna a un número el nombre «Página 3» con aria-label. El número visible sigue formando parte del nombre. aria-current="page" indica al lector de pantalla cuál es la página actual, así que no hace falta incluirlo en el nombre.
  • Marca el espacio con aria-hidden="true": el lector de pantalla oye las páginas, no los puntos.

El contraste y el foco están en la pestaña Diseño.

Diseño

Cuándo usarlo

Usa la paginación cuando una lista sea demasiado larga para una sola página y se pueda acceder a cada página con su propia dirección: resultados de búsqueda, archivo de un blog o tabla de registros.

Cuándo no usarlo

No uses la paginación para una lista corta ni para los pasos de una tarea.

  • Para las páginas superiores a la actual, usa migas de pan.
  • Para las secciones de una página, usa pestañas.
  • Si tienes un flujo que se carga al desplazarse, ofrece también un enlace a la página siguiente: es la única versión a la que pueden llegar quienes usan teclado o lector de pantalla.

Qué hacer y qué no

Hazlo Muestra la primera y la última página, la actual y las contiguas, con un espacio entre ellas.
No lo hagas Imprimas todos los números de una lista larga: desborda el ancho y obliga a contar.

Cómo escribir el contenido

Usa la palabra que diría quien lee.

  • «Anterior» y «Siguiente», no solo flechas ni «Atrás».
  • Escribe los números de página con cifras; para tecnologías de asistencia, asígnales el nombre «Página 3».
  • Indica el número total de páginas cerca de la lista («Página 8 de 40») cuando sea importante.

Contraste y foco

Las páginas usan el color de texto secundario; la página actual aparece en blanco sobre un relleno sólido del color de marca.

ParteColor sobre el fondoClaroOscuroAlto contrasteRequisitos
Enlace
--luz-text-secondary on --luz-surface-page
6.2:1
7.5:1
19.3:1
4.5:1
Enlace al pasar el puntero
--luz-text-primary on --luz-surface-hover
14.4:1
12.6:1
20.1:1
4.5:1
Página actual
--luz-text-on-fill on --luz-brand-fill
6.0:1
4.9:1
14.1:1
4.5:1
Relleno de la página actual
--luz-brand-fill on --luz-surface-page
5.6:1
3.5:1
14.1:1
3:1
Anterior o Siguiente en el extremo
--luz-text-disabled on --luz-surface-page
3.5:1
4.2:1
5.3:1
3:1
Espacio
--luz-text-muted on --luz-surface-page
4.9:1
5.6:1
9.0:1
4.5:1
Anillo de foco
--luz-focus-ring on --luz-surface-page
5.6:1
7.7:1
21.0:1
3:1

Medido a partir de los valores de los tokens de cada modo, redondeado hacia abajo. Los requisitos son los mínimos de WCAG 2.2 AA: 4,5:1 para el texto y 3:1 para los anillos de foco, los bordes, los iconos y el estado desactivado.

  • Foco: cada enlace tiene el anillo compartido: un contorno de 2 px --luz-focus-ring, a 2 px del elemento.
  • No solo color: la página actual tiene un relleno sólido, un peso mayor (600) y aria-current.
  • Colores forzados: la página actual usa los colores de selección del sistema (Highlight y HighlightText) y un anillo de foco en CanvasText; los extremos que no son enlaces usan GrayText.

Tokens que usa

Los 15 tokens que lee components/pagination.css, agrupados por familia. Cada familia enlaza a su página, con los valores de cada modo. En Figma son variables con los mismos nombres: consulta Tokens en Figma.

Spacing and sizing
--luz-control-lg, --luz-space-sm, --luz-space-xs
Typography
--luz-font-sans, --luz-text-md
Radius
--luz-radius-md
Motion
--luz-duration-fast

El teclado y ARIA están en la pestaña Código.