версия для печати

Добавлено 08.09.2007 | CSS

ОНИ ВАМ УЖЕ ВСТРЕЧАЛИСЬ: ссылки, говорящие "версия для печати" или что-то подобное. Всякий раз, щелкая по этим ссылкам, вы получаете особый документ, содержащий всё ту же информацию, но с другим расположением элементов и, возможно, другой разметкой.

Это значит, что кто-то вручную или автоматически с помощью скрипта взял исходный документ и, сняв с него всё лишнее, создал его копию, более удобную для печати. Может быть подобной работой приходилось заниматься и вам.

Решение - таблицы стилей для печати

Одной из замечательных особенностей CSS является возможность создания таблиц стилей, ориентированных на разнообразные устройства вывода. Мы привыкли создавать таблицы стилей для отображения страниц на экране, но мы еще не привыкли думать о других средствах отображения. И, как подтверждают ссылки "версия для печати", о печати документа мы думаем лишь как о представлении документа в другом виде.

Но теперь нам нечего бояться, теперь для создания печатной версии документа нам нужен всего лишь хорошо структурированный документ и таблица стилей для печати!

Сегодня вы можете взять любой (X)HTML-документ и подготовить его к печати с помощью стилевой таблиц, не прикасаясь к разметке. И вот в прошлое уходят проблемы с созданием и синхронизацией двух версий документа - одной для экрана, другой - для печати. И что самое приятное: сделать это проще простого. (Более подробную информацию об основных принципах создания media-ориентированных таблиц стилей можно прочитать в статье "" на сайте meyerweb.com.).

Давайте посмотрим, как сайт "A List Apart" обрёл таблицу стилей для печати, умело обойдя ошибки броузеров, и в конце концов улучшил внешний вид распечатки страницы.

Обходим ошибку с плавающими элементами

Как можно прочитать на странице "" на сайте "A List Apart" или на странице , броузеры семейства Gecko, такие как Netscape 6.x или Mozilla, имеют проблему с печатью длинных "плавающих" блоков (long floated elements). Если плавающий элемент вышел за пределы печатной страницы, то оставшаяся часть полностью пропадает, так и не появившись на следующей странице.

Если ваш сайт похож на "A List Apart", т.е. статьи в нём заключаются в один большой плавающий блок, то это значит, что читатели при распечатке получат лишь первую страницу статьи.

Решение, как и следовало ожидать, заключается в отмене свойства "плавающий" у блока с текстом перед печатью. Если вкратце, для всех плавающих элементов устанавливается стилевое правило "float: none". Сделав это, вы вернёте все плавающие элементы к обычному виду, и документ будет напечатан так, как и предполагалось - страница за страницей вплоть до самого конца.

Итак, именно это я и предложил сделать Зельдману для ALA, и, как только он это сделал, проблема с печатью исчезла. У броузеров семейства Gecko эта ошибка по-прежнему не исправлена (на момент написания статьи), но всё же её можно легко обойти предложенным выше способом.

В путь

Ниже представлена "печатная" таблица стилей, с помощью которой "A List Apart" решил проблему печати плавающих элементов:

#menu {
display: none;
}

#wrapper, #content {
width: auto;
border: 0;
margin: 0 5%;
padding: 0;
float: none !important;
}

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

Проблема, как мне виделось, заключалась в том, что слишком много стилей, разработанных для экрана, попадали в печатный процесс.

Если посмотреть на содержимое тега <head> новых статей на сайте ALA, мы обнаружим (в гуще начинки) следующие строки:

<style type="text/css" media="all">
@import "nucss2.css";
</style>

<link rel="stylesheet"
type="text/css"
media="print" href="print.css" />

У нас есть файл таблицы стилей, print.css, применение которого для печатных устройств "print" было оговорено значением атрибута "media". Файл таблицы стилей nucss2.css, который импортируется с помощью конструкции @import дабы скрыть его от Navigator 4.x, будет использован при отображении страницы на любом устройстве вывода (атрибут media="all"). Это может быть дисплей, принтер, проектор, синтезатор речи и так далее. Разойдясь, мы могли бы записать в таблицу стилей для печати директивы для фонового цвета страницы и указать шрифты в пикселях.

Будет ли это великой бедой? Нет, но большинство броузеров по умолчанию не печатают фон страницы, а указанные в пикселях размеры шрифтов, столь подходящие для экранного отображения, не так уж и полезны при печати.

Поэтому давайте немного улучшим нашу таблицу стилей для печати и решим несколько других проблем с расположением ее компонентов.

Отбеливание фонов

Для элементов бокового правого меню используются множество цветов. Но так как мы спрятали меню при печати, нам ничего не придется менять. Это сразу избавляет нас от возможной головной боли.

Так как принтеры не печатают белым цветом, сделаем фон страницы белым. Также нужно удалить все фоновые изображения, которые использовались при выводе страницы на экран.

Если мы призовем на помощь свойство background, мы одним махом решим обе проблемы. Чтобы сделать решение более гибким, зададим для элемента "body" белый фон, а элементы "wrapper" и "content" пусть имеют прозрачный фон (и тем самым через них будет проступать белый цвет "body"):

body {
background: white;
}

#menu {
display: none;
}

#wrapper, #content {
width: auto;
margin: 0 5%;
padding: 0;
border: 0;
float: none !important;
color: black;
background: transparent;
}

Задание цвета переднего плана (цвет шрифта) не было абсолютно необходимым, но лучше не забывать об этом. Итак, сейчас у нас есть два "неплавающих" элемента (#wrapper, #content) с прозрачным фоном, и страница - с белым фоном.

Вас может взволновать то, как Navigator 4.x обходится со значением "transparent", но выше нос: NN4.x обращает внимание лишь на таблицы стилей, у которых атрибут "media" имеет значение "screen". Так же как и в случае с директивой @import, наши таблицы стилей для печати всегда сокрыты от подслеповатых глаз Navigator 4. Так что, здесь не о чём беспокоиться.

Размер шрифта для печати

Общая таблица стилей задаёт размер шрифта равный 11 пикселям. Весьма неудачный выбор при печати. Само семейство шрифтов - сначала Georgia , а потом serif - отлично подходит для печати, так как шрифты с засечками обычно лучше выглядят на бумаге. Необходимо изменить лишь размер шрифта. Вот так:

body {
background: white;
font-size: 12pt;
}

"Постойте!", - вероятно, воскликнете вы. - ""

Что ж, да, так он и сказал, и был полностью прав - для экрана нельзя задавать размеры шрифта в пунктах. При печати же применение пунктов имеет такой же смысл, как и многие десятилетия назад. Раз уж мы готовим таблицу стилей для печати, то определить размера шрифта для "body" в 12 пунктов будет правильным и естественным.

Вы, конечно, можете задать любой размер, какой пожелаете, однако шрифт в 12 пунктов наиболее употребителен. И так как в общей таблице стилей размеры всех остальных элементов страницы даны относительно размера в элементе "body", наша работа закончена.

Marginalia

Существующие стилевые правила задают для левых и правых границ (margins) элементов wrap и content размер в 5%. Это значит, что с обеих сторон статьи будет "пустое место", и каждое такое "пустое место" будет составлять 10% ширины области печати. Это следствие того, что блок с текстом статьи "content" лежит внутри обрамляющего блока "wrapper", и каждый их них имеет поля по 5% с левой и правой сторон.

Исходная общая таблица стилей задаёт 15%-ный правый отступ (padding) для блока "content". Границы уже дали нам 10%, так что нам надо добавить ещё 5%. Это достаточно просто сделать:

div#content {
margin-left: 10%;
}

В другом варианте решения можно бы быть оставить границы (margin) в покое и добавить 5% к левому отступу (padding). Так как блок "content" не имеет видимого фона, мы получили бы такой же результат.

К сожалению, некоторые броузеры имеют проблемы с адекватной обработкой отступов (padding), так что перемещать элементы по странице лучше с помощью границ (margin).

Ссылки при печати

Был один хитрый вопрос - что же делать с гиперссылками? Очевидно, на печати они не могут быть столь полезны, как на мониторе, но часто важно дать ключ к тому, на что же они ссылались в оригинале. Итак, вот что я изобрёл:

a:link, a:visited {
color: #520;
background: transparent;
font-weight: bold;
text-decoration: underline;
}

Это задаёт ссылкам цвет, достаточно тёмный, чтобы быть близким к чёрному при черно-белой печати, оставаясь в тоже время тёмно-красным при цветной печати. Жирный шрифт и подчеркивание гарантируют, что ссылка будет выделяться в распечатанном тексте.

В броузере, полностью поддерживающем спецификацию CSS2, мы можем вывести URL-ы ссылок после них самих, тем самым делая услугу тем, у кого окажется распечатка и броузер под рукой. Ниже показано правило, которое применяется только для блока "content", и таким образом URL-ы других ссылок не выводятся на печать:

#content a:link:after, #content a:visited:after {
content: " (" attr(href) ") ";
font-size: 90%;
}

Попробуйте это в броузерах на платформе Gecko - Mozilla или Netscape 6.x. На распечатке после каждой ссылки вы увидите в скобках относящийся к ней URL.

В броузерах, не понимающих это стилевое правило, не будет никаких нежелательных эффектов - ссылки все так же будут темно-красными, подчёркнутыми и жирными. Просто после текста ссылок не будет выводиться относящегося к ним URL, вот и всё.

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

С этим новым правилом есть одна эстетическая проблема. Дело в том, что оно предписывает дословно вставлять в документ значение атрибута href.

Заглянув в код любой страницы с сайта "A List Apart", мы быстро заметим там множество так называемых "относительных ссылок" вида "/issues/144". Они будут вставлены в документ в таком виде, в каком они есть, а хотелось бы что это были полные URL-ы.

В подобных случаях нам может помочь CSS3. Любой селектор атрибута, использующий оператор ^=, выбирает элементы, основанные на начале их значений атрибута. Таким образом, мы можем выбрать любой атрибут href , начиняющийся символом слэша, и вставить туда текст, заменяющий существующее значение атрибута.

#content a[href^="/"]:after {
content: " (http://www.alistapart.com" attr(href) ") ";
}

Это правило преобразует все значения типа "/issues/144/", в "http://www.alistapart.com/issues/144/". Это правило не сможет помочь в случае с относительными URL, которые не начинаются со слэша, но, к счастью, ALA не использует этот тип ссылок.

ВНИМАНИЕ! ВАЖНО! Как было сказано, селектор вида ^= относится к селекторам спецификации CSS3. Валидатор для CSS от консорциума W3 может тестировать лишь на соответствие спецификациям CSS1 и CSS2. Не понимая селектор, относящийся к CSS3, валидатор будет сообщать об ошибке даже в том случае, когда селектор не противоречит рекомендациям спецификации.

Украшаем начало страницы

Просматривая еще раз окончательный вариант стилевой таблицы, я обнаружил, что мне не очень нравится "шапка" страницы. Дело скорей было не в самой шапке, а в самом "подчеркивании" названия сайта. Это подчеркивание разумеется заканчивалось там, где заканчивалась картинка заголовка. Мне вдруг пришло в голову, что было бы неплохо растянуть эту линию подчеркивания на всю ширину страницы.

Первым шагом я создал для блока content верхнюю границу с тем же стилем, что и подчеркивание в картинке: темно-красной линии толщиной в один пиксель. Раз уж я собрался делать видимую верхнюю границу, то было бы неплохо вставить некоторый отступ между границей и текстом.

div#content {
margin-left: 10%;
padding-top: 1em;
border-top: 1px solid #930;
}

Таким образом, будет просто нарисована линия чуть ниже рисунка заголовка статьи. Картинка заголовка сама размещена в <div> элементе, поэтому воспользуемся нижней границей этого элемента, чтобы подтянуть вверх на себя остальные элементы страницы.

div#mast {
margin-bottom: -8px;
}

div#mast img {
vertical-align: bottom;
}

Благодаря этим простым правилам верхняя граница элемента "content" выравнивается с линией подчеркивания в картинке. Эта граница по сути выводится поверх картинки, но так как цвета совпадают, их трудно (и даже невозможно) отличить друг от друга. Даже если броузер по какой-то причине решит расположить картинку поверх границы блока content, иллюзия сохранится.

Второе правило (со свойством "vertical-align") показывает, как обойти одну интересную особенность броузера Mozilla, которая видна лишь тогда, когда документ представлен в режиме соответствия стандартам, то есть так, как все статьи с сайта "A List Apart". За дополнительной информацией об этой особенности обратитесь к или к работам по схожей тематике (включая используемую выше). [Также загляните в статью из 137 выпуска ALA ""]

Что касается цвета фона для рисунка заголовка, то тут нет никакой возможности сделать его прозрачным. Ну разве что непосредственно задать прозрачный пиксель в самом изображении. Можно было бы подобрать такой же цвет для фона всего блока заголовка, но это было бы пожалуй уж слишком для столь светлого цвета.

Что ещё?

Вот и всё, что мы сделали для ре-дизайна, но это вовсе не все, что можно было бы сделать.

Например, можно поиграться с цветами, чтобы они лучше выглядели при печати, так же можно подправить поля текста, используя пункты (или пики, или даже дюймы) вместо процентов. В мире печати для дизайна столько же простора, как и на экране монитора.

Ещё одна область, которую мы не рассмотрели достаточно глубоко, - изменение размеров шрифта. Множество классов (например, "superfine"), используют заданные в общей таблице стилей пиксельные размеры шрифтов. Поменять их размеры для печати также просто, как мы сделали это для тела <body> документа: просто напишите правило для элемента и задайте новое значение для свойства font-size .

К примеру, мы можем написать .superfine {font-size: 9pt;}... или любое другое подходящее значение. Имеются другие элементы, подобно нижним колонтитулам или тэгу <pre>, которые могут выиграть от подобной работы, и они вполне могут появиться в будущих версиях таблицы стилей сайта "A List Apart".

Конечный результат

Перед вами окончательный вариант таблицы стилей для печатной версии после того, как в него были внесены все изменения:

body {
background: white;
font-size: 12pt;
}
#menu {
display: none;
}
#wrapper, #content {
width: auto;
margin: 0 5%;
padding: 0;
border: 0;
float: none !important;
color: black;
background: transparent none;
}
div#content {
margin-left: 10%;
padding-top: 1em;
border-top: 1px solid #930;
}
div#mast {
margin-bottom: -8px;
}
div#mast img {
vertical-align: bottom;
}
a:link, a:visited {
color: #520;
background: transparent;
font-weight: bold;
text-decoration: underline;
}
#content a:link:after, #content a:visited:after {
content: " (" attr(href) ") ";
font-size: 90%;
}
#content a[href^="/"]:after {
content: " (http://www.alistapart.com" attr(href) ") ";
}

Несмотря на простоту и (в некоторых случаях) сыроватость данной таблицы стилей, эффект от ее использования должен быть очевидным для любого, кто сравнит распечатку страницы с той же страницей, отображенной на экране. Подобные полезные и эффектные изменения возможны почти для любого дизайна, от простого до возвышенного, а эти media-ориентированные стили избавляют авторов от создания отдельной страницы с печатной версией документа.