2016-05-05 9 views
0

Ich benutze html2canvas.js 0.4.1, um ein DOM zu Leinwand für den Druck zu konvertieren. Wenn der Text in einer Spanne eine Hintergrundfarbe hat und die Spanne in die nächste Zeile springt, deckt die Canvas-Version das gesamte Rechteck der beiden Umbruchlinien ab. Es deckt nicht nur den Text ab. Darüber hinaus verbirgt es den Text in der vorherigen Spanne.Html Leinwand Hintergrundfarbe wraps falsch

Die folgende Geige demonstriert es ziemlich gut. Die Ein-Mann-Spanne ist vollständig durch den blauen Hintergrund auf der Zwei-Zwei-Spanne abgedeckt.

https://jsfiddle.net/sddah9k2/1/

css:

#content { 
    width:200px; 
} 
.select { 
    background-color:#3efcdb 
} 

html:

<div id='content'> 
<span >one one one one one one </span> 
<span class="select" >two two two two two two </span> 
<span >three three three three three </span> 
</div> 

<div id="img-out"></div> 

Code:

html2canvas($("#content"), { 
      onrendered: function(canvas) { 
       theCanvas = canvas; 
       document.body.appendChild(canvas); 

       // Convert and download as image 
       Canvas2Image.saveAsPNG(canvas); 
       $("#img-out").append(canvas); 
       // Clean up 
       //document.body.removeChild(canvas); 
      } 
     }); 

Meine Theorie ist, kann html2canvas nicht sagen, was den Begrenzungsrahmen der Spannweiten sind, oder vielleicht unterstützt es nicht mehrere Rechtecke als Grenzen.

Gibt es irgendeine Art von CSS-Effekt, den ich für den HTML-Text verwenden kann, der in html2canvas korrekt gerendert wird? Es muss keine Hintergrundfarbe sein, aber ich muss irgendwie angeben, dass die Umbruchspanne hervorgehoben ist.

+1

Ja, es scheint, dass Hintergrundfarbe auf Inline-Elementen nicht gut funktioniert. Es gibt bereits [ein Problem] (https://github.com/niklasvh/html2canvas/issues/548) auf der github-Seite des Projekts. Beachten Sie auch, dass es auf der letzten Version einige Verbesserungen gegeben hat: https://jsfiddle.net/sddah9k2/5/ – Kaiido

Antwort

1

Canvas unterstützt keine mehrzeiligen Inline-Texte. So teilen Ihre Bibliotheken es auf, aber die Verpackung .select Box erhält die Dimensionen wie ein Inline-Block-Element.

Sie müssen jedes hervorgehobene Wort trennen und umbrechen.

JS:

var $selected = $('#content.notupdated .select'); 
$selected.each(function() { 
    var $this = $(this); 
    var words = $this.text().split(" "); 
    $this.empty(); 
    $.each(words, function(i, v) { 
     $this.append($("<span>").text(v + ' ')); 
    }); 
}); 
$('#content.notupdated').removeClass('notupdated').addClass('updated'); 

ich Ihnen für die Geige aktualisiert: https://jsfiddle.net/sddah9k2/7/
ich auch @Kaiido s verbesserte Geige von Ihnen aktualisiert: https://jsfiddle.net/sddah9k2/6/ (arbeitete ich in erster Linie auf, dass man)

+0

Ich habe heute Morgen herausgefunden, dass ich auf jeden Buchstaben teilen könnte, aber jedes Wort ist besser, da es nur wickeln wird auf dem Platz. Es funktioniert auch, Inline-Block anzuzeigen, aber es wird dann anders umbrochen. –

0

ich schon akzeptierte Seika85 Antwort, da seine erste war. Hier ist, was ich am Ende mit der ursprünglichen Spanne zu halten und dies auch für jeden zu tun 'wählen' Spannweite:

Link: https://jsfiddle.net/sddah9k2/9/

js:

// Get all the select spans 
$('span.select').each(function (ix, block) { 
    // split the text spans on word so it wraps in the same place 
    var txtar = $(block).text().split(' '); 

    // Remove the class on the outer span, but keep it intact. 
    $(block).removeClass('select'); 
    $(block).html(''); // empty it 
    // Replace each word. Note the space before closing span! 
    $(txtar).each(function (ix, txt) { 
     $(block).append($('<span class="bg">'+txt+' </span>')); 
    }); 
}); 

css:

.select { 
    background-color:#3efcdb; 
} 
.bg { 
    background-color:#3efcdb; 
} 
+0

Sie können Ihr CSS auf '.select, .bg {background-color: # 3efcdb; } '. Wann immer Sie die bg-Farbe ändern möchten, müssen Sie dies nur einmal tun. Das gleiche gilt für Ihre JS. Die meisten Editiermethoden von jQuery geben immer * this * zurück, so dass Sie * remove class * und * empty block * auf eine einzige Zeile kürzen können: '$ (block) .removeClass ('select'). Html ('');' – Seika85

+0

In meiner Anwendung kommt das CSS für 'Select' aus einer anderen Anwendung, die ich nicht kontrolliere, weshalb ich meine eigene Klasse haben wollte. Ihr Punkt über JQuery Linie ist gut, aber! Kalt sein eine Linie. –