Come posso forzare i browser a stampare immagini di sfondo in CSS?


102

Questa domanda è stata posta in precedenza, ma la soluzione non è applicabile nel mio caso. Voglio assicurarmi che alcune immagini di sfondo vengano stampate perché sono parte integrante della pagina. (Non sono immagini direttamente nella pagina perché ce ne sono molte utilizzate come sprite CSS.)

Un'altra soluzione alla stessa domanda suggerisce di utilizzare list-style-image, che funziona solo se hai un'immagine diversa per ogni icona, non sono possibili sprite CSS.

Oltre a creare una pagina separata con le icone in linea, esiste un'altra soluzione?

Risposte:


51

Hai pochissimo controllo sui metodi di stampa di un browser. Al massimo puoi SUGGERIRE, ma se le impostazioni di stampa del browser hanno "non stampare immagini di sfondo", non c'è niente che puoi fare senza riscrivere la tua pagina per trasformare le immagini di sfondo in immagini fluttuanti "in primo piano" che si trovano dietro altri contenuti.


210

Con Chrome e Safari puoi aggiungere lo stile CSS -webkit-print-color-adjust: exact;all'elemento per forzare la stampa del colore di sfondo e / o dell'immagine


4
Questo e spettacolare. Rende la vita molto più facile per gli utenti / webkit di phantomjs
Jason

1
@MuneemHabib Non funziona in IE, in realtà l'unico browser supportato è Chrome: developer.mozilla.org/en-US/docs/Web/CSS/…
Marco Bettiolo

che ha fatto il trucco per chrome ... fortunatamente in questo caso avevo solo bisogno di supportare wekkit ...
Davy

2
@DisgruntledGoat dovrebbe aggiornare questa per essere la risposta corretta in quanto ha risolto rapidamente il mio problema (il mio progetto al lavoro si concentra solo su Chrome). Ovviamente non funziona per tutti i browser, ma dovrebbe essere noto, in anticipo, a prescindere.
Brett84c

1
@ Brett84c: non sono d'accordo poiché è una soluzione per un solo browser.
Kukeltje,

84

I browser, per impostazione predefinita, hanno la loro opzione per stampare i colori di sfondo e le immagini disattivate. Puoi aggiungere alcune righe in CSS per aggirare questo problema. Basta aggiungere:

* {
    -webkit-print-color-adjust: exact !important;   /* Chrome, Safari */
    color-adjust: exact !important;                 /*Firefox*/
}

ya funziona bene ma mozilla contrassegna come non standard Questa funzione non è standard e non è su una traccia standard. Non utilizzarlo su siti di produzione affacciati al Web: non funzionerà per tutti gli utenti. Potrebbero anche esserci grandi incompatibilità tra le implementazioni e il comportamento potrebbe cambiare in futuro.
Qh0stM4N

3
Perché è !importantnecessario?

Ha funzionato per me! Grazie.
Nick Woodhams

color-adjustpurtroppo non è supportato correttamente da FireFox. Sembra applicarsi solo allo sfondo, non alla colorproprietà css. Viene segnalato come un bug , senza molta attività o voti. Mantenere lo sfondo è abbastanza inutile se il colore del carattere non viene conservato, rendendolo illeggibile.
Frédéric

È una buona soluzione. Tieni presente che non funziona con IE11 (lo so!).
Rafael S. Fijalkowski

76

Ho trovato un modo per stampare l'immagine di sfondo con CSS. Dipende un po 'da come è strutturato il tuo background, ma sembra funzionare per la mia applicazione.

In sostanza, aggiungi il @media printalla fine del tuo foglio di stile e modifichi leggermente lo sfondo del corpo.

Esempio, se il tuo attuale CSS ha questo aspetto:

body {
background:url(images/mybg.png) no-repeat;
}

Alla fine del foglio di stile, aggiungi:

@media print {
body {
   content:url(images/mybg.png);
  }
}

Ciò aggiunge l'immagine al corpo come un'immagine "in primo piano", rendendola quindi stampabile. Potrebbe essere necessario aggiungere alcuni CSS aggiuntivi per fare il z-indexcorretto. Ma ancora una volta, dipende da come è strutturata la tua pagina.

Questo ha funzionato per me quando non riuscivo a visualizzare un'immagine di intestazione nella visualizzazione di stampa.


3
Questa era una soluzione fantastica per quello che dovevo fare, ovvero cambiare un inline <img>(per RWD) con uno diverso per @media print. L'immagine web era su uno sfondo scuro, quindi la stampa di quell'immagine non funzionava su carta bianca e non volevo costringere gli utenti a stampare uno sfondo scuro sull'intestazione. Perfetto!
JHogue

@JHogue - Grazie! Sono contento che ti abbia aiutato.
ckpepper02

4
Anche se questa non è una risposta "corretta". È MOLTO più utile della risposta accettata.
Xenology

sotto la risposta stackoverflow.com/a/15208258/915865 dovrebbe essere contrassegnata poiché ha una spiegazione migliore, imho
Kat Lim Ruiz

1
In Firefox ha funzionato solo se si utilizzavano i contenuti all'interno: prima come risposta @ hanz
vaskort

18

Il codice seguente funziona bene per me (almeno per Chrome).

Ho anche aggiunto alcuni controlli per il margine e l'orientamento della pagina (verticale, orizzontale).

<style type="text/css" media="print">
@media print {
  body {-webkit-print-color-adjust: exact;}
}
@page {
    size:A4 landscape;
    margin-left: 0px;
    margin-right: 0px;
    margin-top: 0px;
    margin-bottom: 0px;
    margin: 0;
    -webkit-print-color-adjust: exact;
}
</style>

9

Assicurati di utilizzare l'attributo! Important. Ciò aumenta notevolmente la probabilità che i tuoi stili vengano mantenuti una volta stampati.

#example1 {
    background:url(image.png) no-repeat !important;
}

#example2 {
    background-color: #123456 !important;
}

Ho creato alcuni semplici report "stampabili" per la mia azienda utilizzando questo metodo. Funziona su OS X Chrome / Safari e Windows 8 Chrome / IE (non ho provato altre piattaforme).
noci-n-birra

3
Questo sembra non avere alcun effetto su Chrome, Firefox e Safari su Mac.
intcreator

Questo è proprio ciò di cui avevo bisogno per applicare l'attributo a ogni utilizzo di quel particolare elemento e permettermi di stampare il documento in modo appropriato. Grazie!
johnny

7

Come ha detto @ ckpepper02, l'opzione body content: url funziona bene. Ho scoperto tuttavia che se lo modifichi leggermente puoi semplicemente usarlo per aggiungere un'immagine di intestazione di sorta usando lo pseudo elemento: before come segue.

@media print {
  body:before { content: url(img/printlogo.png);}
}

Ciò farà scorrere l'immagine nella parte superiore della pagina e, dai miei test limitati, funziona su Chrome e IE9

-hanz


5

Usa gli psuedo-elementi. Mentre molti browser ignorano le immagini di sfondo, gli psuedo-elementi con il loro contenuto impostato su un'immagine NON sono tecnicamente immagini di sfondo. È quindi possibile posizionare l'immagine di sfondo all'incirca dove avrebbe dovuto essere l'immagine (anche se non è così facile o preciso come l'immagine originale).

Uno svantaggio è che, affinché funzioni in Chrome, è necessario specificare questo comportamento al di fuori della query dei supporti di stampa e quindi renderlo visibile nel blocco delle query dei supporti di stampa. Quindi, qualcosa del genere ...

.image:before{
        visibility:hidden;
        position:absolute;
        content: url("your/image/path");
    }   

@media print {
.image{
   position:relative;
    }
    .image:before{
       visibility:visible;
       top:etc...
    }       
}

Lo svantaggio è che l'immagine verrà spesso scaricata durante i normali caricamenti della pagina, aggiungendo un volume non necessario. Puoi evitarlo semplicemente usando la stessa immagine / percorso che avevi già utilizzato per l'immagine visibile originale.


1

funziona in Google Chrome quando aggiungi! attributo importante all'immagine di sfondo assicurati di aggiungere prima l'attributo e riprova, puoi farlo in questo modo

    .inputbg {
background: url('inputbg.png') !important;  

}


buon punto da menzionare, ho risolto il mio problema insieme a -webkit-print-color-Adjust: esatto! importante;
czmarc

0

Puoi usare i bordi per colori fissi.

 borderTop: solid 15px black;

e per lo sfondo sfumato puoi usare:

    box-sizing: border-box;
    border-style: solid;
    border-top: 0px;
    border-left: 0px;
    border-right: 0px;
    border-image: linear-gradient(to right, red, blue) 100%;
    border-image-slice: 1;
    border-width: 18px;

0

https://gist.github.com/danomanion/6175687 propone una soluzione elegante, utilizzando un punto elenco personalizzato al posto di un'immagine di sfondo:

   a.logo {
     display: list-item;
     list-style-image: url("../images/desired-background.png");
     list-style-position: inside;
   }

Includendo questo in un file

@media print {
}

blocco, sono in grado di sostituire un logo bianco su trasparente sullo schermo, reso come immagine di sfondo, con un logo nero su trasparente per la stampa.


Questa è una soluzione carina, ma non funziona se l'immagine di sfondo è molto più grande del contenitore. (allunga il mio div contenente)
Jabbamonkey

-1

Puoi fare alcuni trucchi del genere:

<style>
    @page {
        size: 21cm 29.7cm;
        size: landscape
        /*margin: 30mm 45mm 30mm 45mm;*/

    }
    .whater{
        opacity: 0.05;
        height: 100%;
        width: 100%;
        position: absolute;
        z-index: 9999;
    }
</style>

Nel tag del corpo:

<img src="YOUR IMAGE URL" class="whater"/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.