Распечатай мне курсач. На CSS

Никита Дубко, iTechArt Group

Распечатай мне курсач.
На CSS


Никита Дубко

Printer
Michał Kulesza
Никита Дубко

Никита Дубко

iTechArt Group
MinskCSS MinskJS
HTML Academy
BSUIR

Белорусский
Государственный
Университет
Информатики и
Радиэлектроники

Когда вы в последний раз пробовали распечатать ваш сайт?

Твит Aaron Gustafson
Сайт Минского полумарафона
Портал Tut.by

— У вас не стоит точка в сноске.

— Да, но мое исследование совершит револ...

— У вас не стоит точка в сноске.

ГОСТ СТБ

Стандарты оформления

Cry Meme
Cry Meme
CSS3 Logo

Уже используют CSS
для печати

Как подключить стили для печати

/* CSS */
@import "print.css" print;

@media print { /* IE 9+ */
    body {
        background-color: #fff;
        color: #000;
    }
}

Как подключить стили для печати

<!-- HTML -->
<!-- IE 3+ -->
<link rel="stylesheet"
      media="print"
      href="print.css"
      type="text/css" />

Как вызвать печать

<!-- HTML -->
<button type="button"
        onclick="callPrint()">
    <i class="icon-print"></i> Вжух!
</button>

// JavaScript
function callPrint() {
    // ...
    window.print();
}

Спецификации

@page {
    margin: 20mm 15mm;
    size: A4 portrait; /* landscape */
    @bottom-right {
        content: counter(page);
    }
}

@page :left {
    margin-left: 3cm;
}
@page :right {
    margin-right: 3cm;
}
Can I Use Paged Media
@page :blank {
    @top-center {
        content: "Пустая страница";
    }
}
@page :first {
    @bottom-center {
        content: "Здесь могла быть ваша реклама";
    }
}
top-left-corner
top-left
top-center
top-right
top-right-corner
left-top
left-middle
left-bottom
Margin Boxes
right-top
right-middle
right-bottom
bottom-left-corner
bottom-left
bottom-center
bottom-right
bottom-right-corner

Абсолютные единицы измерения

1in всегда равен 96px

Пример оформления главы
body {
    counter-reset: chapternum figurenum;
}

h1.numered::before {
    counter-increment: chapternum;
    content: counter(chapternum) " ";
}
Пример оформления рисунка
h1 {
    counter-reset: figurenum;
}

figcaption::before {
    counter-increment: figurenum;
    content: counter(chapternum) "." counter(figurenum) " — ";
}
h1 {
    page-break-before: always;
}

.page-break {
    page-break-after: always; /* auto | avoid | left | right */
}

figure {
    page-break-inside: avoid;
}
Can I Use page-break
p {
    widows: 2; /* new page */
    orphans: 2; /* old page */
}
Can I Use widows and orphans

Тетрагидропиранилциклопентилтетрагидропиридопиридиновые

p {
    word-break: break-all;
    hyphens: auto; /* manual | none */
}
&shy;
Can I Use Hyphentaion
Пример заголовка разворота
h1 {
    string-set: heading content();
}

@page :right {
    @top-right {
        content: string(heading);
    }
}
Пример сноски
Сноска<span class="footnote">Примечание (замечание), помещаемое
внизу полосы (постраничная сноска) или в конце текста
(концевая сноска).</span>
@page {
    @footnote {
        border-top: 1pt solid black;
    }
}
.footnote {
    float: footnote;
    counter-increment: footnote;
}
.footnote::footnote-call {
    content: counter(footnote);
    font-size: 9pt;
    vertical-align: super;
}
.footnote::footnote-marker { font-weight: bold; }
<!-- HTML -->
<a class="xref" href="#chapter-1" title="Глава 1">Глава 1</a>

/* CSS */
a.xref::after {
    content: " (страница " target-counter(attr(href url), page) ")";
}
Пример содержания
ul.toc a::after {
    content: leader('.') target-counter(attr(href url), page);
}

mefody/print-css

Как применить к сайту?

Как сделать сайт печатаемым?

Как сделать сайт печатаемым?

  1. Используйте семантическую верстку
  2. Проставьте размеры для всех изображений и svg
Твит Aaron Gustafson

Как сделать сайт печатаемым?

  1. Используйте семантическую верстку
  2. Проставьте размеры для всех изображений и svg
  3. Уберите @media screen
html5-boilerplate
*,
*::before,
*::after {
    background: transparent !important;
    color: #000 !important;
    /* Black prints faster: http://www.sanbeiji.com/archives/953 */
    box-shadow: none !important;
    text-shadow: none !important;
}
a { text-decoration: underline; }

a[href^="http"]:not([href*="mysite.com"])::after {
    content: " (" attr(href) ")";
}

a[href^="#"]::after,
a[href^="javascript:"]::after {
    content: "";
}

img { max-width: 100% !important; }
* {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
}
Can I Use print-color-adjust

Распечатай Яндекс.Карты — Вадим Макишвили

display: none;

Портал Tut.by

position: fixed

Страница 1 Страница 2
function beforePrint() { /* add print styles */ }
function afterPrint() { /* remove print styles */ }

window.onbeforeprint = beforePrint; // IE5+
window.onafterprint = afterPrint;

if (window.matchMedia) { // IE10+
    window
        .matchMedia('print')
        .addListener(function(mq) {
            mq.matches ? beforePrint() : afterPrint();
        });
}

Как тестировать?

Chrome Developer Tools

Chrome. Шаг 1

Chrome Developer Tools

Chrome. Шаг 2

Prince

const prince = require('prince');
const options = {};
prince(options)
    .inputs('page.html')
    .output('page.pdf')
    .execute()
    .then(function () {
        console.log('OK: Done');
    }, function (error) {
        console.log('ERROR: ', util.inspect(error));
    });

Puppeteer

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(
        'https://news.ycombinator.com',
        { waitUntil: 'networkidle2' }
    );
    await page.pdf({ path: 'hn.pdf', format: 'A4' });
    await browser.close();
})();

Готовые решения для сайтов

Материалы

Видео

Спасибо за внимание!

mefody.github.io/talks/print-with-css/
@dark_mefody
n.a.dubko@gmail.com

QR code — ссылка на презентацию