Я використав відповідь purgatory101, але зіткнувся зі збереженням усіх кольорів (піктограм, фонів, кольорів тексту тощо), особливо, що таблиці стилів CSS не можна використовувати з бібліотеками, які динамічно змінюють кольори елемента DOM. Тому ось сценарій, який змінює стилі елементів ( background-colour
і colour
) перед друком та очищає стилі після того, як буде зроблено друк. Корисно уникати написання великої кількості CSS в а@media print
таблицю стилів, оскільки це працює незалежно від структури сторінки.
Є частина сценарію, спеціально створена для збереження кольорів піктограм FontAwesome (або будь-який елемент, який використовує :before
селектор для вставки кольорового вмісту).
JSFiddle показує сценарій в дії
Сумісність: працює в Chrome, я не перевіряв інші браузери.
function setColors(selector) {
var elements = $(selector);
for (var i = 0; i < elements.length; i++) {
var eltBackground = $(elements[i]).css('background-color');
var eltColor = $(elements[i]).css('color');
var elementStyle = elements[i].style;
if (eltBackground) {
elementStyle.oldBackgroundColor = {
value: elementStyle.backgroundColor,
importance: elementStyle.getPropertyPriority('background-color'),
};
elementStyle.setProperty('background-color', eltBackground, 'important');
}
if (eltColor) {
elementStyle.oldColor = {
value: elementStyle.color,
importance: elementStyle.getPropertyPriority('color'),
};
elementStyle.setProperty('color', eltColor, 'important');
}
}
}
function resetColors(selector) {
var elements = $(selector);
for (var i = 0; i < elements.length; i++) {
var elementStyle = elements[i].style;
if (elementStyle.oldBackgroundColor) {
elementStyle.setProperty('background-color', elementStyle.oldBackgroundColor.value, elementStyle.oldBackgroundColor.importance);
delete elementStyle.oldBackgroundColor;
} else {
elementStyle.setProperty('background-color', '', '');
}
if (elementStyle.oldColor) {
elementStyle.setProperty('color', elementStyle.oldColor.value, elementStyle.oldColor.importance);
delete elementStyle.oldColor;
} else {
elementStyle.setProperty('color', '', '');
}
}
}
function setIconColors(icons) {
var css = '';
$(icons).each(function (k, elt) {
var selector = $(elt)
.parents()
.map(function () { return this.tagName; })
.get()
.reverse()
.concat([this.nodeName])
.join('>');
var id = $(elt).attr('id');
if (id) {
selector += '#' + id;
}
var classNames = $(elt).attr('class');
if (classNames) {
selector += '.' + $.trim(classNames).replace(/\s/gi, '.');
}
css += selector + ':before { color: ' + $(elt).css('color') + ' !important; }';
});
$('head').append('<style id="print-icons-style">' + css + '</style>');
}
function resetIconColors() {
$('#print-icons-style').remove();
}
А потім змініть window.print
функцію, щоб вона встановила стилі перед друком та скидання їх після.
window._originalPrint = window.print;
window.print = function() {
setColors('body *');
setIconColors('body .fa');
window._originalPrint();
setTimeout(function () {
resetColors('body *');
resetIconColors();
}, 100);
}
Частина, яка знаходить шляхи значків для створення CSS для: before elements - це копія з цього відповіді SO