Editorial Craft Bible
Control de saltos de página
Inicio Paginación HTML/CSS → PDF Control de saltos de página
Paginación HTML/CSS → PDF

Control de saltos de página

11 reglas W3C CSS Fragmentation Module L3 · Paged.js docsW3C CSS Fragmentation L3 · MDN break-afterW3C CSS Fragmentation L3 · MDN break-insideW3C CSS Fragmentation L3 · MDN break-before
15

Control de saltos de página

11 reglas
155

Fluir, no forzar

Deja que el contenido fluya de forma natural por las hojas y controla SOLO las costuras con reglas de quiebre. El paginador (Chrome, Paged.js, WeasyPrint) ya corta donde la página se llena, tú solo proteges las unidades que no deben partirse. Forzar posiciones exactas de página pelea contra el motor y genera huecos.

/* proteger, no posicionar */
.card, figure, li { break-inside: avoid; }
h2, h3 { break-after: avoid; }
Correcto
El texto llena cada hoja de borde a borde; los cortes caen solos entre bloques.
Evitar
Forzar una página por bloque deja hojas a medio llenar y papel desperdiciado.
W3C CSS Fragmentation Module L3 · Paged.js docs
156

No envuelvas cada sección en un div de página fija

Un error común de HTML→PDF es meter cada sección en un <div class="page"> con height: 100vh o break-after: page. Cuando la sección es corta, la caja fija igual se come una hoja entera y deja un enorme hueco blanco debajo. Escribe secciones que fluyen y agrega saltos solo donde de verdad arranca un capítulo.

/* MAL: fuerza una hoja por bloque */
.page { height: 100vh; break-after: page; }

/* BIEN: dejar fluir */
section { /* sin salto forzado */ }
Correcto
Tres secciones cortas comparten una hoja, apiladas de forma natural.
Evitar
Cada bloque corto reclama una hoja; el 80% de cada página queda en blanco.
W3C CSS Fragmentation L3 · MDN break-after
157

break-inside: avoid en unidades chicas

Aplica break-inside: avoid a bloques atómicos que se leen como una sola cosa: tarjetas, figuras, callouts, ítems de lista, bloques de código. Sin él el paginador puede rebanar una tarjeta y dejar su título al pie de una página y su cuerpo al inicio de la siguiente. Manten la regla en unidades CHICAS, nunca en un artículo largo, o empujas una hoja entera.

.card,
figure,
.callout,
li { break-inside: avoid; }
Correcto
La tarjeta pasa entera a la hoja siguiente en vez de partirse.
Evitar
La tarjeta se parte en la costura: título varado, cuerpo huérfano.
W3C CSS Fragmentation L3 · MDN break-inside
158

break-after: avoid para que el título no quede huérfano

Pon break-after: avoid en h2, h3 y pies de figura para que un título nunca quede solo al pie de una página mientras su párrafo arranca en la siguiente. El motor empuja el título hacia adelante para que viaje con al menos las primeras líneas que le siguen. Es el primo paginado del control de huérfanas.

h2, h3, h4,
figcaption { break-after: avoid; }
Correcto
El título viaja a la hoja siguiente y abre su párrafo.
Evitar
Título varado solo al pie; su texto arranca en la vuelta.
W3C CSS Fragmentation L3 · MDN break-after
159

break-before: page solo donde de verdad va el corte

Reserva los saltos forzados para cortes estructurales reales: un capítulo nuevo, la página tras la portada, un apéndice. Usa break-before: page (o break-after: page) en esos elementos específicos, no salpicados por todos lados. Abusar de saltos forzados es justo lo que crea el problema de huecos blancos; un salto intencional por capítulo basta.

h1.chapter { break-before: page; }
.cover { break-after: page; }
Correcto
La portada tiene su hoja; el capítulo abre limpio en la siguiente.
Evitar
Un salto forzado en cada subtítulo fragmenta el documento en cabos sueltos.
W3C CSS Fragmentation L3 · MDN break-before
160

Manten la figura junto a su pie

Envuelve la imagen y su figcaption en un solo <figure> y pon break-inside: avoid en la figura, no solo en la imagen. De lo contrario la foto puede caer al pie de una página y su pie en la siguiente, rompiendo la asociación entre ambos. La unidad figura completa se mueve junta.

figure { break-inside: avoid; }
/* envuelve <img> + <figcaption> como uno */
Correcto
Imagen y pie permanecen encajados como una figura en la misma hoja.
Evitar
La foto cierra una página, su pie abre la siguiente: se pierde la relación.
W3C CSS Fragmentation L3 · thebookdesigner
161

Repite el encabezado de tabla y no partas filas

En tablas que cruzan páginas, promueve el encabezado con thead { display: table-header-group } para que se reimprima en cada hoja, y pon tr { break-inside: avoid } para que ninguna fila se rebane. Una fila partida entre páginas, o una tabla cuyo encabezado sale una sola vez, obliga a hojear atrás para descifrar columnas.

thead { display: table-header-group; }
tr { break-inside: avoid; }
Correcto
El encabezado (barra tinta) se reimprime arriba en ambas hojas; filas intactas.
Evitar
Sin encabezado repetido y una fila rebanada a media altura: columnas ilegibles.
W3C CSS Tables · MDN table-header-group
162

Usa orphans y widows para el control fino de líneas

Pon orphans: 2; widows: 2 (o 3) en el cuerpo de texto para que el paginador nunca deje una sola línea de un párrafo al pie de una página ni sola al inicio de la siguiente. orphans es el mínimo de líneas que quedan al PIE antes del corte; widows el mínimo que se lleva al INICIO después. Aplican por párrafo, no por bloque.

p { orphans: 2; widows: 2; }
/* 3/3 para tipografía más estricta */
Correcto
Al menos dos líneas quedan juntas a cada lado de la costura.
Evitar
Una línea huérfana sola al pie y una viuda sola al inicio.
W3C CSS Fragmentation L3 · MDN orphans / widows
163

Prefiere break-* moderno sobre page-break-* legado

Las propiedades modernas break-before, break-after y break-inside reemplazan a los viejos alias page-break-*, cubren columnas y regiones también, y aceptan valores como avoid-page. Escribe las modernas; conserva el alias legado solo como respaldo para motores muy viejos como wkhtmltopdf. No mezcles valores en conflicto en el mismo elemento.

/* alias legado (respaldo) */
h2 { page-break-after: avoid; }
/* moderno (autoritativo) */
h2 { break-after: avoid; }
Correcto
/* legacy first */
page-break-inside: avoid;
break-inside: avoid;
modern wins ✓
break-* moderno declarado al final; el alias solo respalda motores viejos.
Evitar
break-inside: avoid;
page-break-inside: auto;
conflict, unpredictable ✗
Mezclar valores viejos y nuevos en conflicto da resultados según el motor.
W3C CSS Fragmentation L3 · MDN break-inside
164

Evita alturas fijas que fuercen cortes

Una height fija o 100vh en contenedores de contenido codifica a mano dónde termina la página y, cuando el texto crece, o lo recorta o fuerza un corte feo. Deja que el contenido determine su propio alto con min-height como mucho, y que las reglas de quiebre decidan las costuras. El alto pertenece a la hoja (vía @page size), no a tus bloques de texto.

/* MAL */ .box { height: 100vh; }
/* BIEN */ .box { min-height: auto; }
Correcto
El contenido fija su propio alto; el texto llena la hoja sin recortarse.
Evitar
La altura fija recorta la última línea en el límite codificado a mano.
W3C CSS Fragmentation L3 · MDN overflow
165

Prueba el PDF real paginado, no la pantalla

Las reglas de quiebre no hacen nada en una vista de scroll continuo; solo surten efecto cuando el contenido se pagina de verdad. Exporta siempre el PDF real (o usa la vista previa de impresión / la vista paginada de Paged.js) y léelo página por página para confirmar que ninguna tarjeta, fila o título quedó cortado. Un layout que se ve perfecto en pantalla puede partirse mal al fragmentarse.

$ # Chrome headless: exporta el PDF real
chrome --headless --print-to-pdf=out.pdf \
  --no-pdf-header-footer doc.html
Correcto
Lee las páginas exportadas una a una; cada costura confirmada limpia.
Evitar
scroll∞
Juzgar por el scroll continuo esconde todos los problemas de salto.
Chromium print-to-pdf docs · Paged.js