CSSでdtとddを横並びにする方法。ddが複数行でも対応させるために

   

dt dd を横並びにしたい時。

自分でコードを書いていると dl 定義リストを使ってdtとddを横並びにしたい時が多々あります。
備忘録としてブログを書いておきます。

<dl>
  <dt>メーカー</dt>
    <dd>Kanon</dd>
  <dt>商品名</dt>
    <dd>Xos ...</dd>
  <dt>タイプ</dt>
    <dd>一眼レフデジタルカメラ</dd>
  <dt>メモリーカードタイプ</dt>
    <dd>SDXCカード</dd>
  <dt>有効画素数</dt>
    <dd>2000万画素</dd>

............
............
............
</dl>

こんな感じのやつですね。

PCサイト専用で横幅が決まっている上に文字数も決まっていて複数行にならない場合は、dt に width を指定して float するだけでOKだったりしますが、レスポンシブだったりリキッドレイアウトをしている場合、それだけでは対応できないケースの方が多いです。

うまくいかないケース

width 500px なら問題ない

メーカー
Kanon
商品名
Xos …
タイプ
一眼レフデジタルカメラ
メモリーカードタイプ
SDXCカード
有効画素数
2000万画素

width 200px だと崩れる

メーカー
Kanon
商品名
Xos …
タイプ
一眼レフデジタルカメラ
メモリーカードタイプ
SDXCカード
有効画素数
2000万画素

ここまでコードはこんな感じ

html

<!-- 幅が500pxの場合 -->
<div class="sampleWrap">
<dl class="one-low w500">
  <dt>メーカー</dt>
    <dd>Kanon</dd>
  <dt>商品名</dt>
    <dd>Xos ...</dd>
  <dt>タイプ</dt>
    <dd>一眼レフデジタルカメラ</dd>
  <dt>メモリーカードタイプ</dt>
    <dd>SDXCカード</dd>
  <dt>有効画素数</dt>
    <dd>2000万画素</dd>
</dl>
</div>

<!-- 幅が200pxの場合 -->
<div class="sampleWrap">
<dl class="one-low w200">
  <dt>メーカー</dt>
    <dd>Kanon</dd>
  <dt>商品名</dt>
    <dd>Xos ...</dd>
  <dt>タイプ</dt>
    <dd>一眼レフデジタルカメラ</dd>
  <dt>メモリーカードタイプ</dt>
    <dd>SDXCカード</dd>
  <dt>有効画素数</dt>
    <dd>2000万画素</dd>
</dl>
</div>

css

.sampleWrap dl {
  border: 1px solid #ccc;
  background: #eee;
}

.sampleWrap dl::after {
  content: "";
  clear: both;
  display: block;
}

.sampleWrap .w500 {
  width: 500px;
}

.sampleWrap .w200 {
  width: 200px;
}


.sampleWrap .one-low dt,
.sampleWrap .one-low dd {
  border-top: 1px solid #FFF;
  padding: 0.5em 0;
}
.sampleWrap .one-low dt {
  float: left;
  width: 50%;
}

htmlはそのままcssだけで対応できるようにしたいのでちょっと調整します。

書き換えた結果

width 500px はもちろん

メーカー
Kanon
商品名
Xos …
タイプ
一眼レフデジタルカメラ
メモリーカードタイプ
SDXCカード
有効画素数
2000万画素

width 200px でも崩れない

メーカー
Kanon
商品名
Xos …
タイプ
一眼レフデジタルカメラ
メモリーカードタイプ
SDXCカード
有効画素数
2000万画素

html

<!-- 上記と比べclassだけ書き換えています -->
<div class="sampleWrap">
<dl class="two-low w500">

css

.sampleWrap .two-low dt,
.sampleWrap .two-low dd {
  display: block;
  border-top: 1px solid #FFF;
  padding: 0.5em 0;
}

.sampleWrap .two-low dt {
  float: left;
  clear: left;
  width: 50%;
}

.sampleWrap .two-low dd {
  float: left;
  width: 50%;
}

dt に clear を掛けておかないと、ddが無かったり1行の時にズレます。
また border は dt dd の bottom に設定するとズレるので top に設定しています。
floatを使っているので親要素である dl にclearfixを忘れずに。
結構様々なケースに対応可能かと思います。

参考にさせていただきました。
【CSS】dtとddを横並びにして複数行でもズレないようにする
ありがとうございます。

 - css