адрес блогаJSON в 1993 году.GitHub.IO/2018/06/win…
github добро пожаловать начать следить
В последнее время возникла необходимость в печати страниц, воспользуйтесь этой возможностью, чтобы компенсировать относительно непопулярное знание печати в браузере. В этой статье рассматриваются только браузеры Chrome, Safari и Firefox.
интерфейс печати
Прежде всего, браузерная печать — это очень зрелое приложение~ По крайней мере, оно применяется уже давно, так что проблем с совместимостью не будет.
Самый простой способ печати — позвонить напрямуюwindow.print()
, конечно сdocument.execCommand('print')
Такого же эффекта можно добиться.
В настоящее время как в Safari, так и в Chrome открывается окно предварительного просмотра.FireFox не имеет предварительного просмотра, но позволяет напрямую выбрать принтер.В OSx вы можете предварительно просмотреть PDF-файл путем предварительного просмотра~
Как правило, этот метод вызова печати непосредственно на веб-странице не может удовлетворить потребности нашего бизнеса, например:
- Отрегулируйте макет и размер шрифта, чтобы они соответствовали бумаге формата A4.
- Используйте разные стили при печати
- Используйте изображения с более высоким разрешением для печати
- Что-то не относящееся к делу не появляется в печати бла-бла-бла
Так как же мы можем улучшить взаимодействие с пользователем при печати?
Использование таблицы стилей печати
Мы можем добавить media="print" к ссылке, чтобы указать, что это таблица стилей, которую будет применять принтер, например:
<link href="/example.css" media="print" rel="stylesheet" />
При такой печати таблица стилей будет применена к документу по умолчанию.
Используйте медиа-запросы
Совместимость: поддерживаются IE9+ и другие основные браузеры. Когда стилей для модификации не так много, то вообще не нужно переписывать таблицу стилей, достаточно написать медиа-запрос для достижения того же эффекта, например:
h1 {
font-size: 14px;
}
@media print {
h1 {
font-size: 20px;
}
}
прослушиватель событий
beforeprint && afterprint
Есть два события, которые могут прослушивать событие печати, одноbeforeprint
,одинafterprint
Печатное событие запускается до и после.
Это событие было поддержано в IE6, но это не удивительно ~ В конце концов, IE поддерживает множество интерфейсных вызовов, прежде чем я сделал IE, чтобы открыть потребности Excel ~
Совместимость, вероятно, Firefox, полная поддержка IE, поддержка Chrome63 +, Safari не поддерживается, это половина половины.
window.addEventListener('beforeprint', ()=> {
document.body.innerHTML = '正在打印...';
});
window.addEventListener('afterprint', ()=> {
document.body.innerHTML = '打印完成...';
});
window.matchMedia тестовый интерфейс медиа-запроса
Если вы хотите быть совместимым с Safari, попробуйтеwindow.matchMedia
Совместимость IE10+, другие популярные браузеры работают нормально.
Использование этого немного отличается, сначала создайте объект MediaQueryList, а затем прослушивайте изменения через него, например:
const printMedia = window.matchMedia('print');
function printChange({ matches, }) {
document.body.innerHTML = matches? '正在打印...': '打印完成/取消';
}
printMedia.addListener(printChange);
Более персонализированная настройка области печати/содержимого печати
Если в проекте используется jq и т.д., или если вы хотите просто и грубо напечатать какую-то область, вам не нужно переписывать таблицу стилей или что-то в этом роде. Самый глупый способ - использовать плагин jq напрямую.jQuery.print
Вы также можете написать его самостоятельно, чтобы справиться с этим.Общая идея состоит в том, чтобы создать iframe, добавить dom и таблицу стилей для печати, а затем вызвать событие печати iframe. Напиши сюда простоdemo
function printPartial(dom, { title= document.title,}= {}) {
if (!dom) return;
let copyDom = document.createElement('span');
const styleDom = document.querySelectorAll('style, link, meta');
const titleDom = document.createElement('title');
titleDom.innerText = title;
copyDom.appendChild(titleDom);
Array.from(styleDom).forEach(item=> {
copyDom.appendChild(item.cloneNode(true));
});
copyDom.appendChild(dom.cloneNode(true));
const htmlTemp = copyDom.innerHTML;
copyDom = null;
const iframeDom = document.createElement('iframe');
const attrObj = {
height: 0,
width: 0,
border: 0,
wmode: 'Opaque'
};
const styleObj = {
position: 'absolute',
top: '-999px',
left: '-999px',
};
Object.entries(attrObj).forEach(([key, value])=> iframeDom.setAttribute(key, value));
Object.entries(styleObj).forEach(([key, value])=> iframeDom.style[key] = value);
document.body.insertBefore(iframeDom, document.body.children[0]);
const iframeWin = iframeDom.contentWindow;
const iframeDocs = iframeWin.document;
iframeDocs.write(`<!doctype html>`);
iframeDocs.write(htmlTemp);
iframeWin.focus();
iframeWin.print();
document.body.removeChild(iframeDom);
}
printPartial(document.querySelector('#description'));
Несколько последних замечаний
- Печать напечатает все видимые элементы под документом, в том числе
<header>
внутри - Фон не будет напечатан, включая цвет фона, фоновое изображение и т. д.
- Если изображение загружается лениво, требуется специальная обработка, иначе при печати оно будет пустым.
Ссылаться на: