An English version of this page is also available.
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
CSS2/CSS3のtext-shadowを表示できるようにする拡張機能です。このページやCSS3.infoのページのようにtext-shadowを使ったページで、影付きの文字が表示されるようになります。
不具合に遭遇した場合は、まずよくある質問をご覧下さい。それでも解決方法が見つからない場合の障害報告はGitHubのイシュートラッカーにお願いします。
この拡張機能では、以下の手順によって「ぼかした影」を擬似的に表現しています。
まず、影を付けたい元テキスト(以下、ベーステキスト)と同じ内容のテキストを、半透明にして、ベーステキストの下に少しずらして置きます
次に、もう少しだけ横にずらしてまた半透明のテキストを置きます。
さらにまた少し横にずらして、半透明のテキストを置きます。
同様にして、下方向にずらした次の「行」にも半透明のテキストを置きます。
このようにして半透明のテキストをずらしながら重ねていくことで、あたかもぼかしフィルタをかけたような効果を得る事ができます。
上記の方法はブロック要素全体に対しては簡単に実行できますが、インライン要素に対しては使えません。インライン要素を絶対配置しようとすると強制的にdisplay: block;
が指定されたのと同じ状態になり、先行するテキストや後続するテキストの配置がおかしくなってしまうからです。そこでこの拡張機能では、以下の手順によって「インライン要素と同じ位置に影付きのテキストを表示する」処理を実現しています。
ここでは例として、段落の先頭にありテキストノードが後続しているem要素を想定してみましょう。
まず、二つの新しいspan要素を生成し、em要素の内容テキストをそれぞれの中にコピーします(em要素の中に2つのspan要素が含まれ、直接の子にはテキストがないという状態にします)。この状態で、em要素にposition: relative;
を適用し、span要素の一つはvisibility: hidden;
で非表示に、もう一つはposition: absolute;
で絶対配置にします。この時の要素の絶対配置の基準座標は直近の包含ブロックになりますが、ここではposition: relative;
が適用されているため、em要素が包含ブロックになります。結果として、元テキストが合った位置と同じ座標に、絶対配置されたspan要素が表示されることになります。この絶対配置されたspan要素が、前述の「ベーステキスト」となります。
ベーステキストはdisplay: block;
が適用されたのと同じ状態になっています。ここで、ベーステキストのspan要素の幅を、em要素が含まれているブロック要素の内容幅に合わせます。また、text-indent
を使って、行頭の位置も元テキストと同じだけずらします。
仕上げにleft
とtop
を調整して、ベーステキストを元テキストの上に重ねます。こうして、「絶対配置されていながら元のインラインボックスと完全に同じ位置にあるブロックボックス」が作り出されました。後は、前述の手法で影のテキストを重ねれば、インライン要素の影付き表示は完了です。
左寄せのテキストは上記の手順でほぼ完全に対応できます。しかし、text-align
で中央寄せや右寄せになったテキストだと、最後の行がズレてしまうという問題が残ります。
例として、このようなテキストを想定してみましょう。
前項の手順で「絶対配置のブロック」にしたベーステキストは、元のテキストと比べた時に、最終行が右にズレています。本来であればこのインライン要素の最終行は、後続するテキストによって左に追いやられていなければならないのに、その後続するテキストがないため、最終行が右側に寄ってきている(中央寄せの中央に近づこうとしている)というわけです。
ここで使うのが、ダミーの空要素です。元テキストと同じ配置の(visibility: hidden;
の)span要素の末尾と、ブロック化されたspan要素の末尾に、それぞれ幅ゼロの空要素を挿入します。これらの要素の画面上におけるXの値を比較すれば、ベーステキストの最終行が本来あるべき位置から何ピクセルズレてしまっているのかが分かります。
あとは話は簡単で、ベーステキストの末尾に挿入した空要素のパディングなり幅なりを調整して、ベーステキストの最終行の文字を本来あるべき位置まで左に押し出してやればよいわけです。この時の計算には包含ブロックの位置と内容幅、そして元テキストの末尾に挿入した空要素の位置を使います。
なお、右寄せのテキストならこれで問題ないのですが、中央寄せの場合、こうして幅を広げたベーステキスト末尾の空要素は、ベーステキストの最終行を左に押し出すと同時に自分自身も右の方に押し出されていくので、上記の計算だけだとやはり最終行の位置がずれてしまいます。この拡張機能では、このあとベーステキストの空要素の幅を減らしたり増やしたりして調整して、中央寄せでも正しい位置にベーステキストの末尾がくるようにしています。
この拡張機能では実際には、XBLを使って、影やダミー要素などの「本来は存在しなかった要素」を匿名内容として保持するようにしています。また、ベーステキストはXBLの<children/>要素を使って、本来の要素の子であるテキストノードをベーステキストの位置に挿入しています。これにより、
という振る舞いを実現しています。