変な定義リストをスッキリさせたい
随分前の話になるんだけど、別の制作会社のスタッフがコーディングしたコンテンツの中でdl(定義リスト)が使われてる部分があった。意味的にその場面で定義リストを使うのは間違いじゃないと思うし、それは問題ないんだけれど、少しソースに違和感があった。今日はそれを書いてみる。
何に違和感があったのか
私が違和感を感じたのはこういうソース。(内容は架空のものに差し替えてます)
<dl>
<dt>開催日時</dt>
<dd>2007年8月18日</dd>
</dl>
<dl>
<dt>開催場所</dt>
<dd>日本のどこかの県のどこかの市</dd>
</dl>
<dl>
<dt>参加費用</dt>
<dd>1,000円くらい</dd>
</dl>
何が違和感かって、定義リストで同じグループのものって普通1つのdlの中にdtとddを並べれば済むんじゃないの?と。そのマークアッパーさんは各項目ごとにdlの中にdt、ddを入れてる。これって何か特別な意図があるんだろうかと不思議に思ったわけです。
見た目とCSSはこうなってた。
各dtとddの左にボーダーを入れる。dtとddの間はマージンを取らずに、左側の縦ボーダーがピタっとくっついて1本の線になるように。各dlの下部にもボーダーで点線を。よく見かけそうな感じのデザイン。
CSSソース(いらない部分はカットしてこの状態にしている部分のみを取り出しました)
dl {
border-bottom:1px dotted #999;
padding: 5px 0 5px 0;
}
dl dt {
color:#900;
border-left: solid 4px #900;
padding: 0 0 0 10px;
font-weight: bold;
}
dl dd {
border-left: solid 4px #900;
padding: 0 0 0 10px;
}
分離されている各dlを1つにまとめてみることに
そういうことで、とりあえず各dlを1つのdlにまとめました。
<dl>
<dt>開催日時</dt>
<dd>2007年8月18日</dd>
<dt>開催場所</dt>
<dd>日本のどこかの県のどこかの市</dd>
<dt>参加費用</dt>
<dd>1,000円くらい</dd>
</dl>
すると見た目がこんな感じに(左上図)なりました。各dtとddのセットの間の隙間がなくなったのと、セットごとの下線がなくなったので、それを補うためにCSSをいじってみました。
とりあえず単純にdlについてる下線を削除して、dtに上マージンを、ddに下線を加えました。するとこうなりました。(左下図)一見うまく元の見た目どおりになったと思いきや、よく見るとdd下線の位置が1つ1つdlに分離していた時と違うんですね。(どこが違うか分からない方は下の図を参考に。)
ddに下paddingを加えたところで、その値に伴って左の縦ラインも伸びるので、なんかいろいろいじってみたんですが、CSSだけで下線(点線)と縦ラインの間にスペースがすんなりとれなかったです。(もしかしたら見落としている方法があるかも、なんですが)
サイトを見る人間からしてみれば、ここの隙間があろうがなかろうが記載してある情報は理解できるので何の問題もないんですが、もしかしたらもしかして、このマークアッパーはそこに隙間をあけたいがためにdlを各dt、ddごとに分けたんじゃなかろうかとか思ったり思わなかったり。たまに組んでるデザイナのデザインを忠実に守りすぎようとして余計なdiv増やしまくったり、ちょっと変じゃないの?というようなマークアップをされるマークアッパーさんがいらっしゃるので、そんな予想をしてみました。
1つのdlにまとめても見た目を再現できる解決方法
ちょっと考えてみたんだけど、これ、ソースを1つのdlにまとめても同じ見た目にする方法ある。画像を1つ用意する必要があるんだけど、各dt、ddのセットを1つずつdlに分離するよりソースはスッキリすると思う。
用意した画像はこれ。
>>ddの左用の画像
左のボーダーと同じ色同じ幅(ここでは4px)の画像で。背景色と同化してて分かりにくいと思うけど、一番下に透明で5ピクセルの余白をとっています。またddの内容量が多くなって複数行になっても対応できるように高さは長めにしました。
dl dt{
color:#900;
border-left: solid 4px #900;
font-weight: bold;
padding: 0 0 0 10px;
margin: 5px 0 0;
}
dl dd{
background: url(xxx.gif) no-repeat left bottom;
border-bottom: 1px dotted #999;
padding: 0 0 5px 10px;
}
ポイントはddにさっき用意した画像を「left bottom」の位置に背景画像として表示させる点。上にも書いたように下の5ピクセル透明のスペースいれてるので、そこが隙間のように見えてくれる。複数行になっても画像の上は長めにとってあるので勝手に伸びてくれる。
これでちゃんと再現できるんじゃないかな。
とか言いつつ、1つ1つdlに分離してる理由がちゃんとあるならホントごめんなさい、なんだけど。dlを1つ1つ分離しようがしまいが、文法的に何か問題あるわけでもないし、人の考え方はそれぞれだと思うんだけど、私は1つにまとめたい派なので。タグ辞典とかのサンプルにはたいがい1つの定義グループの内容は1つのdlの中にdt、ddが続けて入ってるからそれが当たり前だと思ってたけどなんか違うのかな。よーわからん。
<< 油断大敵 focusさん | サーバサイドCSS、Smart*CSSを試してみた >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/160
コメント (8)
初めまして
コメントは初めてですが、実は結構前からブログと一緒に拝見していました。
定義リストって結構便利なんですが、私もこの場合だったら一つの定義リストにしますね。
それで、CSS だけで解決する方法を考えてみました。
dl {
line-height: 1.2;
padding: 5px 0 5px 0;
}
dl dt {
color: #900;
border-left: solid 4px #900;
margin: 5px 0 0;
padding: 0 0 1.2em 10px;
font-weight: bold;
}
dl dd {
border-bottom: 1px dotted #999;
margin: -1.2em 0 0;
padding: 0 0 5px 14px;
position: relative;
}
それにしても、ここのデザイン綺麗ですねぇ。
何と言うか、エレガントな感じが好きです。
投稿者: R'style | 2007年08月19日 00:51
>R'styleさん
はじめまして。コメントありがとうございます。
ブログの方まで見て頂けてるようでホントありがとうございますー。私もさっそくR'styleさんのフィード購読しちゃいました。
CSSソース、ありがとうございました。さっそく手元で試してみました。dtに下padding与えておいてddで上に同等の値をmarginで引き上げる方法、emで単位指定していれば文字サイズ可変にも対応できるし、いいですね!ddが複数行になった時は少し工夫が必要かもしれないけど、単行だったらコレでいけますね。情報ありがとうございました!さっそく自分のネタ帳(何)に追加させていただきます(n'∀')η
投稿者: Red | 2007年08月19日 12:31
ぁ… 確かに複数行には耐えられませんね orz
では、左のボーダーを dd に担当させて、dt の上と dl の下に点線なら何とか行けそうですね。
一番上に点線が出てしまうのがダメな場合は直前の要素の下に潜り込ませて(?)消す感じでしょうか。
無駄にトリッキーですね orz
> 私もさっそくR'styleさんのフィード購読しちゃいました。
これはすごい嬉しいことですが、よく意味不明なことを書くので多少注意が必要です(笑
投稿者: R'style | 2007年08月21日 00:05
>R'styleさん、こんにちわ。
確かにこういうのって考えていくとどんどんトリッキーになっていきますよねw
私が記事内で書いたソースも改行には対応できるんですが、ddが複数羅列される場合はそのままのソースでは使えないんで、通常のddにはdt同様に左ボーダーを置いて、最後に来るddに対してclassを与えてスタイルを適応させなきゃならなかったりと弱点ありありですw
こういうのをCSSでなんとかできないかって考えるのはすごく楽しいんですが、やっぱりケースバイケースで使いどころは見極めていかないとダメですよね。
はてブのコメントでdtとddのワンセットごとにdlで括るのも意味的なまとまりとして考えればアリなんじゃないかと書いてくださった方もいらっしゃいました。言われてみればそれも考え方としてはアリだなーという気もしたりして、やっぱり答えはいろいろあるなーと改めて思いました(n'ω'n)
投稿者: Red | 2007年08月21日 16:35
初めまして。
見た目の議論以前に、定義リストタグの仕様について正しく解釈していれば、おのずと着地点が定まる話だと思いますよ。
投稿者: test | 2007年08月23日 16:33
>testさん、コメントありがとうございます。
定義リストって厳密にこうこうですって決まってない部分の解釈がひとそれぞれで、いろいろなケースが発生しますよね。それが面白かったりもするんですが、何が最善かを見極めるのかって大切ですよね。
自分はdlの中には複数のdt、ddが入っているのが普通だと思ってたんですが、SBMのコメントなんかで他の方の意見を聞かせていただいて、新しい発見があって勉強になりました。
投稿者: Red | 2007年08月23日 16:50
http://www.w3.org/TR/1999/REC-html401-19991224/struct/lists.html
厳密な使い方はこちらで定められています。
この問題は OL タグに置き換えて考えれば、その違和感の正体が掴めると思います。
また、問題のHTMLを音声読み上げソフトに読み込ませると、意味の通った内容で読み上げてもらえず、非常に不便な思いをします。
投稿者: test | 2007年08月24日 16:12
>testさん、またまたありがとうございます!
私も仕様書は確認したんですが、dl内のdt、ddの対が1つの内容グループについてまとめなきゃなないとか(例文ではそうなってましたが)逆に1つずつ分離してもいいとか、そこまで書かれてなかったのでどうなのかなーと思ってました。
>olに置き換えたら・・・
この発想はまったくなかったです。確かに置き換えてみたら分離させてる場合、違和感ありありですね。番号振って違和感ないリストがolでマークアップされるものだと思い込んでいたので定義リストをolリスト置き換えてみたら変になるという意識はなかったです。
恥ずかしながら正規版の音声ブラウザを持ってないので音声でどうなるか確認できませんでした。自分が持ってる体験版ソフトでは分離させてるソースも1つにまとめてるソースも同じように読み上げてました。でもその視点ってすごく大切ですよね。アドバイスありがとうございます。もしよろしければ音声ブラウザでどんな風に読み上げられるか教えて頂けませんか・・・とか甘えすぎですよね。すみません。
投稿者: Red | 2007年08月26日 10:46