2016-01-15 7 views
8

Ho un documento HTML di grandi dimensioni con intestazioni (h1, h2, h3 ...) e paragrafi. Quando stampo il documento, voglio che, automaticamente, le intestazioni a fondo documento vai alla pagina successiva:CSS orfani: come evitare le intestazioni (h1, h2 ...) nella pagina inferiore?

enter image description here

Come posso fare? Io uso "orfani: 3" CSS con paragrafi e funziona con i tag "p", ma con h1 o h2 non funzionano.

@page { 
    size: A4; 
} 

p { 
    orphans:3; 
} 

h1, h2 { 
    orphans:3 
} 

Full example on action dove:

  • 1-2 pagina: paragrafi opere orfane bene.
  • 2-3 pagina: le intestazioni non funzionano.

Requisiti:

  • HTML hanno un div contenitore principale.
  • Non modificare l'HTML.
  • Il supporto del browser non è importante (sul mio lavoro specifico).
  • Ho bisogno di qualche trucco nei CSS (non JS o Jquery, preferibilmente)
  • Non riesco a usare page-break-before: sempre perché voglio che le intestazioni vadano solo alla pagina successiva quando appare in fondo alla pagina.
+0

Troppa teoria .. possiamo ottenere del codice in azione? –

+0

Le domande che richiedono l'aiuto del codice devono includere il codice più breve necessario per riprodurlo ** nella domanda stessa **. Vedi [** Come creare un esempio minimo, completo e verificabile **] (http://stackoverflow.com/help/mcve) –

+0

È necessario tenere presente che gli stili specifici della stampa come 'orfani',' break -after' ecc. hanno notoriamente un cattivo supporto da parte dei browser, quindi ci saranno sempre casi in cui queste cose non funzionano. Generalmente la stampa e gli stili basati su pagine sono ancora un punto debole per HTML/CSS, quindi se hai bisogno di stampe di buona qualità, dovresti seriamente considerare alternative come PDF. – RoToRa

risposta

8

In tipografia orfano è:

Una linea paragrafo di apertura che appare da solo nella parte inferiore di una pagina o colonna, quindi separata dal resto del testo.

Tuttavia in HTML <h1> e <p> sono diversi paragrafi allora quello che hai da utilizzare è break-after proprietà di raccontare motore di layout per non mettere un'interruzione di pagina dopo che il punto (con l'effetto collaterale di spostare paragrafo successivo up alla pagina precedente - se opportuno - o per spostarsi alla pagina successiva intestazione

h1, h2 { 
    break-after: avoid-page; 
} 

Nota sulla compatibilità: break-after impostazione è un progetto vera di lavoro e anche le caratteristiche di base non sono ampiamente supportato (n. tably Internet Explorer 10 fa). Per risolvere questo si può utilizzare un altro immobile con significato simile:

h1, h2 { 
    page-break-after: avoid; 
} 

Nota che page-break-after vale per sia la pagina e le colonne.page-break-after non è ben supportato da FF (it is a bug) allora se la compatibilità è importante e paragrafo non si estenderà su più pagine È possibile risolvere il confezionamento <h1> e <p> all'interno di un contenitore (diciamo <section>) e quindi applicare page-break-inside come questo:

section { 
    page-break-inside: avoid; 
} 

IMO è necessario combinare page-break-after e page-break-inside utilizzando page-break-inside con il prefisso -moz finché non verrà risolto il problema.

+0

La tua risposta è perfetta, comprendo e conosco questi punti, ma la teoria non funziona (o faccio qualcosa di sbagliato). Potrebbe dare un po 'di codice (o modificare l'esempio di codice per "Seleziona tutto il testo"/Stampa) e mostrare come funziona? Nel mio esempio, non ottengo l'intestazione "Blah blah" vai alla pagina successiva. – Manz

+0

Non provare CodePen, utilizzando un file autonomo funziona. Naturalmente la compatibilità del browser è aleatoria (nella migliore delle ipotesi, la tipografia non è supportata così bene). La maggior parte della strada _compatible_ è stata descritta per ultima, cambia leggermente il rendering dell'output (perché proverà a mantenere tutte le sezioni insieme, possibilmente anche senza rompere i paragrafi e aggiungendo, quando richiesto, un'interruzione di pagina prima del primo titolo). Con questa differenza è solo uno che ho visto renderizzato correttamente in ogni browser che ho provato. –

Problemi correlati