dlのコンパクト属性は、大変便利な属性ですが、ブラウザによって実装状況が異なることと、WEB標準では非推奨となっているため、スタイルシートで実現する必要があります。
モダンブラウザに対応しています。IE6への対応版は後述します。
dl { border: solid 1px silver; border-top: 0px; }
dt { background-color: #efefef; border-top: solid 1px silver; }
dd { background-color: #ccffcc; border-top: solid 1px silver; border-left: solid 1px silver; }
dl.compact { overflow: hidden; padding: 0px; }
dl.compact dt { float: left; clear: left; width: 100px; }
dl.compact dd { margin-left: 100px; padding: 0px; }
<dl class="compact">
<dt>タイトル1</dt>
<dd>本文1</dd>
<dt>タイトル2</dt>
<dd>本文2<br>本文2</dd>
<dt>タイトル3<br>タイトル3</dt>
<dd>本文3<br><br></dd>
<dt>タイトル4</dt>
<dd>本文4</dd>
<dd>本文4</dd>
<dd>本文4</dd>
<dt>タイトル5</dt>
<dd>本文5</dd>
</dl>
モダンブラウザでは、本文3のようにdd要素の高さが横に並ぶdt要素の高さより低い場合に、その下のdd要素が上に寄ってしまいます。
また、IE6とIE7では本文3の左の罫線が下まで達していません。この対策としてdt要素とdd要素の高さが等しくなるように本文3の後ろに<br>を必要な数だけ追加しています。
IE6で前述の表示例を見た場合、下図のように本文の開始位置にガタつきが発生しているのに気づくと思います。
IE6での表示例
dd要素の横にdt要素の実体がある場合は、dd要素の行頭に3pxほど間隔があいてしまい、dd要素の横にdt要素の実体がないところ(背景が白色のところ)では間隔があいていません。 原因はよくわかりませんが、IE6だけの現象のようなのでCSSハックを使用して次のように対応します。
dl.compact { overflow: hidden; padding: 0px; }
dl.compact dt { float: left; clear: left; width: 100px; }
dl.compact dd { margin-left: 100px; padding: 0px; }
* html dl.compact dt { margin-right: -3px; }
* html dl.compact dd { zoom:1; margin-left: 97px; }
* html dl.compact dd.adjust { margin-left: 100px; }
まずzoom:1でdd要素のhasLayoutをtrueにします。
するとdd要素内の位置はそろうのですが、今度はdt要素とdd要素の間に3pxの間隔があいてしまいますので、dt要素の右マージンを-3px、dd要素の左マージンを3px減らします。
次にマージンを3px減らしたせいで、本文4の2個目以降のddがずれるので、100pxに戻すadjustクラスを別途用意します。
作成したクラスは次のように使用します。
<dl class="compact">
<dt>タイトル1</dt>
<dd>本文1</dd>
<dt>タイトル2</dt>
<dd>本文2<br>本文2</dd>
<dt>タイトル3<br>タイトル3</dt>
<dd>本文3<br><br></dd>
<dt>タイトル4</dt>
<dd>本文4</dd>
<dd class="adjust">本文4</dd>
<dd class="adjust">本文4</dd>
<dt>タイトル5</dt>
<dd>本文5</dd>
</dl>
これで、IE6でもきれいに表示されるようになります。
brを続けて記述するのはあまり良くない記述方法と言われていますので、正しくはmin-heightを指定するか、スペーサーGIF等を使用するのが好ましいと思われます。
CSS3.0では、CSS2.0に存在したdisplay:compact;が復活する予定です。