記事本文
Opera の実装が変だと思う
はてなリング - はてなCSSリング経由で trashcan+green (beta) - OperaとfirefoxのCSSでのhref属性値の扱いが違う。
これって後々気を付けなければならなくなりそうなのでメモ。
リンク先では href 属性値が http:// で始まるアンカーを外部リンクとしていますが、サイトによっては必ずしもそうではないことは覚えておいた方が良いかも。
( hxxk.jp の場合は Copy URL+ を使ってアンカーを記述するので、自サイト内へのリンクでも http:// から始まります。 )
リンク先の記事を見て思った感想が、
operaは相対パスを絶対パスに変換してからhref属性値を扱い、firefoxは相対パスのままhref属性値を扱っているようだった
というのは Opera の実装が変じゃない ?
ということ。
quaa さん ( trashcan+green (beta) ) が
印刷用なんかにhref属性値を表示させたいときはoperaのように絶対パスが出る方がいい
と仰る通り、絶対パスが出た方が便利な場面は確かにあります。
しかし、 CSS 3 Candidate Recommendation - Selectors を見ると、
E[foo^="bar"]
というセレクタは
an E element whose "foo" attribute value begins exactly with the string "bar"
というように、 bar で始まる属性値にマッチするというセレクタですから、仮に絶対パスに変換するのなら href 属性値を扱った後に行うべきだと思います。
Opera 9.0tp1 の現状では、 http:// で始まっていない href 属性値も ( 絶対パスへの変換によって ) http:// で始まる属性値としてみなされてしまっているのですから。
逆の例を考えてみましょう。
quaa さんが trashcan+green (beta) における内部リンク ( この場合、 href 属性値が /quaa/ で始まるアンカーを指します ) にのみ特定のスタイルを反映させたいという場合も、 Opera 9.0tp1 では http://d.hatena.ne.jp/quaa/ という属性値として扱われ、内部リンクを指すはずのセレクタ ( 例 : a[href^="/quaa/"]::after{ content : "[in]"; } ) にマッチしないことになります。
Opera 9.0tp2 ではこの実装が改善されています。
ついでに content プロパティ関連の各ブラウザの実装の簡易まとめ
| IE | Firefox 1.0.7 | Opera 9.0tp1 | |
|---|---|---|---|
| content プロパティによる文字列をコピーできるかどうか | そもそも未対応なので文字列自体が表示されない | コピーできない | コピーできる |
| content プロパティによる URI 文字列の表示 ( 相対パスの場合 ) | そのまま表示 | 絶対パスに変換して表示 | |
| content プロパティによる URI 文字列の表示 ( 絶対パスの場合 ) | そのまま表示 |
content プロパティによる文字列の扱いは Opera の方が好みなんですが、勝手に相対パスを絶対パスとして扱われるのは困ります……。
単純に content プロパティにて出力される際に変換されるならともかく、属性セレクタのマッチを調べる時点で変換というのは、 CSS を書く方にとっては煩わしいことうけあい。
トラックバック送信先
- trashcan+green (beta) - OperaとfirefoxのCSSでのhref属性値の扱いが違う
-
パターンマッチを行う前に絶対パスに変換するのは、正しくない実装だと思います。

