xenoma日記 RSSフィード

2008-12-29

Firefox だと沖縄県警サイトが悲惨になる件について

Firefox沖縄県警のサイトを見てみましょう。たぶん悲惨なことになっていると思います。縮小キャプチャを以下にあげておきます。

f:id:xenoma:20081229051201p:image:left

f:id:xenoma:20081229051202p:image

▲左:Firefox3 右:IE7 (沖縄県警のサイトTOPのキャプチャ(部分・縮小))

IE など他のブラウザだとキレイに見えるのに、なぜ Fx では悲惨なことになるのでしょうか?

原因の推測

スタイルシートの指定の仕方が原因かと思います。ソースを見てみます。

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

このように同じファイル(import.css)を2度指定しています。指定されている import.css を見てみましょう。大変短いので全文引用します。

@charset "utf-8";

@import url(reset.css);
@import url(base.css);

import.css 本体ではスタイルの指定はせず、詳細が記述されている reset.css と base.css を呼び出しているだけとわかります。そしてこの @import が今回の惨事の原因です。

Firefox においては、同じ CSS ファイルを 2 回指定したとき、 1 回目は import されますが、 2 回目は import されないようです。

ですから実は

沖縄県警のサイト、崩れて見えていましたが、実は印刷すればきれいに見えます。1回目の import.css の呼び出しは、印刷用スタイルシートとしての指定だからです。CSS 指定部分のコードを再掲しておきます。

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

一度目の media="print" での import.css の読み込みでは、実質のスタイル指定が記述されている reset.css も base.css も import されます。なので、印刷して閲覧するか、そこまでしなくても印刷プレビューで閲覧すれば整った状態で見えます。

しかし、import.css の2度目の読み込みとなる media="screen" では import されません。なので import.css は実質

@charset "utf-8";

となり、スタイルを何も指定していないことと同じになってしまいます。ですから、悲惨な見栄えになってしまうのです。

解決策1

CSS の指定を次のようにまとめる。

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

一度に指定してしまえばどうということはありません。

解決策2

import.css と全く同じ中身で import_print.css と import_screen.css を作成する。

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

中身は全く同じでも、指定するファイルさえ異なればどうということはありません。

それで・・・

専門家じゃないので、同じファイルを 2 度指定することが悪いのかどうかわかりません。サーバにやさしくなさそうなのはわかりますが。

なので、問題が起こる Firefox の実装が悪いのか、サイト作成者がアレなのかわかりません。

こういう時ってどうするのがいいのかわからないので、はてダで晒してみることにしました。

追記

「2度目だとスタイルシートの指定が無効」と書かずに、import されるとかされないとかいう書き方をした件について、多少補足。

今回のような 2 重指定の場合、本当に import だけが期待通りに動かない。たとえば、今回 2 回指定されている import.css の中身が

@charset "utf-8";

@import url(reset.css);
@import url(base.css);
body{
    text-align: center;
}

のような場合、

body{
    text-align: center;
}

の部分は 1 度目(今回の例で言えば print)、 2 度目 (screen) の指定どちらでも有効。@import 〜 の部分だけが、2度目だと無視されているようだ、ということです。

なので、「2度目のスタイルシート指定は無効」とは書けず、「import はされない」と書いた次第です。

kana-kana_ceokana-kana_ceo 2009/01/09 16:19 Firefox2では、おきませんね。Firefox3になると、その通りみたいですが。