2010-08-12 20 views
15

Ho una pagina con molti dati, tabelle e contenuti. Voglio fare una versione di stampa che mostrerà solo pochissime cose selezionate.Come mostrare solo alcune parti con i CSS per la stampa?

Invece di scrivere un'altra pagina solo per la stampa, stavo leggendo la funzione CSS per "@media print".

Innanzitutto, quali browser lo supportano? Poiché questa è una funzionalità interna, è OK se solo gli ultimi browser lo supportano.

Stavo pensando di etichettare alcuni elementi DOM con una classe "stampabile", e in pratica di applicare "display: none" a tutto tranne quegli elementi con la classe "stampabile". È fattibile?

Come ottengo questo?

EDIT: Questo è quello che ho finora:

<style type="text/css"> 
@media print { 
    * {display:none;} 
    .printable, .printable > * {display:block;} 
} 
</style> 

ma nasconde tutto. Come faccio a rendere visibili quegli elementi "stampabili"?

EDIT: Cercando ora l'approccio negativo

<style type="text/css"> 
@media print { 
    body *:not(.printable *) {display:none;} 
} 
</style> 

Questo sembra buono in teoria, ma non funziona. Forse "non" non supporta il css avanzato ...

+0

Penso che si dovrebbe avvicinarsi dall'altra parte. NASCONDI il contenuto che non deve essere stampato, al contrario di nascondere tutto e mostrare solo i bit che vuoi stampare. Perché non è davvero possibile ottenere in CSS in modo pulito. – Strelok

+0

È possibile farlo nel modo consigliato da @Strelok: è possibile contrassegnare tutti gli elementi che non devono essere inclusi nella stampa come non-stampa, evitando di contrassegnare un contenitore degli elementi che si desidera effettivamente. .no-print {display: none:} Ma è davvero stupido. Il modo in cui vuoi farlo è più pulito e intelligente. Ma triste, questo sembra essere l'unico modo. Spero che non lo sia. Che cosa si vuole fare è un caso d'uso buono per un genitore selettore CSS: https://css-tricks.com/parent-selectors-in-css/ Si potrebbe dire: * {display: none; } .printable, .printable <* {display: block} Triste che il selettore non esiste. – jgomo3

risposta

8

Inizio here. Ma in fondo quello che stai pensando è l'approccio corretto.

Grazie, Ora la mia domanda è in realtà divenire: Come faccio ad applicare i CSS per una classe e tutti i suoi DISCENDENTE ELEMENTI? In modo che io possa applicare "display: block" a qualsiasi cosa si trovi nelle zone "stampabili" .

Se un elemento è impostato su display:none;, anche tutti i relativi figli saranno nascosti. Ma in ogni caso. Se si desidera uno stile da applicare a tutti i bambini di qualcos'altro, effettuare le seguenti operazioni:

.printable * { 
    display: block; 
} 

che si applicherebbe lo stile a tutti i bambini della zona "stampabile".

+0

Questo è in realtà l'articolo che stavo leggendo –

+2

Grazie, è quasi perfetto! Ora l'unico problema è che non tutti gli elementi dovrebbero essere "bloccati". Come sto testando, mi rendo conto che i div sono "bloccati", le cose normali sono "in linea", i tavoli sono "tavolo", i t-shirt sono "gruppo-fila-tabella", tr sono "riga-tabella", ecc ... I potresti aggiungere regole per ogni singolo, ma c'è un modo per dire "applica i normali stili del browser"? –

2

Quasi tutti i browser lo supportano. Potrebbe essere vantaggioso utilizzare l'attributo media sul tag link.

Utilizzare display: none; in alcune delle vostre regole sarebbe un modo appropriato per gestire la situazione.

+0

Grazie, ora la mia domanda sta diventando: come posso applicare i CSS a una classe E TUTTI I SUOI ​​ELEMENTI DISCENDENTI? In modo che io possa applicare "display: block" a qualunque cosa si trovi nelle zone "stampabili". –

1

Un modo semplice:

<style> 
    .print-only{ 
     display: none; 
    } 

    @media print { 
     .no-print { 
      display: none; 
     } 

     .print-only{ 
      display: block; 
     } 
} 
</style> 
+1

Questo è corretto, ma potrebbe causare interruzioni inutili nella formattazione se l'elemento .print-only è inline naturalmente (ad esempio) invece del blocco. –

+1

Perché hai due '@@'? –

+0

Immagino che '@@' sia un refuso. –

1

sono arrivato qui perché ero curioso di stampa di un grafico generato da chart.js. Volevo solo stampare il grafico direttamente dalla pagina (con un pulsante che fa un 'window.print') senza tutti gli altri contenuti della pagina.

Quindi, mi sono avvicinato utilizzando la tecnica dalla risposta qui: Why can't I override display property applied via an asterisk?.

Devi applicare l'asterisco all'elemento "corpo", non solo da solo. Quindi, utilizzando l'esempio CSS che il PO (Nathan) ha aggiunto alla domanda, ho cambiato in questo:

<style type="text/css"> 
@media print { 
    body * {display:none;} 
    .printable, .printable > * { 
    display: block !important; 
    } 
} 

aggiungendo poi che la classe 'stampabili' al grafico stesso, come in

<canvas id="myChart" class="printable" width="400" height="400"></canvas> 

che ha eliminato tutti gli elementi della pagina sul risultato di stampa, tranne il grafico quando il pulsante 'stampa' viene cliccato (tramite questo):

<script> 
    myChart.render(); 
    document.getElementById("printChart").addEventListener("click",function(){ 
     window.print(); 
    });  
</script> 

Così, forse questo aiuterà tutti coloro che ottiene a questa domanda attraverso i googles.

1

suggerisco di nascondere elemento che non stampare

Html

<h1 class="no-print" >Welcome Just Screen</h1> 
<div> I want print this section :)</div> 
<div class="no-print">It's display only on screen</div> 

Css

@media print {  
.no-print { 
    display: none; 
} 
Problemi correlati