Подписано в печать: версии страниц
Если вы видите на странице ссылку «Версия для печати», радуйтесь. Это значит, что создатели сайта знают, что сайт нужен не для дизайнера и не для заказчика, а для посетителя. Потому что версия страницы для распечатки на принтере нужна исключительно посетителю.
Большинство современных браузеров в меню «Файл» предлагают возможность просмотра того вида страницы, который получится при печати на принтере. На экране верстка документа может быть удивительно красивой, но при печати она способна значительно исказиться.
Во-первых, начисто исчезает фон. Вся графика, используемая в качестве фона, игнорируется; вместо сиреневого, зеленого, черного, серого и любого другого цвета фона в печатной версии будет белый, и только белый. Представьте, что в этом случае получится при печати, если цвет текста был белый, желтый, светло-серый или, допустим, #ЕЕЕЕСС.
Во-вторых, если верстка фиксированная либо тянущаяся, но совокупная ширина элементов слишком большая, при печати часть элементов, что располагаются справа, просто уйдут за границу листа и не будут напечатаны.
В-третьих, из-за изменения ширины «холста» (экран по определению шире, чем лист формата А4, на котором обычно производится печать) верстка может «поехать»: иногда образуются паразитные пробелы между изображениями, едут строки (особенно при «резиновой» верстке) и т. п.
Человечество, трудящееся на ниве веб-разработок, со временем нашло несколько решений это проблемы.
Первое решение, было, как водится, в лоб, а точнее, вручную: для всех или наиболее важных страниц сайта, если они некорректно выглядели в распечатке, делались версии с минимумом декоративных и посторонних элементов: только содержание, актуальное именно для главной страницы, желательно с атрибутами сайта (чтобы потом, взяв распечатку в руки, можно было вспомнить, с какой страницы они сделаны).
Но лень — двигатель прогресса. Почему бы процесс создания версий для печати не автоматизировать, поручив это серверу? Тут доступны два основных подхода.
Если вид страницы генерируется автоматически, а содержимое берется из отдельного файла или из базы данных, то проблем вообще возникнуть не может: создается страница, в которой сценарий, аналогичный основному, включает информацию с минимальным оформлением, без навигационного меню и прочей информации, которая на бумаге стала бы излишней. Хорошо бы в этом случае превращать ссылки в реальные адреса (или делать так, чтобы после ссылки в скобках отображался адрес этой ссылки), чтобы польза от печатной версии страницы еще больше возросла. Правда, редкий пользователь набирает URL от руки, особенно если он содержит не только имя домена. Страница обычно создается не с жесткой версткой, а с тянущейся, чтобы не возникало проблем с полями, размером шрифта и т. п.
Если же страница статическая, то функции серверного сценария сводятся к тому, чтобы удалить лишнее содержимое: меню, посто-
Подписано в печать: версии страниц |
3.6 |
Ронние ссылки, элементы оформления. Такой подход более трудоемкий, потому что страницы, сверстанные вручную, часто содержат уникальные элементы, и сценарию, генерирующему печатные версии, приходится учитывать все такие случаи: нагрузка на сервер и программиста. В качестве примера рассмотрим две страницы с одним и тем же содержанием: одна ориентирована на просмотр на экране, а вторая на бумаге. (Следует отметить, что приведен сайт, в котором печатная версия генерируется по первому из указанных принципов.) В первом случае посетитель получает доступ ко всем возможностям работы с сайтом: на странице представлены не только сама статья и ее атрибутизация (указание номера, название газеты, рубрика, автор), но и ссылки на остальные разделы сайта. Страница представлена в том дизайне, в котором выполнены и остальные страницы сайта. Во втором случае остаются только статья и атрибутизация, причем добавляется прямая ссылка на документ, чтобы была возможность найти его впоследствии. Нужно сказать, что и в первом случае страница будет распечатана корректно, без обрезки, поскольку верстка тянущаяся, но, во-первых, напечатается много ненужной информации, а во-вторых, колонка текста будет достаточно узкой, что неэкономно. Во втором же случае страница будет распечатана на любом формате бумаги без проблем: абзацы текста не ограничены никакими внешними блоками. Но посмотрим на это все с другой стороны. Захочет ли посетитель вообще открывать версию для печати? Ведь это лишний трафик — это особенно актуально для владельцев модемов и для тарифов с помегабай - тной оплатой. Ведь открывается та же самая страница, но выглядящая по-другому — стоит ли она открытия? Как правило, для разработчика создание версии для печати ничего не стоит (если она автоматизирована), а вот для посетителя сайта стоит в прямом смысле этого слова. Поэтому многие пользователи находят обходной путь: копируют нужный фрагмент страницы, открывают текстовый редактор и вставляют фрагмент туда, а уже их текстового редактора печатают. Но и с этим связаны определенные сложности. Если используется MS Word, а в качестве браузера MS Internet Explorer — естественно, под операционной системой MS Windows, — то вместе с текстом вставляется и его форматирование. А если нужный текст был заключен в таблицу, то копируются также рамки таблицы, вспомогательные элементы, «строительные» изображения и много других ненужных вещей, из-за чего результат получается далеко не таким, как ожидался. Если используется Блокнот, простейший текстовый редактор, то он не всегда в состоянии переварить большие тексты. А другими редакторами (EditPlus Text Editor и подобные) пользуются далеко не все. Получается, что проблему пользователя должен решить разработчик, причем путем наименьших потерь. |
Достаточно универсальным решением является использование CSS. Во-первых, лишняя нагрузка на сервер минимальна: дополнительные строчки CSS-разметки не могут существенно повлиять на работоспособность сервера. Во-вторых, кроме дополнительного кода (который кэшируется, то есть загружается один раз и после этого сохраняется во временной папке) посетителю ничего не нужно загружать: он может просто, находясь на странице, нажать Ctrl+P или «Файл > Печать», и на принтер будет выведена страница, на которой будет отсутствовать лишняя информация, а нужна информация не будет жестко фиксирована по ширине.
Как это работает?
При включении стилевых файлов чаще всего используется тэг
<link>:
<link rel="stylesheet" type="text/css" media="all" href="/styles. css" />
Обратите внимание на параметр media. Он сообщает браузеру, на какой тип вывода ориентирована данная таблица стилей. В настоящий момент браузеры понимают три значения этого атрибута: all, screen и print. Значение all используется, когда разработчику не принципиально, будет ли страница просматриваться на экране или распечатываться. Поскольку это значение является значением по умолчанию, его можно и не указывать, и веб-дизайнеры оставляют его для порядка. Два других атрибута более конкретны: если указать media="print", то стили, указанные в данной стилевой таблице, будут применяться к элементам только во время печати. На экране же будут информация из такого стилевого файла будет игнорироваться. Параметр media="screen" действует противоположным образом. Такой параметр допустим и для тэга <style>:
<style type="text/css" media="all">@import "http://zeldman. com/c/c09.css";</style>
Решение напрашивается само собой. Создаются три стилевых описания, причем неважно, в отдельных ли CSS-файлах или внутри самого HTML-документа (первый способ логичнее: файл можно включить во множество документов сразу, а кроме того, он кэшируется, то есть не загружается каждый раз при загрузке очередной страницы с сайта). Первое описание, снабженное атрибутом media="all", максимально подробно описывает все стили документа. Это описание является главным и универсальным. Далее включаются второе описание (для экрана) с параметром media="screen" и третье (для печатной версии) — оно снабжено атрибутом media="print". Эти два файла (или эти вклю-
Ченные описания) значительно короче: в них определяются стили для тех элементов страницы, которые на экране и на печати должны выглядеть по-разному. Например, в стилевом файле для печати для тех элементов, которые нужно скрыть, применяется свойство:
Display: none;
Эта строчка просто скроет блоки со страницы и позволит остальному содержимому занять главенствующее место:
<style type="text/css" media="print">
#menu { display:none;
}
</style>
В этом случае меню (как явствует из идентификатора блока) будет скрыто. Все остальные элементы будут располагаться, как на веб-странице: ведь для них в стилевом файле для печати не задано никаких параметров, а значит, в силе будут те, которые заданы в общем файле. Расположить указания на стилевые файлы можно так:
<link rel="stylesheet" type="text/css" media="all" href="/styles/main. css" />
<link rel="stylesheet" type="text/css" media="screen" href="/styles/screen. css" />
<link rel="stylesheet" type="text/css" media="print" href="/styles/print. css" />
В результате программист забудет о генерации печатной версии, а посетитель — о потере трафика и лишних действиях для загрузки печатной версии. Пиктограмма в виде принтера исчезнет с веб-страниц.
Несомненно, не все так радужно.
Если верстка основана на жестко позиционированных блоках, скрытие ряда элементов ничего не даст: остальные останутся на своих местах, а на странице при печати просто образуются пустоты. В этом случае в стилевом файле, предназначенном для печати, понадобятся новые значения для позиционирования блоков, чтобы сдвинуть их влево, если слева образуются пустоты, и чтобы «расфиксировать» верстку, если она жесткая (вместо пиксельных значений ширины блоков использовать процентные либо вообще не указывать ширину блоков явно, но в этом случае следить за перекрытием элементов — избегать того, чтобы одни случайно накладывались на другие и мешали чтению текста).
Отдельная проблема связана с таблицами и изображениями. Чаще всего это блоки, которые при всем желании не удается сделать тянущимися, поэтому в каждом конкретном случае приходится придумывать свое решение. Например, в версии для печати использовать миллиметровые указания на размер изображения: всем известно, что стандартная ширина листа бумаги в принтере — 210 миллиметров, а чтобы на всех принтерах без исключения печать происходила без обрезки полей, нужно вычесть еще по два сантиметра с каждой стороны. Получается, что максимальная ширина изображения — 17 см, и то, если изображение не включено в абзац, у которого может быть отступ.
С таблицами, особенно широкими, проблем намного больше. Если на веб-странице таблицу можно заключить в блок с горизонтальной полосой прокрутки или с помощью сценария на JavaScript скрывать и открывать часть столбцов, то на бумаге реализовать такое несколько затруднительно. Серверным способом можно разбивать таблицу на несколько частей, чтобы печатать их последовательно, либо сильно изменять форматирование, чтобы таблица по ширине вся помещалась на стандартный лист бумаги.
В результате манипуляций получается следующее. Добавлением нескольких строк кода мы указываем браузеру, как отображать страницу в двух разных ситуациях: при выводе на экран и при выводе на печать. В коде самой страницы не происходит никаких изменений, в CSS-разметке тоже, поскольку все файлы изначально загружены на компьютер посетителя сайта. Браузер же, располагая материалом, делает выводы.
Есть вариант, когда для экрана и для печати используются таблицы стилей, различающиеся между собой, как пылесос и стиральная машина. То есть, конечно, они служат общей цели, но с объектами делают абсолютно разные вещи. В таком случае достаточно двух стилевых файлов, каждый из которых выполняет только свою задачу. Рассмотрим небольшой пример. Перед нами три скриншота:
1. Основной вид страницы при загрузке:
Tamylo Cosmetics
|
Компания Татуїо была создана совершенно случайно после вечера работы в АсІоЬе РЬоІозЬор. После разработки первых эскизов инновационной косметики и косметической парфюмерии было принято решение вывести разработку на промышленные масштабы.
В июле 2007 г°Да инновационные тренды и концепция были утверждены советом директоров, созданным месяцем ранее. В качестве производителей были приглашены четрырнадцать французских компаний
2. Вид страницы при наведении курсора мыши на первый пункт меню (блок-ссылка приобретает другой вид, смещая остальные ссылки):
3. Вид страницы для распечатки на принтере:
Tamylo Cosmetics
|
Photoshop. После разработки первых эскизов инновационной косметики и косметической парфюмерии было принято решение вывести разработку на промышленные масштабы. |
Директоров, созданным месяцем ранее. В качестве производителей были приглашены
Страница (условно созданная специально в качестве примера) является примером того, как CSS может влиять на финальный вид сайта в браузере. Дело в том, что HTML-разметка тут минимальная:
<html>
<head>
<title>Tamylo Cosmetics</title>
<meta http-equiv="Content-Type" content="text/ html; charset=windows-1251">
<meta http-equiv="Pragma" content="no - cache"><meta http-equiv="Expires" content="0">
<meta http-equiv="imagetoolbar" content="false"> <meta name="Author" content="Erlang">
<link rel="stylesheet" type="text/css" media="screen" href="main. css">
<link rel="stylesheet" type="text/css" media="print" href="print. css">
</head>
<body>
<h1>Tamylo Cosmetics</h1>
<div id="navigate">
<ul>
<li><a href="/spectr/"><span>CneKTp</span> Косметика, парфюмерия, каталоги <br /><br />Линии <i>Tamylo Violet, Sempre Bene, Salut M-lles!</i> и <i>55-R</i></a></li>
<li><a href="/visit/"><span>Заходитe в гости</ span> Контакты, сотрудничество, штат</а></^>
<li><a href="/offic/"><span>Официально</span> Лицензии, авторское право<^></^>
</ul>
</div>
<div id="read">
<р>Компания <span class="tamylo">Tamylo</ span> была создана совершенно случайно после вечера работы в Adobe Photoshop. После разработки первых эскизов инновационной косметики и косметической парфюмерии было принято решение вывести разработку на промышленные масштабы.</p>
<p>B июле 2007 года инновационные тренды и концепция были утверждены советом директоров, созданным месяцем ранее. В качестве производителей были приглашены четрырнадцать французских компаний<^> </div>
<div id="automate">
<form method="post" action="/search/">
<input type="text" name="search item"> <input type="submit" value="Найти">
</form>
</div>
</body>
</html>
Видно, что страница разделена на 4 блока, каждый из которых носит говорящее имя (точнее, идентификатор) и содержит определенный фрагмент информации. При этом блоки необязательно образуются
Тэгом <div>: в одном случае блок образуется тэгом заголовка <h1>. Эти блоки: заголовок страницы (оформленный тэгом <h1>); навигацонное меню (<div> с идентификатором «navigate»); основное текстовое содержимое страницы (<div> с идентификатором «read»); вспомогательный блок, в котором в данном случае помещается поисковая форма (<div> с идентификатором «automate»). Если не считать элементов поисковой формы, больше на этой странице нет идентификаторов.
Если пользователь отключит авторские стили (такая возможность есть во многих современных браузерах), то он увидит следующую картину:
Это говорит лишь о том, что даже на альтернативных устройствах вывода страница будет отображаться хотя и не с предусмотренным дизайном, но вполне корректно в том смысле, что все блоки логически разделены: заголовок выглядит как заголовок, будучи оформленным привычным для заголовка тэгом, список ссылок оформлен как обычный список, а два других блока просто визуально отделены друг от друга.
Но для создания некоторой стилевой специфики каждый из элементов снабжен стилевыми описаниями: заголовок сделан цветным, с подчеркиванием по всему блоку, навигационный блок отделен от заголовка прерывистой линией, а пункты меню решены как прямоугольные блоки с тенью, причем основное слово в блоке (в разметке оно отграничено парным тэгом <span>...</span>) явно выделено. Большой отступ слева решен точным позиционированием элементов, в том числе и заголовка. Навигационный блок тоже точно позиционирован, а список со ссылками, которые стали блочными элементами, обрели рамку и тень (тень — единственный графический элемент). За счет того, что для ссылок прописаны точные размеры и параметр overflow:hidden (при переполнении блока не уместившаяся часть скрывается без возникновения полос прокрутки) ссылки приобретают «обрезанный» вид. При наведении на ссылку (псевдокласс : hover) она приобретает другие атрибуты: цветную рамку, увеличенные размеры, отсутствие обрезания, другие цвета и отступы. Блок для основного текста особенно не украшался: есть только ограничивающая линия справа (border-right), а блок для поисковой формы просто точно позиционирован.
За все это отвечает файл main. css:
* {
Margin:0;
Padding:0;
Font-family:Georgia, Times New Roman, Times,
Serif;
}
Hi {
Position:absolute; left:200px; top:7 0px; width:450px;
Background-color:#FFCC9 9;
Padding:7px;
Color:#CC0000;
Font-size:14pt;
Font-weight:bold;
Border-bottom:2px solid #CC0000;
}
A {
Color:#6699FF;
}
A:hover { color:#330099;
}
Div#navigate { position:absolute; left:200; top:125px; padding:7px; font-size:10pt; font-weight:normal; border-top:1px dashed #CC0000; z-Index:100;
}
Div#navigate li { display:inline; float:left; height:100px; vertical-align:top; margin-right:10px;
Background:white URL(reds/shad. jpg) no-repeat; }
Div#navigate 1і a { display:block; width:90px; height:77px; overflow:hidden; background-color:#FFFFFF; border:1px solid #EEEEEE; text-decoration:none; padding:3px;
}
Div#navigate 1і a:hover { width:180px; height:150px; background-color:#FFFFFF; border:2px solid orange; overflow:none; padding:5px;
}
Div#navigate 1і a span { display:block; font-weight:bold; со1ог:#СС0000;
Border-bottom:1px solid #CC0000; font-size:13pt; white-space:nowrap; padding:3px 0рх; margin-bottom:3px;
}
Div#read { position:absolute; left:200; top:255px; width:65%; height:200px; overflow:auto; padding:7px; font-size:12pt;
Border-right:1px solid #CC0000;
}
Div#automate { position:absolute;
1е^:200; top:500px; padding:7px; font-size:12pt; )
Стоит прокомментировать только несколько вещей (остальные уже должны быть понятны). Стили для ссылок описаны два раза: первый раз (вне списка) на тот случай, если встретятся ссылки отдельно, не в меню, а второй раз (во вложенном описании) описываются конкретно ссылки, находящиеся внутри списка, который содержится внутри навигационного блока (на самом деле HTML-разметку можно было упростить еще больше, избавившись от блока и просто точно позиционировав список, но так разметка стала бы чуть менее структурированной; кроме того, это позволит при необходимости добавить в навигационный блок другие элементы, помимо списка ссылок). Строка div#navigate li a:hover должна быть понятна: это стиль ссылки, находящейся внутри элемента списка в блоке «navigate», активизирующийся при наведении курсора мыши. Есть и более сложная вложенность: div#navigate li a span (фрагмент текста <span> внутри ссылки внутри элемента списка внутри блока «navigate»). Первый же элемент в стилевой таблице (звездочка, обозначающая все элементы) сообщает всем элементам страницы нулевые отступы и (если эти элементы текстовые) гарнитуру шрифта.
Для отрисовки страницы, которая будет распечатана на принтере, используется файл print. css:
Hi { color:#CC0000; font-size:14pt; font-weight:bold; border-bottom:2px solid #CC0000;
}
A {
Color:black;
}
Div#navigate { margin-top:5px; padding:7px; font-size:10pt; font-weight:normal;
}
Div#navigate li { display:block; margin-left:10px; margin-bottom:10px; list-style-type:none;
}
Div#navigate li a { text-decoration:none;
Подписано в печать: версии страниц |
3.6 |
Padding:3px; } Div#navigate li a span { display:block; font-weight:bold; color:#CC0000; Border-bottom:1px solid #CC0000; Font-size:13pt; White-space:nowrap; Padding:0px; Margin-bottom:3px; } Div#read { width:95%; font-size:12pt; Border-right:1px solid #CC0000; } Div#automate { display:none; } Количество описываемых элементов сократилось. Во-первых, нам не нужно отсутствие отступов, потому что для данной версии страницы мы используем не точное позиционирование, а обычное, последовательное, при котором координаты не указываются. Во-вторых, пропала необходимость в псевдоклассе :hover, поскольку вряд ли кто - то будет на полном серьезе заносить мышку над листом бумаги. Далее, сужена гамма используемых цветов, потому что статистически чаще люди пользуются черно-белыми принтерами, и печатный вид страницы нужно сделать максимально контрастным. В данном случае в печатной версии используются только белый, черный и темнокрасный цвета (последний на черно-белой распечатке будет выглядеть как темно-серый, почти черный). Пункты меню, поскольку они длинные (состоят из нескольких слов), сверстаны по-другому, чтобы можно было прочитать весь текст. А форма поиска вообще скрыта, так как ею на бумаге воспользоваться тоже затруднительно. Несомненно, версии страниц для печати пригодятся не в каждом случае. Например, печатная версия для страницы поиска или администраторской страницы ни к чему: только ради того, чтобы на бумаге показать, как выглядит страница. Иногда захочется напечатать страницу так, как она выглядит на экране, а не с помощью специальной версии. Правда, эта ситуация настолько редка, что посетитель догадается сделать скриншот и напечатать его. |
Верстка |
|
Для некоторых сайтов вообще не требуется печатная версия. Это типично для сайтов, у которых навигационный блок минимален по размерам, а верстка основной части страницы тянущаяся (в этом случае браузер сам подгонит ширину страницы к ширине листа, на который будет производиться печать). Основное правило в этом случае — просто проследить, насколько корректно будет распечатана страница, и добавлять правила, только если они необходимы. Есть мнение, что для тех посетителей сайта, кто отключает загрузку активных сценариев, нужно предоставлять альтернативную версию страницы. Это неправильно, потому что ничем не оправдано. Это только лишняя работа, а пользы минимум. Достаточно сделать так, чтобы страница не утрачивала функциональности, а посетитель был корректно предупрежден о том, что с отключенными сценариями ему придется довольствоваться урезанными возможностями сайта. Так как никто не заставит пользователей, которых кто-то когда-то напугал возможностями JavaScript, включить сценарии обратно, приходится соблюдать несколько правил: 1. Вся клиентская проверка форм должна дублироваться серверной проверкой. Проще говоря, если пользователь не заполнил часть нужных полей, но отключил активные сценарии и тем самым обошел клиентскую проверку, при принятии данных из формы сценарий должен в корректной форме и на языке посетителя сообщить о том, какие именно необходимые поля не были заполнены. Не нужно допускать ситуации, когда данные не приняты, но посетителю не сообщаются причины, по которым это произошло. 2. Если сценарии инициируются через ссылки, то в этих ссылках не должно быть пустых атрибутов href: при выключенных сценариях браузер сможет пересылать посетителя на страницу, адрес которой записан в этом параметре. Естественно, что нужно подобрать страницы, наиболее подходящие по смыслу. Если таких страниц нет, то стоит инициировать сценарии не ссылками, а фрагментами текста в тэгах <span> или <div>, оформленными подобно ссылкам. 3. В каком-то месте страницы можно разместить уведомление о том, что JavaScript отключен, оформив его тэгом <noscript> ... </ noscript>. Это может быть короткое предложение, снабженное на всякий случай ссылкой на справочную страницу, где описываются возможности включения сценариев на тот случай, если пользователь этого не знает. Текст на справочной странице может быть, например, таким: «Чтобы включить JavaScript (если Вы увидели сообщение на главной странице, значит, он у Вас отключен), необходимо: |
|
230 |
Подписано в печать: версии страниц |
3.6 |
Internet Explorer: открыть меню Сервис / Свойства обозревателя / Безопасность / Другой... / Сценарии / Активные сценарии / Разрешить. Обновить страницу. Netscape Navigator: Edit (Правка) / Preferences (Настройки) / Category (Категория) / Advanced (Дополнительно). Обновить страницу. Firefox: Инструменты / Настройки / Использовать JavaScript. Обновить страницу. Opera: нажать клавишу F12, отметить Enable JavaScript (Включить JavaScript). Обновить страницу.» Если используются серверные сценарии, то можно ими определять используемый браузер посетителя и выводить информацию только для него. Ни в коем случае не нужно делать дополнительные версии страниц для альтернативных браузеров. Просто делайте так, чтобы страницы корректно отображались в современных браузерах и без существенных потерь — в устаревших браузерах. |