この記事で作るもの
こんなやつ。
HTML をどう書くか
HTML は、文法エラーを出さない。そのためか、適切な HTML 要素の検討、選択は、軽んじられているところがある。
しかしアクセシビリティや、開発の容易さを考えると、適切な HTML を書くことは非常に重要だと思う。
そんなわけで、今回作るものにはどの HTML 要素が適切かを検討していきたい。
今回作るものは、上の画像からもわかるように、複数の項目が列挙されている。つまり、リスト形式になるということだ。
HTML でリストを表現にする際には、リスト要素(ul
, ol
, dl
要素)を使用する。
次に、この記事で作るものでは「各項目と、それに対する値段」を書く必要がある。
これを表現することに適しているリスト要素は、一連の用語と説明をリスト化できる**dl
要素**だ。
dl
要素で骨組みを作ってみる。ついでにクラスも割り当てる。また、dt
, dd
要素がすべて隣接していると、項目ごとの装飾が難しくなる。そのため、項目ごとにdiv
要素で囲んだ。
<dl class="products">
<div class="product">
<dt class="productName">項目1</dt>
<dd class="productPrice">500円</dd>
</div>
<div class="product">
<dt class="productName">項目2</dt>
<dd class="productPrice">1,000円</dd>
</div>
</dl>
CSS をどう書くか
上に書いたような HTML 構造になれば、あとは CSS でいかようにもできる。
div.product
のbefore
, after
擬似要素で点線を表現し、それをdt
, dd
要素の間に持ってくれば完成だ。
まず、before
, after
擬似要素をdt
, dd
要素の間に持ってくるには、 flexbox のorder
プロパティを使うやり方がスマートだろう。
dt
, dd
要素のどちらかのorder
プロパティに、マイナス、もしくは 1 以上の数値を設定すれば良い。このとき、dd
要素には margin がかかっていることに注意しよう。
次に、点線の表現方法だが、これは人によって色々なやり方をするだろうと思う。今回はborder-radius
プロパティ、background
プロパティを使う方法の2つを紹介する。
点線の表現にborder-radius
プロパティを使う
dd {
margin: 0;
}
.product {
display: flex;
align-items: center;
}
.product::after {
content: '';
border-top: 5px dotted;
flex: auto;
}
.productPrice {
order: 1;
}
点線の表現にbackground
プロパティを使う
radial-gradient
関数を使っているところがポイントだ。
dd {
margin: 0;
}
.product {
display: flex;
align-items: center;
}
.product::after {
height: 1em;
content: '';
background: radial-gradient(#000 20%, transparent 30%) center/ 1em;
flex: auto;
}
.productPrice {
order: 1;
}
点線の表現はどっちでやったほうがいいのか?
border-radius
プロパティを使った場合、点の大きさは、「点の半径が border-width
プロパティの計算値の半分」であることから調整できる。
しかし、各点間の空白は、各ブラウザの実装に依存している。それに、この点はブラウザが用意した点だ。そのため、点線に対するちょっとした装飾すらも困難だ。
それでは、background
プロパティを使うとどうだろう。この場合、点自体をradial-gradient
関数を使い、自分で用意しているため、点の大きさ、間隔など、ちょっとした装飾が比較的容易に行えるはずだ。
というわけで、点線のスタイルにこだわりを持っているなら、background
プロパティを使い、点線なら何でもいいのならborder-radius
プロパティを使うと良いだろうと思う。