content プロパティに関するいくつかのメモ

http://hxxk.jp/2006/03/16/2359

記事データ

投稿者

真琴

投稿日時

2006-03-16T23:59+09:00

タグ
概要

content プロパティに attr(X) 形式で HTML の属性値を指定する記述方法のメモと、 CSS3 のセレクタ関連の Last Call で示されている擬似要素の記述方法と、 Safari における content プロパティのバグや対応状況についてのメモ。

リプライ

リプライはまだありません。

記事本文

content プロパティに、任意の文字列と HTML の属性値を混在させる

:before 擬似要素 / :after 擬似要素の活用例で紹介したように、 hxxk.jp では CSS を用いて引用元の明示や削除・追記の時間の明示を行っています。

先日 IRC チャンネル #hxxkCode-404 | Hatena::Diary::Code-404 のシンヤさんと話していたところ、 content プロパティの値に " が余分に書かれているんじゃないかということが分かりました。

blockquote[title]::before {
  display :         block ;
  content :         ""attr(title)" \003088 \00308a \005f15 \007528" ;
  border-bottom :   3px double #333 ;
  margin-bottom :   0.2em ;
  padding-top :     0.2em ;
  padding-bottom :  0.2em ;
  padding-left :    1em ;
  font-size :       80% ;
  font-weight :     bold ;
  font-family :     "Trebuchet MS",sans-serif ;
  }

これが元々 hxxk.jp で用いていた記述で、次に示すのが指摘を受けて修正した記述です。

blockquote[title]::before {
  display :         block;
  content :         attr(title)" \003088 \00308a \005f15 \007528" ;
  border-bottom :   3px double #333 ;
  margin-bottom :   0.2em ;
  padding-top :     0.2em ;
  padding-bottom :  0.2em ;
  padding-left :    1em ;
  font-size :       80% ;
  font-weight :     bold ;
  font-family :     "Trebuchet MS",sans-serif ;
  }

どう違うのかというと、 content プロパティの値に任意の文字列と HTML の属性値を混在させて指定する場合は、 attr(X) の値を " で括らなければいけないと私が勝手に思い込んで、結果として " による括りが過剰になってしまっていたのです。 おそらく、こういった指定をあれこれ試していた際にこの過剰な括りが生じたのだと思いますが、今となっては何故そうしたのか思い出せません……。 とりあえず、今後同じミスをしないようにここにメモしておきます。

擬似要素を記述する際の Tips

今回の CSS のコードサンプルでは blockquote[title]::before のような書き方をしています。 何故 : を 2 つ連続して書いているか、たまにその理由を聞かれますが、いつも参考にしたページを見失うことを思い出したので合わせてメモ。

元々は Lucky bag::blog: 疑似要素の表記法で知ったのですが、 CSS3 のセレクタの Last Call ( 2005 年 12 月 15 日現在 ) の Selectors - Pseudo-elements によると、

A pseudo-element is made of two colons (::) followed by the name of the pseudo-element.

This :: notation is introduced by the current document in order to establish a discrimination between pseudo-classes and pseudo-elements. For compatibility with existing style sheets, user agents must also accept the previous one-colon notation for pseudo-elements introduced in CSS levels 1 and 2 (namely, :first-line, :first-letter, :before and :after). This compatibility is not allowed for the new pseudo-elements introduced in CSS level 3.

のように示されており、 Lucky bag::blog: 疑似要素の表記法にて主なブラウザの大部分はその記述に対応していることまで検証されているので、 hxxk.jp でも取り入れています。

なお、 Lucky bag::blog: 疑似要素の表記法では Candidate Recommendation と書かれていますが、 CSS: under construction によると 2005-12-15 Last call: Selectors と、まだ Last call であるようです。 ( Last call や Candidate Recommendation などの用語については W3C勧告プロセスの概要 - W3C勧告までの過程を参照してください。 )

content プロパティで文字列を追加する際は Safari のバグに注意 ( 再掲 )

Safari と content プロパティでも触れましたが、 Safari には content プロパティに指定した日本語文字が文字化けして表示されるというバグが存在します。

そのバグを回避するために、日本語文字を使用する場合は content : attr(title)" \003088 \00308a \005f15 \007528" ; のようにバックスラッシュでエスケープする必要があります。 ( この例は、 attr(title)" より引用" という記述をエスケープしたものです。 )

バックスラッシュでエスケープする際は、数値文字参照用変換スクリプトを使うと非常に簡単にエスケープできますので、改めて紹介しておきます。

Safari は attr(X) に未対応 ?

仕様を読み返したついでに、手元のスタイルシートサンプルブックも確認していたら、気になる記述がありました。

CSS で追加する内容は content プロパティで指定します。 そして、それを要素の前に追加したい場合はセレクタの最後に「:before」を、後に追加したい場合には「:after」をつけます。

仕様上は様々な内容を追加できるのですが、 N6 ~ 7 と Opera6 ~ 7 で共通して対応しているのは、文字列と HTML で指定してある属性の値です(Safari は属性の値には対応していません)。

これって、 Safari は content プロパティの値に attr(X) が指定されていても、それに対応していないということなのでしょうか……。 私は Windows 環境しかありませんので確認はできませんが、もしそれが本当なら blockquote 要素による引用部分はことごとく より引用 とだけしか表示されていないということになるのかなあ。

リプライ

リプライはまだ送られていないか、管理者の承認待ち状態です。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など