2016-05-05 2 views
0

Я использую html2canvas.js 0.4.1 для преобразования DOM в холст для печати. Когда текст имеет цвет фона на пролете, а span охватывает следующую строку, то версия холста охватывает весь прямоугольник из двух линий обертывания. Он не просто охватывает текст. Кроме того, он скрывает текст в предыдущем интервале.Неверный цвет обложки Html to canvas

Следующая скрипка демонстрирует это довольно хорошо. Пробел «один» полностью покрыт синим фоном на «двух двух» диапазонах.

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> 

код:

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); 
      } 
     }); 

Моя теория html2canvas не может сказать, что такое прямоугольник от промежутков, или, может быть, он просто не поддерживает несколько прямоугольников в качестве границ.

Есть ли какой-либо эффект CSS, который я могу использовать в тексте HTML, который будет правильно отображаться в html2canvas? Это не должно быть цвет фона, но я должен как-то указать, что диапазон обтекания выделен.

+1

Да, кажется, что фоновый цвет на встроенных элементах не работает. Уже существует [проблема] (https://github.com/niklasvh/html2canvas/issues/548) на странице github проекта. Обратите также внимание на то, что в последней версии были некоторые улучшения: https://jsfiddle.net/sddah9k2/5/ – Kaiido

ответ

1

Холст не поддерживает многострочные текстовые строки. Таким образом, ваши библиотеки разбивают его, но поле обертывания .select получает такие размеры, как элемент встроенного блока.

Вам нужно разделить и обернуть каждое выделенное слово отдельным сегментом.

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'); 

Я обновил вы скрипку, что: https://jsfiddle.net/sddah9k2/7/
Я даже обновил @Kaiido сек усовершенствованную скрипку ваш: https://jsfiddle.net/sddah9k2/6/ (я работал в основном на том, что один)

+0

Я понял, что сегодня утром я могу разделить каждое письмо, но каждое слово лучше, поскольку оно будет только обернуть на пространстве. Он также работает, чтобы сделать дисплей встроенным блоком, но затем он обертывается по-разному. –

0

Я уже принял Seika85, поскольку он был первым. Вот то, что я закончил с, сохраняя при этом оригинальный срок, а также делать это для каждого 'выберите' продолжительность:

ссылка: https://jsfiddle.net/sddah9k2/9/

ЯШ:

// 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

Вы можете сократить свой CSS до '.select, .bg {background-color: # 3efcdb; } '. Всякий раз, когда вы хотели бы изменить bg-color, вам придется делать это только один раз. То же самое касается вашего JS. Наиболее редактируемые методы jQuery всегда возвращают * это *, поэтому вы можете сократить * удалить класс * и * emtpy block * до одной строки: '$ (block) .removeClass ('select'). Html ('');' – Seika85

+0

В моем приложении css для 'select' происходит из другого приложения, которое я не контролирую, поэтому я и хотел свой собственный класс. Ваша точка в строке jquery хорошо взламывается! Холод - одна линия. –