Imprimer uniquement?
comment imprimer le div indiqué (sans désactiver manuellement tout autre contenu sur la page)?
je veux éviter un nouveau dialogue de prévisualisation, donc créer une nouvelle fenêtre avec ce contenu n'est pas utile.
la page contient quelques tableaux, l'un d'eux contient la div je veux imprimer - le tableau est stylisé avec des styles visuels pour le web, qui ne devrait pas apparaître dans l'imprimé.
26 réponses
Voici une solution générale, en utilisant CSS seulement , que j'ai vérifié pour travailler.
@media print {
body * {
visibility: hidden;
}
#section-to-print, #section-to-print * {
visibility: visible;
}
#section-to-print {
position: absolute;
left: 0;
top: 0;
}
}
les approches alternatives ne sont pas si bonnes. Utiliser display
est délicat car si un élément a display:none
alors aucun de ses descendants ne s'affichera non plus. Pour l'utiliser, vous devez modifier la structure de votre page.
utiliser visibility
fonctionne mieux car vous pouvez activer la visibilité pour les descendants. L'invisible les éléments affectent toujours la mise en page, donc je déplace section-to-print
en haut à gauche pour qu'il imprime correctement.
j'ai une meilleure solution avec un code minimal.
Placez votre partie imprimable à l'intérieur d'un div avec un id comme ceci:
<div id="printableArea">
<h1>Print me</h1>
</div>
<input type="button" onclick="printDiv('printableArea')" value="print a div!" />
puis Ajouter un événement comme un onclick (comme montré ci-dessus), et passer l'id du div comme je l'ai fait ci-dessus.
maintenant, créons un javascript vraiment simple:
function printDiv(divName) {
var printContents = document.getElementById(divName).innerHTML;
var originalContents = document.body.innerHTML;
document.body.innerHTML = printContents;
window.print();
document.body.innerHTML = originalContents;
}
vous voyez comme c'est simple? Pas de popups, pas de nouvelles fenêtres, pas de style fou, pas de bibliothèques JS comme jquery. Le problème avec les solutions vraiment compliquées (la réponse n'est pas compliquée et pas ce à quoi je fais référence) est le fait qu'il ne se traduira jamais à travers tous les navigateurs, jamais! Si vous voulez rendre les styles différents, Faites comme indiqué dans la réponse cochée en ajoutant l'attribut media à un lien de feuille de style (media="print").
Pas de peluches, léger, il fonctionne, tout simplement.
toutes les réponses jusqu'à présent sont plutôt imparfaites - elles impliquent soit l'ajout de class="noprint"
à tout ou va gâcher display
dans #printable
.
je pense que la meilleure solution serait de créer une enveloppe autour de la substance non imprimable:
<head>
<style type="text/css">
#printable { display: none; }
@media print
{
#non-printable { display: none; }
#printable { display: block; }
}
</style>
</head>
<body>
<div id="non-printable">
Your normal page contents
</div>
<div id="printable">
Printer version
</div>
</body>
bien sûr, ce n'est pas parfait car cela implique de déplacer les choses dans votre HTML un peu...
avec jQuery c'est aussi simple que ça:
w=window.open();
w.document.write($('.report_left_inner').html());
w.print();
w.close();
pourriez-vous utiliser une feuille de style d'impression , et utiliser CSS pour organiser le contenu que vous vouliez imprimer? lisez cet article pour plus de pointeurs.
cela fonctionne bien:
<style type="text/css">
@media print
{
body * { visibility: hidden; }
#printcontent * { visibility: visible; }
#printcontent { position: absolute; top: 40px; left: 30px; }
}
</style>
noter que cela ne fonctionne qu'avec la"visibilité". "affichage" de ne pas le faire. Testé en FF3.
Je n'ai vraiment aimé aucune de ces réponses dans leur ensemble. Si vous avez une classe (dites printablarea) et que vous en êtes l'enfant immédiat, alors vous pouvez faire quelque chose comme ça dans votre CSS d'impression:
body > *:not(.printableArea) {
display: none;
}
//Not needed if already showing
body > .printableArea {
display: block;
}
L'utilisation de la visibilité peut causer beaucoup de problèmes d'espacement et de pages vierges. C'est parce que la visibilité maintient l'espace des éléments, le rend simplement caché, où comme l'affichage le supprime et permet à d'autres éléments de prendre son espace.
la raison pour laquelle cette solution fonctionne est que vous n'attrapez pas tous les éléments, juste les enfants immédiats du corps et de les cacher. Les autres solutions ci-dessous avec display css, masquent tous les éléments, ce qui affecte tout à l'intérieur du contenu printablea.
Je ne suggérerais pas javascript car vous auriez besoin d'un bouton d'impression que l'utilisateur clique et les boutons d'impression standard du navigateur n'auraient pas le même effet. Si vous avez vraiment besoin de faire cela, ce que je ferait est de stocker le html du corps, supprimer tous les éléments indésirables, imprimer, puis ajouter le retour html. Comme mentionné cependant, je l'éviterais si vous pouvez et utilisez une option CSS comme ci-dessus.
NOTE: Vous pouvez ajouter n'importe quel CSS dans le CSS d'impression en utilisant les styles inline:
<style type="text/css">
@media print {
//styles here
}
</style>
ou comme je l'utilise habituellement est une étiquette de lien:
<link rel="stylesheet" type="text/css" media="print" href="print.css" />
-
donnez n'importe quel élément que vous voulez imprimer l'id
printMe
. -
incluez ce script dans votre tête:
<script language="javascript"> var gAutoPrint = true; function processPrint(){ if (document.getElementById != null){ var html = '<HTML>\n<HEAD>\n'; if (document.getElementsByTagName != null){ var headTags = document.getElementsByTagName("head"); if (headTags.length > 0) html += headTags[0].innerHTML; } html += '\n</HE' + 'AD>\n<BODY>\n'; var printReadyElem = document.getElementById("printMe"); if (printReadyElem != null) html += printReadyElem.innerHTML; else{ alert("Error, no contents."); return; } html += '\n</BO' + 'DY>\n</HT' + 'ML>'; var printWin = window.open("","processPrint"); printWin.document.open(); printWin.document.write(html); printWin.document.close(); if (gAutoPrint) printWin.print(); } else alert("Browser not supported."); } </script>
-
Appeler la fonction
<a href="javascript:void(processPrint());">Print</a>
hm ... utilisez le type de feuille de style pour l'impression ... par exemple:
<link rel="stylesheet" type="text/css" href="print.css" media="print" />
impression.css:
div { display: none; }
#yourdiv { display: block; }
<script type="text/javascript">
function printDiv(divId) {
var printContents = document.getElementById(divId).innerHTML;
var originalContents = document.body.innerHTML;
document.body.innerHTML = "<html><head><title></title></head><body>" + printContents + "</body>";
window.print();
document.body.innerHTML = originalContents;
}
</script>
Étape 1: Écrivez le javascript suivant à l'intérieur de votre tête étiquette
<script language="javascript">
function PrintMe(DivID) {
var disp_setting="toolbar=yes,location=no,";
disp_setting+="directories=yes,menubar=yes,";
disp_setting+="scrollbars=yes,width=650, height=600, left=100, top=25";
var content_vlue = document.getElementById(DivID).innerHTML;
var docprint=window.open("","",disp_setting);
docprint.document.open();
docprint.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"');
docprint.document.write('"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
docprint.document.write('<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">');
docprint.document.write('<head><title>My Title</title>');
docprint.document.write('<style type="text/css">body{ margin:0px;');
docprint.document.write('font-family:verdana,Arial;color:#000;');
docprint.document.write('font-family:Verdana, Geneva, sans-serif; font-size:12px;}');
docprint.document.write('a{color:#000;text-decoration:none;} </style>');
docprint.document.write('</head><body onLoad="self.print()"><center>');
docprint.document.write(content_vlue);
docprint.document.write('</center></body></html>');
docprint.document.close();
docprint.focus();
}
</script>
Étape 2: appeler la fonction PrintMe('DivID') par un événement onclick.
<input type="button" name="btnprint" value="Print" onclick="PrintMe('divid')"/>
<div id="divid">
here is some text to print inside this div with an id 'divid'
</div>
avec CSS 3 vous pouvez utiliser ce qui suit:
body *:not(#printarea) {
display: none;
}
j'ai récupéré le contenu en utilisant JavaScript et j'ai créé une fenêtre que je pouvais imprimer à la place...
la méthode de Sandro fonctionne très bien.
Je l'ai modifié pour permettre l'utilisation de plusieurs liens printMe, en particulier dans les pages tabulées et les textes en expansion.
function processPrint(printMe){
<-- appel pour une variable ici
var printReadyElem = document.getElementById(printMe);
<-- supprimé les guillemets autour de printMe de demander une variable
<a href="javascript:void(processPrint('divID'));">Print</a>
< -- passer le div ID à imprimer sur la fonction pour transformer la variable printMe en la div ID.
printDiv(divId) : une solution généralisée pour imprimer n'importe quelle div sur n'importe quelle page.
j'ai eu un problème similaire, mais je voulais (a) pouvoir imprimer la page entière, ou (B) Imprimer l'un ou l'autre de plusieurs domaines spécifiques. Ma solution, grâce à une grande partie de ce qui précède, vous permet de spécifier n'importe quel objet div à imprimer.
la clé de cette solution est d'ajouter une règle appropriée à la feuille de style pour les médias imprimés de sorte que le div (et son contenu) sera imprimé.
tout d'abord, créez les CSS d'impression nécessaires pour supprimer tout (mais sans la règle spécifique pour permettre l'élément que vous voulez imprimer).
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
Notez que j'ai ajouté de nouvelles règles de classe:
- "noprintarea vous permet de supprimer l'impression d'éléments dans votre div - à la fois le contenu et le bloc.
- noprintcontent vous permet de supprimer l'impression d'éléments dans votre div - le contenu est supprimé mais et la zone allouée est laissée vide.
- imprimer vous permet d'avoir des éléments qui apparaissent dans la version imprimée, mais pas sur l'écran de la page. Ces normalement "display:none" pour le style d'écran.
insérez trois fonctions JavaScript. Les premiers ne font que basculer la feuille de style pour les médias imprimés.
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
le second fait le vrai travail et le troisième nettoie ensuite. Le second (printDiv) active la feuille de style de la presse écrite, puis ajoute une nouvelle règle pour permettre au div désiré d'imprimer, publie l'impression, puis ajoute un délai avant le ménage final (autrement les styles peuvent être réinitialisés avant que l'impression est faite.)
function printDiv(divId)
{
// Enable the print CSS: (this temporarily disables being able to print the whole page)
disableSheet(0,false);
// Get the print style sheet and add a new rule for this div
var sheetObj=document.styleSheets[0];
var showDivCSS="visibility:visible;display:block;position:absolute;top:30px;left:30px;";
if (sheetObj.rules) { sheetObj.addRule("#"+divId,showDivCSS); }
else { sheetObj.insertRule("#"+divId+"{"+showDivCSS+"}",sheetObj.cssRules.length); }
print();
// need a brief delay or the whole page will print
setTimeout("printDivRestore()",100);
}
les fonctions finales suppriment la règle ajoutée et remet le style d'impression en mode désactivé pour que toute la page puisse être imprimée.
function printDivRestore()
{
// remove the div-specific rule
var sheetObj=document.styleSheets[0];
if (sheetObj.rules) { sheetObj.removeRule(sheetObj.rules.length-1); }
else { sheetObj.deleteRule(sheetObj.cssRules.length-1); }
// and re-enable whole page printing
disableSheet(0,true);
}
la seule autre chose à faire est d'ajouter une ligne à votre processus de chargement afin que le style d'impression soit initialement désactivé, permettant ainsi l'impression de page entière.
<body onLoad='disableSheet(0,true)'>
alors, de n'importe où dans votre document, vous pouvez imprimer un div. Il suffit de publier printDiv ("thedivid") à partir d'un bouton ou autre.
un grand plus pour cette approche il fournit une solution générale à l'impression du contenu sélectionné dans une page. Il permet également l'utilisation de styles existants pour les éléments qui sont imprimés - y compris le contenant div.
NOTE: dans ma mise en œuvre, ce doit être la première feuille de style. Changer les références de feuille (0) au numéro de feuille approprié si vous avez besoin de le faire plus tard dans la séquence de feuille.
@Kevin Florida Si vous avez plusieurs divs avec la même classe, vous pouvez l'utiliser comme ceci:
<div style="display:none">
<div id="modal-2" class="printableArea">
<input type="button" class="printdiv-btn" value="print a div!" />
</div>
</div>
j'utilisais le type de contenu interne Colorbox
$(document).on('click', '.printdiv-btn', function(e) {
e.preventDefault();
var $this = $(this);
var originalContent = $('body').html();
var printArea = $this.parents('.printableArea').html();
$('body').html(printArea);
window.print();
$('body').html(originalContent);
});
dans mon cas, j'ai dû imprimer une image à l'intérieur d'une page. Lorsque j'ai utilisé la solution voté, j'ai eu 1 page blanche et l'autre montrant l'image. J'espère que ça aidera quelqu'un.
voici le css que j'ai utilisé:
@media print {
body * {
visibility: hidden;
}
#not-print * {
display: none;
}
#to-print, #to-print * {
visibility: visible;
}
#to-print {
display: block !important;
position: absolute;
left: 0;
top: 0;
width: auto;
height: 99%;
}
}
mon html est:
<div id="not-print" >
<header class="row wrapper page-heading">
</header>
<div class="wrapper wrapper-content">
<%= image_tag @qrcode.image_url, size: "250x250" , alt: "#{@qrcode.name}" %>
</div>
</div>
<div id="to-print" style="display: none;">
<%= image_tag @qrcode.image_url, size: "300x300" , alt: "#{@qrcode.name}" %>
</div>
utiliser une feuille de style spéciale pour l'impression
<link rel="stylesheet" href="print.css" type="text/css" media="print" />
et ensuite ajouter une classe i.e." noprint " à chaque étiquette qui est du contenu que vous ne voulez pas imprimer.
dans l'utilisation CSS
.noprint {
display: none;
}
si vous voulez seulement imprimer cette div, vous devez utiliser l'instruction:
@media print{
*{display:none;}
#mydiv{display:block;}
}
la fonction printDiv() est sortie plusieurs fois, mais dans ce cas, vous perdez tous vos éléments de liaison et vos valeurs d'entrée. Donc, ma solution est de créer un div pour tout ce qu'on appelle "body_allin" et un autre en dehors du premier appelé "body_print".
alors vous appelez cette fonction:
function printDiv(divName){
var printContents = document.getElementById(divName).innerHTML;
document.getElementById("body_print").innerHTML = printContents;
document.getElementById("body_allin").style.display = "none";
document.getElementById("body_print").style.display = "";
window.print();
document.getElementById("body_print").innerHTML = "";
document.getElementById("body_allin").style.display = "";
document.getElementById("body_print").style.display = "none";
}
vous pouvez utiliser un style CSS séparé qui désactive tous les autres contenus sauf celui avec l'id"printarea".
Voir CSS Design: Impression pour plus d'explications et d'exemples.
j'ai eu plusieurs images chacune avec un bouton et ai dû cliquer sur un bouton pour imprimer chaque div avec une image. Cette solution fonctionne si j'ai désactivé cache dans mon navigateur, et la taille de l'image ne change pas dans Chrome:
function printDiv(divName) {
var printContents = document.getElementById(divName).innerHTML;
w = window.open();
w.document.write(printContents);
w.document.write('<scr' + 'ipt type="text/javascript">' + 'window.onload = function() { window.print(); window.close(); };' + '</sc' + 'ript>');
w.document.close(); // necessary for IE >= 10
w.focus(); // necessary for IE >= 10
return true;
}
<div id="printableArea">
<h1>Print me</h1>
</div>
<input type="button" onclick="printDiv('printableArea')" value="print a div!" />
une approche de plus sans affecter la page courante et il persiste aussi la css pendant l'impression. Ici le sélecteur doit être le sélecteur de div spécifique quel contenu nous devons imprimer.
printWindow(selector, title) {
var divContents = $(selector).html();
var $cssLink = $('link');
var printWindow = window.open('', '', 'height=' + window.outerHeight * 0.6 + ', width=' + window.outerWidth * 0.6);
printWindow.document.write('<html><head><h2><b><title>' + title + '</title></b></h2>');
for(var i = 0; i<$cssLink.length; i++) {
printWindow.document.write($cssLink[i].outerHTML);
}
printWindow.document.write('</head><body >');
printWindow.document.write(divContents);
printWindow.document.write('</body></html>');
printWindow.document.close();
printWindow.onload = function () {
printWindow.focus();
setTimeout( function () {
printWindow.print();
printWindow.close();
}, 100);
}
}
ici fourni un certain temps de montrer que CSS externes obtenir appliqué à elle.
j'ai essayé plusieurs des solutions fournies.Aucun d'eux n'a fonctionné parfaitement. Ils perdent soit les fixations CSS ou JavaScript. J'ai trouvé une solution parfaite et facile qui ne perde ni les fixations CSS ni JavaScript.
HTML:
<div id='printarea'>
<p>This is a sample text for printing purpose.</p>
<input type='button' id='btn' value='Print' onclick='printFunc();'>
</div>
<p>Do not print.</p>
Javascript:
function printFunc() {
var divToPrint = document.getElementById('printarea');
var htmlToPrint = '' +
'<style type="text/css">' +
'table th, table td {' +
'border:1px solid #000;' +
'padding;0.5em;' +
'}' +
'</style>';
htmlToPrint += divToPrint.outerHTML;
newWin = window.open("");
newWin.document.write("<h3 align='center'>Print Page</h3>");
newWin.document.write(htmlToPrint);
newWin.print();
newWin.close();
}
vous pouvez utiliser ce: http://vikku.info/codesnippets/javascript/print-div-content-print-only-the-content-of-an-html-element-and-not-the-whole-document /
Ou utiliser visibility:visible
et visibility:hidden
propriété css avec @media print{}
'display: none 'masquera tout'display:block' imbriqué. Ce n'est pas la solution.
Best css pour l'adapter à l'espace vide de la hauteur:
@media print {
body * {
visibility: hidden;
height:0;
}
#section-to-print, #section-to-print * {
visibility: visible;
height:auto;
}
#section-to-print {
position: absolute;
left: 0;
top: 0;
}
}