Lea Verouの編み出したフレキシブルな複数行定義リストは目からウロコだった。このテクニックを知るまではfloat
を使うと長い時(コンテンツ幅に収まらない時)に途中で改行とかうまくできないけどまぁしょうがないか……みたいな感じで我慢していた。LF(やCR)を擬似要素経由で挿入してwhite-space: pre
で改行させてしまうというのは頭良い。ただ複数のdd
要素を持つケースにはうまく対応できないのでちょっと変えて使い始めた。
このテクニックはつまりdt
要素とそれとセットになったdd
要素を一行に並べるというもの。表的なものならばそれは単にマークアップが間違っているのでtable
要素でマークアップし直した方が適切だけど、dl
要素のが適切なケースも多くあるのでこのテクニックが生かされる場面は多い。
dt,
dd {
display: inline;
}
dd + dt:before {
content: "\000a";
white-space: pre;
}
Lea Verouのオリジナルはdd
要素の後に改行を追加するけど、変更したやつではdt
要素の前に追加するようにした。それだけでは最初のdt
要素の前に空行ができるので、隣接セレクターでdd
要素の次に来るdt
要素に絞る。
:first-child
擬似クラスを使っても書ける。
dt,
dd {
display: inline;
}
dt:before {
content: "\000a";
white-space: pre;
}
dt:first-child:before {
content: "";
}
こっちの方が直観的な気もする。けどセレクターの節約が身についてきたので隣接セレクターを使うことにした。隣接セレクターも:first-child
擬似クラスもInternet Explorer 7以降での対応だし、そもそも:before
擬似要素が8以降なので互換性という点ではあまり変わらない。
white-space
プロパティーと改行コードを組み合わせて改行をさせるテクニックはMedia Queriesと相性いいんじゃないかと思う。狭い画面ではwhite-space: pre
を使って改行させて、余裕のある広い画面ではwhite-space: normal
でいっぱいいっぱいに表示するとか(もちろん逆でも良い)。
また、普通にマークアップする場合にはちゃんと考えてbr
要素を使うべきところでは使うべきだと思う(レスポンシブにしたいならdisplay: none
すれば改行されなくなるし)けど、JavaScriptで吐くコンポーネントでなるべくHTMLを使いたくないなどというケースではうまくこういうテクニックを使って安全側に倒した実装にできるんじゃないかとかなんとか。