2017-09-13 1 views
0

Lorsque le contenu d'un div est trop grand, je dois les mettre à l'échelle avant d'imprimer. J'ai suivi les conseils utiles ici et mis en place des feuilles de style d'impression. Quand vient le temps d'imprimer, je trouve que j'ai besoin de changer certains des CSS dans la requête d'impression @media. Au lieu de changer la classe dans la requête média, je trouve qu'un sélecteur CSS normal apporte les modifications à la div à l'écran et non à la requête d'impression. Y a-t-il un sélecteur que je peux utiliser pour apporter les modifications au css @media print seulement? Exemple: Cliquez sur le bouton 'Change Scale' pour zoomer immédiatement sur l'image. Je veux que l'échelle modifiée s'applique uniquement à l'impression.Comment changer le CSS dans une requête d'impression @media?

var canvas = document.getElementById("canvas1"); 
 
function draw_a() { 
 
    var context = canvas.getContext("2d"); 
 
// // LEVER 
 

 
//plane 
 
context.fillStyle = '#aaa'; 
 
context.fillRect (25, 90, 2500, 400); 
 

 

 
} 
 

 

 

 

 
function changeScale() { 
 
    
 
    var scale = .1; 
 
    
 
    console.log("scale:" + scale); 
 
    
 
    $('.myDivToPrint').css({ 
 
       '-webkit-transform': 'scale(' + scale + ')', 
 
       '-moz-transform': 'scale(' + scale + ')', 
 
       '-ms-transform': 'scale(' + scale + ')', 
 
       '-o-transform': 'scale(' + scale + ')', 
 
       'transform': 'scale(' + scale + ')', 
 
       
 
      }); 
 

 
} 
 

 
$(document).ready(function(){ 
 
    draw_a(); 
 
    
 
});
div.sizePage { 
 
    color: #333; 
 
} 
 

 
canvas { 
 
    border: 1px dotted; 
 
} 
 

 
.printOnly { 
 
    display: none; 
 
} 
 

 
@media print { 
 
    html, 
 
    body { 
 
    height: 100%; 
 
    background-color: yellow; 
 
    } 
 
    .myDivToPrint { 
 
    background-color: yellow; 
 
    top: 0; 
 
    left: 0; 
 
    margin: 0; 
 
    } 
 
    .no-print, 
 
    .no-print * { 
 
    display: none !important; 
 
    } 
 
    .printOnly { 
 
    display: block; 
 
    } 
 
} 
 

 
@media print and (-ms-high-contrast: active) and (-ms-high-contrast: none) { 
 
    html, 
 
    body { 
 
    height: 100%; 
 
    background-color: pink; 
 
    } 
 
    .myDivToPrint { 
 
    background-color: yellow; 
 
    /* 
 
    -moz-transform: rotate(90deg) scale(0.3); 
 
     -ms-transform: rotate(90deg) scale(0.3); 
 
     -o-transform: rotate(90deg) scale(0.3); 
 
     -webkit-transform: rotate(90deg) scale(0.3); 
 
     transform: rotate(90deg) scale(0.3); /* Standard Property */ 
 
     position: fixed; 
 
    top: 0; 
 
    left: 0; 
 
    margin: 0; 
 
    padding: 15px; 
 
    font-size: 14px; 
 
    line-height: 18px; 
 
    position: absolute; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
    /* 
 
    -webkit-transform: rotate(90deg); 
 
    -moz-transform: rotate(90deg); 
 
    -o-transform: rotate(90deg); 
 
    -ms-transform: rotate(90deg); 
 
    transform: rotate(90deg); 
 
*/ 
 
    
 
    } 
 
    .no-print, 
 
    .no-print * { 
 
    display: none !important; 
 
    } 
 
    .printOnly { 
 
    display: block; 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button onclick="window.print();" class="no-print">Print Canvas</button> 
 
<button onclick="changeScale();" class="no-print>">Change Scale</button> 
 
<div class="myDivToPrint"> 
 
<canvas height="2500px" width="4000px" id="canvas1"></canvas> 
 
</div>

Merci, Matt

+0

Je ne suis pas sûr de comprendre. Les sélecteurs dans la requête '@media print' s'appliquent déjà à l'impression uniquement. On dirait que vous faites déjà ce dont vous avez besoin. Pourriez-vous clarifier s'il vous plaît? – jfeferman

+0

Dans l'extrait de code lorsque vous cliquez sur le bouton "Modifier l'échelle", vous pouvez voir que l'image sur l'écran change réellement d'échelle. Cela m'indique que le navigateur a créé une autre classe (peut-être un élément) et l'a appliqué à la div sur l'écran. La classe réelle dans la requête média est intacte. Je vais essayer de mettre à jour la question. –

Répondre

0

Si je vous comprends bien. Vous souhaitez modifier la requête média elle-même. Dans ce cas, voici quelques exemples. jQuery change media query width value

$('body').append("<style type='text/css'>@media screen and (min-width: 500px) { /*whatever*/ }</style>"); 

Vous pouvez également utiliser window.MatchMedia() comme indiqué dans l'exemple ci-dessous! Vous pouvez simplement mettre à jour un élément existant (ou en créer un) textContent pour contenir la règle, ce qui la rendra effective dans le contexte donné. Generating CSS media queries with javascript or jQuery

document.querySelector('style').textContent += 
    "@media screen and (min-width:400px) { div { color: red; }}" 

Il y a aussi une bibliothèque qui permet au mélange de CSS et spécifique jQuery à cet effet. http://www.learningjquery.com/2017/03/how-to-use-media-queries-with-jquery

+0

Ils semblent prometteurs. J'essaie de modifier l'extrait de code qui en implémente un et qui échoue jusqu'à présent. Pourriez-vous créer un extrait de code montrant comment cela fonctionne? Merci, Matt –

+0

si (CONDITIONS) {document.querySelector ('style'). TextContent + = "@media print {div {color: red;}}"; } –

+0

Veuillez accepter la réponse! :) N'importe lequel d'entre eux fonctionnerait, mais rappelez-vous que SO est pour référence! –