CSSの小技として、普段は隠れているけどマウスカーソルを合わせると表示されるメッセージを実現する方法です。
ポップアップメッセージとは、文書中のある要素にマウスでポイントすると、その傍に表示されるメッセージです。
今日、殆どの視覚系のウェブブラウザにはtitle属性の値がツールティップとしてポップアップするようになっておりますが、これをCSSでもやってみたいと思います。
後述のように余り役には立たないかも知れませんが、手軽な方法として紹介いたします。
HTMLのマークアップに依り、幾つかの方法があります。
先ずは、ポップアップさせたい注釈を当該要素内に埋め込む場合の方法です。
例えば、以下のようにポップアップさせたい項目を持つフレーズを<abbr>要素とし、その直下にポップアップさせたい注釈を何らかのインライン要素(ここでは<span class="remark">要素)としてマークアップしているとします。
<abbr>堀北真希ちゃん<span class="delimiter">(</span><span class="remark">東京都清瀬市出身のアイドル女優。制作者にとってのいわゆる<em>俺の嫁</em>。</span><span class="delimiter">)</span></abbr>
<span class="delimiter">要素としてマークアップしております。CSSに対応していない環境などで閲覧したときに可読性を損ねる恐れがあるため、CSS対応環境では表示させない括弧で注釈を囲んでいる訳です。この方法は
インターネットエクスプローラ 7.0でも対応可能(6.0はダメ)
などの利点がありますが、マークアップは若干面倒かも知れません。
上記のようなHTMLに於いて、<abbr>要素がポイントされたときにメッセージを表示させるCSSは以下の通りです。
abbr {position: relative;top: 0;left: 0;}span.delimiter,span.remark {display: none;}abbr:hover>span.remark {display: block;position: absolute;top: 1.0em;left: 1.0em;width: 12em;margin: 0.5em;padding: 0.5em;border: #ccc solid 2px;background: #efe;color: #000;font-size: 80%;line-height: 1.2em;z-index: 2;}
大したカラクリではありませんが、
<span class="delimiter">要素と、ポップアップさせたい注釈である<span class="remark">要素を非表示にしておきます。<span class="remark">要素をその近くにブロックレヴェル要素として表示させると言うものです。
ここで、単純に表示させても良いのですが、幾つか工夫が必要になります。
普通に表示位置を固定するには、<abbr>要素がポイントされた際の直下の<span class="remark">要素について、position: relative プロパティを当てればよいと思われるかも知れません。
ですが、position: relative プロパティだと該当する要素が本来位置すべき空間が空いてしまいます。
position: relative プロパティを当てられた要素は一旦本来あるべき位置に描画されたものが top プロパティや left プロパティなどで位置をずらし、跡を残してしまう仕様となっております。このため、position: absolute プロパティを当てる必要があります。
しかし、そのまま単純に position: absolute プロパティを当ててしまうと、何処に表示されるか分からなくなるため、親要素の<abbr>要素で予め position: relative プロパティを当てる事でデフォルトの表示原点を変更する必要があると言う訳です。
この方法を単純に行うと、表示されるポップアップメッセージが後続のテキストの下に表示されてしまいます。
なぜなら、後続のテキストは常に上から重ねられる形にレンダリングされるからです。
後続テキストの下敷きにされてしまうのを防ぐため、<abbr>要素がポイントされたときの注釈要素には z-index プロパティに正の値を指定して後続テキストより上に重なるようにします。
尚、<abbr>要素がポイントされたときの注釈要素のスタイル定義では、直下セレクタにしておりますが、これは<abbr>要素の下に更に<abbr>要素があった場合、ポイントの有無にかかわらずそれも表示されてしまう事になるため、直下要素のみに限定したものです。
続いて、ポップアップさせたい注釈をtitle属性として記述する場合の方法です。
例えば、以下のようにポップアップさせたい項目を持つフレーズを<abbr>要素とし、そのtitle属性にポップアップさせたい注釈を記述しているとします。
<abbr title="東京都清瀬市出身のアイドル女優。制作者にとってのいわゆる"俺の嫁"。">堀北真希ちゃん</abbr>
この方法は記述は比較的簡単なのですが、何よりも、当該<abbr>要素がポイントされた際にウェブブラウザのデフォルトのツールティップも表示されてしまうと言う欠点があります。
もっとも、ツールティップは一定時間が経つと消えるようなので、長めのメッセージなど読んでいる途中で消えてしまいそうなものなどには良いかも知れません。
また、この方法はインターネットエクスプローラでは 8.0以降でないと対応出来ません。
上記のようなHTMLに於いて、<abbr>要素がポイントされたときにtitle属性値を表示させるCSSは以下の通りです。
abbr[title] {position: relative;top: 0;left: 0;}abbr[title]:before {display: none;}abbr[title]:hover:before {display: block;position: absolute;top: 1.0em;left: 1.0em;width: 12em;margin: 0.5em;padding: 0.5em;border: #ccc solid 2px;background: #efe;color: #000;font-size: 80%;line-height: 1.2em;content: attr(title);z-index: 2;}
このCSSのカラクリは、
と言うものです。
工夫すべき点はメッセージをテキストに埋め込んでいる場合とほぼ同じで、
の二つを実現しております。
CSSだけでのポップアップメッセージは、旧型ブラウザ(ここではインターネットエクスプローラ 7.0までも含めます)については最低限の可読性を保証するに留めると割切れば、これほど手軽なものはないでしょう。
わざわざJAVAスクリプトをプログラミングする必要もありません。
ですが、CSSはプログラミング言語ではない故にいろいろ欠点もあります。
CSSはプログラミング言語ではないので、当然ながら条件分岐の機能を持ちません。
このため、右端にあるテキストにポップアップの仕掛けをCSSだけで施した場合、ポイントしてもクライアント領域からはみ出して見られない場合があります。
カーソルを動かしても、適切に移動してくれないため、メッセージの下のテキストが読めなくなる場合があります。
また、上の方にあるテキストであれば問題はないかも知れませんが、下の方だとスクロールしなければポップアップメッセージを読み切れない場合があります。
これも、CSSがプログラミング言語でない故の問題点です。
結局、JAVAスクリプトに対応している環境であればスクリプトで表示位置を調整するのがベターとなります。
そうすると、何かの理由でJAVAスクリプトが利用出来ない場合に代用として利用するか、JAVAスクリプトが使える環境に対してはスクリプトを併用する事で使い勝手を良くするなどと言った事が考えられます。
ただ、CSSを用いればこんな事も可能であると言う事は知っていて損はないと思われます。