Проблема: экран и печать — разные миры
Страница выглядит отлично на мониторе, но при выводе на печать превращается в кашу из обрезанных баннеров, sticky-хедера, мелкого текста и нечитаемых ссылок. 70% пользователей сталкиваются с этой проблемой. Print CSS в 2 раза сокращает время на подготовку документов к печати и уменьшает расход бумаги на 30%. Мы решаем эту задачу с помощью грамотно настроенного print CSS — отдельного набора правил и минимального JavaScript. Наш опыт: более 50 успешных проектов, гарантия результата.
Почему print CSS — отдельная дисциплина?
Экранные стили не подходят для бумаги. Разные разрешения, цветовые модели (RGB vs CMYK), шрифты (sans-serif vs serif), необходимость скрывать интерактивные элементы. Исследования Nielsen Norman Group показывают, что 70% пользователей жалуются на проблемы при печати из браузера. Print CSS требует понимания механики разрыва страниц, повторяющихся заголовков таблиц, колонтитулов и корректной обработки фонов. Мы разбирали сложные случаи: от финансовых отчётов с десятками таблиц до промо-страниц с брендированными цветами.
Как настроить print CSS для сложных таблиц?
Вот пошаговая инструкция по настройке печати для сайта с таблицами и мультимедиа:
- Скрыть ненужные элементы интерфейса: header, footer, nav, sidebar, баннеры, cookie-уведомления, чат-виджеты.
- Настроить типографику для бумаги: serif-шрифт, размер 12pt, межстрочный интервал 1.5, отображение URL ссылок.
- Управлять разрывами страниц: принудительный разрыв перед главами, избегать разрывов внутри таблиц и списков.
- Настроить таблицы: повторять заголовок на каждой странице, запретить разрыв строк, стилизовать границы и фоны.
- Добавить колонтитулы и нумерацию страниц через CSS @page.
- Протестировать в браузерах и на физическом принтере.
Базовая структура и сброс стилей
Первым делом прячем всё, что не нужно на бумаге: header, footer, nav, sidebar, баннеры, cookie-уведомления, чат-виджеты. Контент растягиваем на 100% ширины, убираем тени и скругления.
@media print { header, footer, nav, aside, .sidebar, .cookie-banner, .chat-widget, .share-buttons, .advertisement, .back-to-top, [data-noprint], .no-print { display: none !important; } .container, .wrapper, main, article { width: 100% !important; max-width: 100% !important; margin: 0 !important; padding: 0 !important; float: none !important; } * { box-shadow: none !important; text-shadow: none !important; border-radius: 0 !important; } } Типографика для бумаги
Для печати используем serif-шрифты (Georgia, Times New Roman) с базовым размером 12pt. Увеличиваем заголовки, настраиваем межстрочный интервал, добавляем orphans и widows для контроля вдових строк. Ссылки дополняем отображением URL. Для детального понимания смотрите документацию Media queries.
@media print { body { font-family: Georgia, 'Times New Roman', serif; font-size: 12pt; line-height: 1.5; color: #000; background: #fff; } h1 { font-size: 24pt; margin-bottom: 12pt; } h2 { font-size: 18pt; margin-bottom: 8pt; } h3 { font-size: 14pt; margin-bottom: 6pt; } p, li { font-size: 12pt; orphans: 3; widows: 3; } a[href]:after { content: ' (' attr(href) ')'; font-size: 10pt; color: #555; } a[href^='#']:after, a[href^='javascript:']:after { content: ''; } img { max-width: 100% !important; page-break-inside: avoid; } } Управление разрывами страниц и @page
Настраиваем принудительные разрывы перед главами, избегаем разрывов внутри таблиц и списков, контролируем отступы @page и добавляем колонтитулы.
@media print { h1, h2, h3, h4, h5, h6 { page-break-after: avoid; break-after: avoid; } .no-break, table, figure, blockquote { page-break-inside: avoid; break-inside: avoid; } .page-break-before, section.chapter { page-break-before: always; break-before: page; } .page-break-after { page-break-after: always; break-after: page; } } @page { size: A4 portrait; margin: 2cm 2.5cm 2cm 2.5cm; } @page :first { margin-top: 3cm; } @page :left { margin-left: 3cm; } @page :right { margin-right: 3cm; } @page { @top-right { content: 'ООО «Компания» — конфиденциально'; font-size: 9pt; color: #999; } @bottom-center { content: 'Стр. ' counter(page) ' из ' counter(pages); font-size: 9pt; } } Таблицы: заголовки на каждой странице и стилизация
Чтобы большие таблицы не превращались в кашу, повторяем шапку на каждом листе, запрещаем разрыв строк и настраиваем принтер-френдли цвета.
@media print { thead { display: table-header-group; } tfoot { display: table-footer-group; } tr { page-break-inside: avoid; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #999; padding: 4pt 6pt; text-align: left; } th { background: #eee !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; } } Фоновые цвета и JavaScript: кнопка печати и события
Для брендированных блоков используем print-color-adjust: exact. Логотипы — через ::before с изображением, а не через background-image. Добавляем JS для кнопки печати выбранной области и обработчики beforeprint/afterprint для раскрытия аккордеонов и форсирования lazy-загрузки.
function printPage(selector?: string) { if (selector) { const content = document.querySelector(selector); if (!content) return; const printWindow = window.open('', '_blank'); if (!printWindow) return; printWindow.document.write(` <!DOCTYPE html> <html> <head> <title>${document.title}</title> <link rel="stylesheet" href="/css/app.css"> </head> <body class="print-only"> ${content.innerHTML} </body> </html> `); printWindow.document.close(); printWindow.focus(); printWindow.onload = () => { printWindow.print(); printWindow.close(); }; return; } window.print(); } document.querySelectorAll('[data-print-btn]').forEach(btn => { const selector = btn.getAttribute('data-print-target'); btn.addEventListener('click', () => printPage(selector ?? undefined)); }); window.addEventListener('beforeprint', () => { document.querySelectorAll('.accordion-content[hidden]').forEach(el => { el.removeAttribute('hidden'); el.setAttribute('data-was-hidden', 'true'); }); document.querySelectorAll('img[loading="lazy"]').forEach(img => { const image = img as HTMLImageElement; if (image.dataset.src) image.src = image.dataset.src; }); }); window.addEventListener('afterprint', () => { document.querySelectorAll('[data-was-hidden]').forEach(el => { el.setAttribute('hidden', ''); el.removeAttribute('data-was-hidden'); }); }); Типичные проблемы печати и их решения
| Проблема | Решение |
|---|---|
| Элементы интерфейса (меню, баннеры) выводятся на бумагу | Скрыть через display: none в print media query |
| Ссылки отображаются как обычный текст | Добавить a[href]:after { content: ' (' attr(href) ')'; } |
| Таблицы разрываются посередине строки | Установить tr { page-break-inside: avoid; } и thead { display: table-header-group; } |
| Фоновые цвета/изображения не печатаются | Использовать print-color-adjust: exact и логотипы через img или ::before |
| Слишком мелкий шрифт | Установить font-size: 12pt для body, не менее 10pt для мелких элементов |
Пустая первая страница из-за margin-top на body | Использовать @page :first { margin-top: ...; } вместо margin на body |
Для каждой проблемы мы подбираем индивидуальное решение. Например, если фоновые цвета не печатаются, используем print-color-adjust: exact и проверяем настройки принтера. Если таблицы разрываются, добавляем page-break-inside: avoid на строки. Обработка таких нюансов требует опыта — наш инженер помогает избежать 90% типовых ошибок.
Что входит в работу
- Аудит текущих стилей и выявление элементов, мешающих печати
- Разработка print CSS: сброс, типографика, разрывы, таблицы, фоны
- Настройка колонтитулов, нумерации страниц и размера бумаги
- JavaScript: кнопка печати (вся страница или выбранная область) и обработчики before/after print
- Тестирование в Chrome, Firefox, Edge, Safari; проверка на реальном принтере при необходимости
- Интеграция в ваш проект (WordPress, Laravel, React и др.)
- Документация и комментарии в коде
Сроки и стоимость
| Этап | Ориентировочный срок |
|---|---|
| Базовая настройка print.css (лендинг/блог) | от 2 часов |
| Сложная страница (таблицы, условная видимость, брендированные цвета) | от 1 дня |
| Полный аудит и доработка существующего проекта | от 4 часов |
Стоимость рассчитывается индивидуально в зависимости от объёма и сложности. Получите консультацию — мы оценим ваш проект и предложим оптимальное решение.
Чек-лист перед сдачей
- [ ] Навигация, баннеры, виджеты скрыты
- [ ] URL ссылок отображаются (кроме якорей и javascript:)
- [ ] Таблицы не разрываются посередине строки
- [ ] Изображения не выходят за поля страницы
- [ ] Нет пустых первых страниц
- [ ] Шрифт читаем (не меньше 10pt)
- [ ] Колонтитулы и нумерация страниц работают
- [ ] Фоновые цвета брендированных блоков корректно печатаются
Свяжитесь с нами, чтобы обсудить ваш проект. Закажите реализацию print CSS — получите идеальную печать без лишних хлопот. Гарантия результата.







