CSSの小技として、同じブロックレヴェル要素の中にある一部要素を、その要素の下枠線より下に配置する方法をご紹介します。
要素には、CSSのborderプロパティなどを用いる事で枠線を引く事が出来ます。
この要素の内容の一部を、下枠線の下に表示させたいとします。
分かり易く言えば、要素の一部を、当該ブロック要素の次のブロックレヴェル要素であるかのように配置したいとします。
このような事をCSSで行うくらいなら、外に出したい要素を別のブロックレヴェル要素としてマークアップすれば良いのですが、構造上の理由からマークアップ上は同じブロックに入れたいと考える事もあるかも知れません。
例えば、表題を<h1>要素で見出しにする際に、サブタイトルを添えたいと思う場合があります。
この場合、サブタイトルを別の<h1>要素でマークアップするのが一番簡単でしょう(この場合、サブタイトルには"subTitile"と言うクラス名でも与えておく)。
すなわち、以下のようにマークアップする事になるでしょう。
<h1>タイトル</h1><h1 class="subTitle">サブタイトル</h1>
このマークアップでも良いのですが、表題とサブタイトルが一つの見出しと考えるべきだと思うなら、それを一纏めに<h1>要素とする事も出来ます。
その場合は、サブタイトル部分に<small>要素か物理要素が好ましく無いと思うなら<span>要素などに"subTitle"と言うクラス名を与えておけば良いでしょう。
すなわち、以下のようなマークアップも考えられるでしょう。
<h1>タイトル<small class="subTitle">サブタイトル</small></h1>
そのような場合には、CSSで目的を果たすという選択肢もあります。
その方法を考えて見ましょう。
一番簡単と思われる方法は、ポジショニングを利用する方法かも知れません。
例えば、上記の例を考えて見ましょう。
この場合、外側の<h1>要素に対してpositionプロパティを与える事で、実現させる事が可能です。
h1 {font-size: 200%;line-height: 1em;color: #090;padding: 6px;margin: 0 0 1em;border: #fd0 2px solid;position: relative;top: 0;left: 0;}h1 .subTitle {font-size: 50%;line-height: 1.5em;display: block;background: #fff;margin: 1em 0 0;padding: 2px 6px;position: absolute;top: 2em;left: 0;}
このスタイル定義の原理は、以下の二つです。
単純にdisplayプロパティにblock値を与えてブロックレヴェルボックス化しただけでは、この要素を含んで枠線が描かれます。
positionプロパティにabsolute値を与える事で、初めてこの要素の存在を無視した枠線が実現します。
positionプロパティにabsolute値を与える場合、ポジショニングの基準となる点は、上位要素でpositionプロパティにstatic値以外の値が与えられたものが無い限り、スクリーン基準となります。
ここでは、subTitleクラス名を与えられた<h1>要素の下位要素(HTMLでは<small>要素)は、<h1>要素の一文字分下に配置されるようにしております。
<h1>要素のfont-sizeプロパティ値が200%=デフォルトの二文字分に対して、下位要素のfont-sizeプロパティ値は50% = 親要素の半分 = デフォルトの二文字分の半分 = デフォルト一文字分となります。
依って、下位要素のtopプロパティ値は 2em = 二文字分 = デフォルト一文字分の二文字分 = 親要素一文字分となります。
すなわち、<h1>要素の一行下に配置されるようにしております。
ポジショニングは最も簡単で確実な方法です。
しかしながら、下位要素の配置条件が固定されてしまいます。
ポジショニングの記述例では、親要素となる<h1>要素の一行下に配置されますが、<h1>要素が二行以上に跨った場合には、確実に<h1>要素の二行目に重なってしまいます。
そこで、もう一つの方法として、親要素の外に配置したい下位要素で枠線を引き直すと言う方法があります。
具体的には以下のようになります。
h1 {font-size: 200%;line-height: 1em;color: #090;padding: 6px;margin: 0 0 1em;border: #fd0 2px solid;}h1 .subTitle {font-size: 50%;line-height: 1.5em;display: block;background: #fff;margin: 6px -8px -8px;padding: 2px 6px;border-top: #fd0 2px solid;z-index: 1;}
このスタイル定義の原理は、単純に<h1>要素の下に下位要素を配置すると言うものですが、更にその下位要素で上枠線を引く事で、それを親要素の下枠線のように見せると言うものです。
問題は、このままでは下位要素を含めて<h1>要素の枠線が引かれてしまう事です。
そこで、下位要素の表示領域を拡げて元の枠線の上に被せる事で、元の枠線を消してしまいます。
これには、marginプロパティで、左右及び下の余白幅を負にする事で解決します。
このときの幅は、親要素のパディング幅(paddingプロパティなどで指定)と枠線の幅(border-widthプロパティなどで指定)を合わせた値に負号を付けた値となります。
実際に対応しているユーザエージェントで表示させると、以下のようになります。
この方法は、CSSの実装が正しくないと、巧く行かない恐れがあります。
特にインターネットエクスプローラのウィンドウズ版 5.0xでは巧く行かない場合もあります。