на главную

Делаем версию страницы для печати с использованием java скрипт для переключения css файлов

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

Варианта тут два (может конечно и больше, но я сразу увидела 2 явных варианта решения)

Вариант первый и самый простой: Создать дубликат страницы, где будет только текст статьи без шапок, банеров, меню и тому подобных штук. Потом сделать кнопку "Версия для печати" и поставить ссылку на эту страницу. Как говорится - дешево и сердито...
И наверное все же правильнее всего...

Нууу... как всегда мы не ищем простых решений :)
"Мы сами создаем себе трудности и с успехом их преодолеваем." :) (кто-то умный сказал) и поэтому...

Вариант второй: Использовать файлы CSS для экрана и для печати и переключать их с помощью скрипта.
Так как сайт на народе, там акромя java скриптов ничего не работает... так что выбора нет - используем для переключения файлов java скрипт.

Почему решила описать свои мучения? Потому что больше нигде не нашла как это сделать... Вот PHP скрипт есть, а java - нет (может плохо искала, киньте ссылку тогда).

Если слово CSS заставило ваши глаза округлиться... не мучайтесь, смело используйте первый вариант... Все что написано далее - не к вам...

Стоп... вы все еще читаете? Вы так легко не сдаетесь? Похвально... тогда вот вам хорошая ссылка... Там много статей про ЭТО (не подумайте плохого... про CSS :-)) http://www.htmlbook.ru. Не поленитесь, почитайте, потому что без элементарных знаний о каскадных таблицах стилей, дальше читать бесполезно... самые простые вещи я пояснять в этой статье не буду, на эту тему и так много написано в интернете, а я знаете ли ценю свое время...

Для начала создадим CSS-файлы с основными стилями:

один для экрана (назовем его stile1.css),
второй для печати (print2.css)
и еще один для отображения печатной версии страницы на экране (print1.css).

Содержание файла stile1.css я думаю всем понятно. Здесь мы задаем основной стиль для страницы. Допустим содержание его такое...

div {
padding: 10px;
}
p {
font-family:  Verdana, Times, sans-serif; 
font-size: 14px; 
margin-top: 0;
margin-bottom: 0;
padding: 5px;
padding-left: 10px;
padding-right:10px;
text-align: justifi;
}

Файл print1.css - задает стиль для вывода печатной версии страницы на экране, чтобы можно было увидеть печатную версию документа перед тем как распечатать ее.

div {
padding: 10px;
}
input {
display: none;
text-align: right;
}
#vizible {
   display: block;  
}
td {
display: none;
}
p {
display: block;
   margin-left: 10pt;
   margin-right: 5pt;
margin-top: 0;
margin-bottom: 0;
padding-left: 5pt;
padding-right: 5pt;
padding-top: 0pt;
padding-bottom: 0pt;
   text-align: left;
   text-indent: 20pt;
   font-family: Arial, 'Times New Roman', Times, sans-serif;
   font-size: 12px; 
}

Как видите я изменила форматирование обзацев (стиль для тега < p >) - шрифт стал более читабельным для печати, отступы уменьшились, выравнивание изменилось.
Чтобы скрыть все шапки и банеры я задала тегу < td > значение display: none; (т.к. страница использует табличный дизайн - т.е. представляет собой таблицу... она стала полностью невидна)
Чтобы отобразить нужный элемент страницы, использовала уникальный идентификатор (id) - #vizible и присвоила ему значение display: block;.
Чтобы кнопка "версия для печати", была не видна (ведь это и есть стиль для той самой версии для печати, значит версия для печати и так на экране), пишем так: input { display: none; }

Вот... примерно такое содержание, все что вам понадобится еще... изменяйте и добавляйте на здоровье.

Ну и наконец файл print2.css - он задает стиль для вывода страницы в печать.

input {
display: none;
text-align: right;
}
div {
padding: 10px;
}
td {
display: none;
}
#vizible {
   display: block;
}
p {
display: block;
  margin-left: 10pt;
   margin-right: 5pt;
margin-top: 0;
margin-bottom: 0;
   padding-left: 5pt;
padding-right: 5pt;
padding-top: 0pt;
padding-bottom: 0pt;
   text-align: left;
   text-indent: 20pt;
   font-family: Arial, 'Times New Roman', Times, sans-serif;
   font-size: 10pt; 
}

Форматирование абзацев снова немного меняю... при печати текст все же смотрится немного по другому... ну это вам решать ... можете оставлять как есть. В остальном все то же самое. Мы ведь уже определили предыдущим файлом стиль для печати, и показали его как версию для печати, так зачем же обманывать посетителя нашей страницы...
Сразу поделюсь одним полезным советом. Посмотрите на код... все размеры для тега < p > заданы в pt а не в px, хотя в файле stile1.css никаких pt нет.
Это же не правильно!!! Надо в px!!! Скажете вы...
Нууу... Сначала я как порядочная задала все размеры в px, но когда начала проверять как печатается документ в разных браузерах... поняла, дело плохо, а поняв, попробовала задать размеры в pt и все стало не так ужасно, как казалось на первый взгляд. Так что мотайте на ус... или на что там еще... если усов нет :)

И так, файлы стилей созданы, дальше начинается самое интересное.

Подключаем созданные нами CSS файлы к html странице...

Я делала это так:

<link type="text/css" rel="stylesheet" href="stile1.css" media="screen" />
<link type="text/css" rel="stylesheet" href="stile1.css" />
<link type="text/css" rel="alternate stylesheet" href="print1.css" title="print1" />
<link type="text/css" rel="stylesheet" href="print2.css" media="print" />

Сразу отмечу, что порядок, в котором вы подключаете файлы имеет значение! Мне подошел такой порядок подключения, но это не аксиома, можете экспериментировать.

Для файла stile1.css пишем media="screen" т.е. использовать для экрана монитора.
Для файла print2.css пишем media="print" т.е. использовать при выводе страницы на печать.

Теперь сам скрипт.

Долго я искала на просторах интернета подходящее бесплатное решение, но не нашла. Но нашла вот что - Переключатель стилей Паула Совдена. (сами переведете ;)) Переключатель стилей был создан Паулом Совденом в 2001 году, с тех пор огромное количество людей использует его в своих проектах. Вот этот скрипт я взяла за основу и немного переделала (ну не программист я... НЕ ПРОГРАММИСТ!!!) так что строго не судите. Вот собственно что у меня получилось (исходный скрипт можете посмотреть по ссылке выше):

<script   
      language="JavaScript1.2"   
      type="text/javascript">
function print() {
  active = getActiveStyleSheet();
  switch (active) {
    case 'print1' : 
      setActiveStyleSheet('print1');
      break;
    default :
      setActiveStyleSheet('print1');
      break;
  }
}
function setActiveStyleSheet(title) {
  var i, a, main;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
      a.disabled = true;
      if(a.getAttribute("title") == title) a.disabled = false;
    }
  }
}

function getActiveStyleSheet() {
  var i, a;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
  }
  return null;
}

function getPreferredStyleSheet() {
  return ('print1');
}
setActiveStyleSheet(title);
</script>

Теперь осталось сделать на странице кнопку "версия для печати" и подключить к ней скрипт.

Я сделала так:

<form name="printer" action="GET">
<input type="button" value="версия для печати" onClick="javascript:print();">

Вот и все, наша страница готова, кнопкой "версия для печати" подключается стиль print1.css. А при печати используется другой стиль - print2.css крЫсотааа!!!

Осталось проверить все это в разных браузерах... и тут... ой...

Разберемся с кроссбраузерностью

Я проверила свое творение в последних версиях Opera, Mozilla Firefox, Netscape и даже для макентош в тех же браузерах плюс Safari.
И все было ничего, хотя конечно размер шрифта все равно меняется, но я подобрала наиболее подходящий размер для всех браузеров.
Но когда попыталась распечатать всю эту красоту в IE7 (Internet Explorer 7) и тем белее в IE6... тут я и пожалела что не выбрала первый вариант...
IE растягивал текст при выводе на печать и удваивал отступ.

Хех, почесасала я в затылке, не бросать же такую красоту не доделанной, и подумав еще немного, написала еще один css файл, специально для Internet Explorer - назовем его for_IE.css.

Хотя конечно можно махнуть рукой на тех пользователей, который используют IE, но хочу заметить, что таких в России очень много, статистика не даст мне соврать, так что как говориться... думайте сами...

Итак, проблему с IE будем решать следующим образом. Вынесем правила для IE в отдельный файл и подключим его при помощи специальных HTML-комментариев (Conditional Comments), которые IE, в отличие от остальных браузеров, читает и исполняет.

Например для IE5 пишем:

<!--[if IE 5]>
	<link rel="stylesheet" type="text/css" href="ie5.css" />
<![endif]-->

Conditional Comments позволяют проверять версию IE, используя логические операторы больше, меньше, равно и их комбинации.

Поэтому удобнее не писать для каждой версии IE свой файл, а при помощи специфического мета-тега [if lte IE 7], подключить файл для текущей и более младших версий IE, создав условие [if lte IE 7], т.е. «less then or equal» (меньше или равно) или [if lt IE 7] «less then» (меньше чем).
Вынося все специфические правила для IE в отдельный файл, вы избавитесь от необходимости писать перед каждым селектором или даже правилом всякую ерунду, гарантирующую то, что это поймёт только IE, что согласитесь, очень удобно.

Кроме этого я перестраховалась и использовала фильтрацию еще и внутри самого файла - for_IE.css
Основа данного способа та же: мы подключаем при помощи Conditional Comments файл для всех версий браузера Internet Explorer. Обычный селектор и обычные правила внутри этого файла прочтут все версии IE, а вот селекторы, начинающиеся с конструкции * HTML, поймут только IE6 и младше. (смотрите код ниже)

Содержание файла for_IE.css примерно такое:

/* этот кусок для всех версий */
#vizible {
   display: block;  
}
/* этот кусок для версий IE 6 и ниже */
*html #vizible {
    display: block; 
    margin-left: 0px;
    width:expression(document.body.clientWidth > 650? "650px":
 "auto" );
}

Обратите внимание на строку width:expression(document.body.clientWidth > 650? "650px": "auto" );
Ее я написала как раз потому, что IE6(и более ранние версии) не очень дружит с современными стандартами. О таких свойствах как max-width, max-height, min-width и, наконец, min-height CSS2 этот браузер и не догадывается. Чтобы обойти эту досадную оплошность используем эту конструкцию, которая заменяет max-width.

Для min-width можно использовать такую строку:
width:expression((document.documentElement.clientWidth || document.body.clientWidth) < 400? "400px": "auto");

Для свойства max-height можно сделать так:
height:expression(this.scrollHeight > 200? "200px" : "auto");

А для свойства min-height - так:
height:expression(this.scrollHeight < 200? "200px" : "auto");

Более подробно об этом можно посмотреть на английском языке в статье SvendTofte "max-width in Internet Explorer" (не поленитесь, найдите сами).

Подключаем файл for_IE.css следующим образом, пишем:

<!--[if lt IE 7]><link rel="stylesheet" type="text/css" href="for_IE.css"><![endif]-->

Как вы уже догадались правила задаются для IE6 или ниже, и чтобы для других браузеров стили не переписывались, подключать этот файл надо последним!

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

К сожалению кнопку "версия для печати" в IE вы не увидите, скрипт отказался корректно работать в IE, но зато на печать все выводится как надо, и в других браузерах все работает.

Ну вот, рассказала все что знала :) Пользуйтесь на здоровье.
Пример работы скрипта можете посмотреть здесь

Ольга М. 30.06.08

Пожалуйста, оцените была ли данная статья вам полезной

да

не совсем (многое осталось неясным)

не совсем (я и так все это знаю)

нет (совершенно бесполезная писанина)

написать автору

на главную

счетчик посетителей сайта gratis counter Swapfinder

Hosted by uCoz