Версия для печати: alternate stylesheet, media print

26th October 2004 - 01:20
  1. «Качает» ли браузер CSS-файлы, помеченные как alternate stylesheet
  2. «Качает» ли при отображении на экране браузер CSS-файлы media=print
  3. «Качает» ли браузер <img>, которым через CSS прописан display:none
  4. И то же самое, если display:none прописан не для <img>, а для <div>, в котором находится этот <img>.

» source

Первые два вопроса заинтересовали (последние два не менее интересны, просто я знал ответ), сделал пару тестов. Многовато налепил, но лучше перебдеть, чем наоборот; думал, может какой баг интересный всплывёт. С другой стороны, перебирать все возможные варианты нет времени, если кто обнаружит другое поведение браузеров при других условиях — велкам.

Методика 1. Останавливаем Apache, удаляем error.log, запускаем Apache. Создаём test.html, содержащий:

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

<link rel="stylesheet" href="2.css"
      type="text/css" title="common" />

<link rel="stylesheet" href="3.css"
      type="text/css" title="alternate2" />

<link rel="alternate stylesheet" href="4.css"
      type="text/css" />

<link rel="alternate stylesheet" href="5.css"
      type="text/css" title="alternate" />

<link rel="alternate stylesheet" href="6.css"
      type="text/css" title="alternate2" />

Смотрим error.log:

  • Opera 6.04: 1, 2, 3.
  • Opera 7.21, 7.50, 7.53, 7.60p1: 1, 2, 3, 5, 6.
  • Mozilla 1.8a5, Firefox 0.9.3: 1, 2, 3, 5, 6.
  • IE4+: 1, 2, 3, 4, 5, 6.

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

Методика 2. То же, только test.html теперь содержит:

<style type="text/css">
  @import url("1.css") print;
  @media print { @import url("2.css"); }
  @media print { @import url("3.css") print; }
</style>
<style type="text/css" media="all">
  @import url("4.css") print;
  @media print { @import url("5.css"); }
  @media print { @import url("6.css") print; }
</style>
<style type="text/css" media="print">
  @import url("7.css");
  @import url("8.css") print;
  @media print { @import url("9.css"); }
  @media print { @import url("10.css") print; }
</style>
<link rel="stylesheet" href="11.css"
      type="text/css" media="print" />

Смотрим error.log:

  • O604+, M18a5/FF093: 1, 4, 7, 8, 11.
  • IE4+: 2, 5, 7, 9, 11.

IE5+ пытается грузить (1,3,4,6,8,10) и в error.log появляются записи «Filename is not valid: c:/apache/htdocs/url("n.css") print».

Это относилось к режиму «Загрузили страницу на экран, печатать не пытались».

Методика 3. То же, что и в методике 2, только теперь вызываем «Print Preview». Посмотрел в Opera 7.54, FF 0.9.3, IE6 и в остальных смотреть не стал, т.к. дополнительно ничего не подгружалось.

Таким образом, и на второй вопрос говорим «Да, качает».

Ответ на последние два вопроса: Mozilla/IE — да, Opera/Safari — нет.

Личное мнение.

В принципе, логика загрузки печатных CSS понятна. Есть пользователи, которые могут загрузить документ, уйти в offline, а уже потом начать печатать. Логика загрузки альтернативных таблиц стилей может быть понятна по этой же причине. Конечно, можно было бы сначала грузить лишь основные таблицы, а подгрузку альтернативных осуществлять по мере необходимости, но, во-первых, в наше время это «экономия на спичках» (mod_gzip + header:cache), а во-вторых, если всё-таки хочется изменить эту логику, то это легко осуществить при помощи JS (отнимая у некоторых возможность пользоваться браузерными переключателями стилей). Опять же, альтернативные стили часто воспринимаются лишь как дополнительное украшательство, хотя они могут быть достаточно критичны (пример не приведу ;]).

Я в недоумении от загрузки внешних источников данных при указании display:none. Некоторые мои запросы было бы гораздо легче осуществить в той же Mozilla, если бы она не грузила такие картинки. Ведь есть прекрасное свойство visibility, зачем скрывать (просто скрывать) ещё и по display? Ну, да ладно, логика у каждого своя.

Categories: CSS | comments: (4)

Комментарии

1. Kildor 26th October 2004 - 09:44

То, что опера не грузит рисунки/ифреймы/флеш, к которым применено display:none; — факт. на этом построены блоки баннеров, реализованные через пользовательские css оперы.

2. Mendokusee 26th October 2004 - 10:59

Огромное спасибо! =)
Сослался со своего отчёта.

Mash:

Вам спасибо. :)

3. Mix 26th October 2004 - 13:40

>>@media print { @import url(«2.css»); }
>>@media print { @import url(«3.css») print; }
Между прочим в спецификации CSS2, говорится:

>>Агенты пользователей с поддержкой CSS2 должны игнорировать все правила '@import',
>>которые находятся внутри блока, либо не предшествует ни одному набору правил.
>>…
>>В следующем примере второе правило '@import' недопустимо,
>>т.к. оно находится в пределах блока '@media'.
>>
>>@import «subs.css»;
>>@media print {
>> @import «print-main.css»;
>> BODY { font-size: 10pt }
>>}
>>H1 {color: blue }
А невалидный CSS, браузеры не обязаны правильно понимать,
что судя по вашему тесту они и делают :)

Mash:

См. «думал, может какой баг интересный всплывёт». Просто когда уже были готовы результаты теста, я, чтобы не запутаться в «перецифровке», решил выложить в таком виде. К тому же, если следовать приведённой цитате из спецификации, видно, что IE не игнорирует некоторые правила, хотя обязан. Чем не интересный факт? ;)

Главное выяснили, что всё загружается сразу, остальное — другой вопрос.

4. madmause 4th April 2005 - 14:48

Люди помогите пожалуйсто….
Вот такой вопрос:
Веб страничка залазит справа за экран. И получаеться что при печати , то что за экраном обрезаеться.
Как зделать так что бы то что осталось оно распечатало на другом листе?

Заранее благодарен.

Комментарии временно отключены.