箇条書きを表形式で表示
やりたいこと
ol
やul
を使った箇条書きを表形式で表示するスタイルシートを考える.具体的には,以下の箇条書きを3×3の表形式にする.
この箇条書きを
- 項目1
- 項目2
- 項目3
- 項目4
- 項目5
- 項目6
- 項目7
- 項目8
- 項目9
こんな表形式にする.
- 項目1
- 項目2
- 項目3
- 項目4
- 項目5
- 項目6
- 項目7
- 項目8
- 項目9
箇条書きのhtmlは以下の通り.
<ol>
<li>項目1</li>
<li>項目2</li>
<li>項目3</li>
<li>項目4</li>
<li>項目5</li>
<li>項目6</li>
<li>項目7</li>
<li>項目8</li>
<li>項目9</li>
</ol>
方針
親要素のol
と子要素のli
の幅をうまく指定して,3項目毎に折返し表示ができれば,表形式に見えるのではないだろうか.ブロック要素の中での折返しにはフレックスボックス(display: flex;
)かインラインブロック(display:inline-block;
)を使おう.
フレックスボックス
まず,display: flex
を使ってみる.
- 親要素である
ol
にdisplay: flex;
とflex-wrap: wrap;
を指定 - 子要素の
li
の幅は3.5em - 親要素
ol
の幅は10.5em(3.5em*3要素) - 奇数行の背景色は
nth-child
で指定
<html>
<head>
<style>
ol{
display: flex;
flex-wrap: wrap;
margin: 0 0 0 0;
padding: 0 0 0 0;
width: 10.5em; /* 3.5em*3要素 */
}
li{
list-style-type: none;
width: 3.5em;
padding: 1px 0 1px 0; /* 上下に詰まった感じがするので1px空ける */
}
li:nth-child(n+1):nth-child(-n+3), /* 1番目から3番目までと */
li:nth-child(n+7){ /* 7番目以降は背景色を付ける */
background: #dcdcdc;
}
</style>
</head>
<body>
<ol>
<li>項目1</li>
<li>項目2</li>
<li>項目3</li>
<li>項目4</li>
<li>項目5</li>
<li>項目6</li>
<li>項目7</li>
<li>項目8</li>
<li>項目9</li>
</ol>
</body>
</html>
このように表示する.
- 項目1
- 項目2
- 項目3
- 項目4
- 項目5
- 項目6
- 項目7
- 項目8
- 項目9
インラインブロック
次に,display: inline-box;
を使ってみる.display: inline
ではwidth
が指定できないのでinline-box
を使う.
li
にdisplay: inline-block;
を指定- 子要素の
li
の幅は3.5em - 親要素
ol
の幅は10.5em(3.5em*3要素) - ブロック要素の間に空白が発生するので,
ol
要素にletter-spacing: -0.4em;
を指定 - 奇数行の背景色は
nth-child
で指定
<html>
<head>
<style>
ol{
margin: 0 0 0 0;
padding: 0 0 0 0;
width: 10.5em; /* 3.5em*3要素 */
letter-spacing: -0.4em; /* ブロック要素の間の空白をなくす */
}
li{
display: inline-block; /* display: inline; は width 指定不可 */
list-style-type: none;
width: 3.5em;
padding: 1px 0 1px 0; /* 上下に詰まった感じがするので1px空ける */
letter-spacing: normal; /* -0.4emを解除 */
}
li:nth-child(n+1):nth-child(-n+3),
li:nth-child(n+7){
background: #dcdcdc;
}
</style>
</head>
<body>
<ol>
<li>項目1</li>
<li>項目2</li>
<li>項目3</li>
<li>項目4</li>
<li>項目5</li>
<li>項目6</li>
<li>項目7</li>
<li>項目8</li>
<li>項目9</li>
</ol>
</body>
</html>
このような表示になる.
- 項目1
- 項目2
- 項目3
- 項目4
- 項目5
- 項目6
- 項目7
- 項目8
- 項目9
表形式なら
ちなみに,tableタグを使う場合は以下の通り.
<html>
<head>
<style>
table{
border-collapse: collapse;
border: none;
}
tr{
border: none;
}
td{
width:3.5em;
border: none;
}
tr:nth-child(2n+1){
background:#dcdcdc;
}
</style>
</head>
<body>
<table>
<tr>
<td>項目1</td>
<td>項目2</td>
<td>項目3</td>
</tr>
<tr>
<td>項目4</td>
<td>項目5</td>
<td>項目6</td>
</tr>
<tr>
<td>項目7</td>
<td>項目8</td>
<td>項目9</td>
</tr>
</table>
</body>
</html>
このような表示になる.
項目1 | 項目2 | 項目3 |
項目4 | 項目5 | 項目6 |
項目7 | 項目8 | 項目9 |
実行環境
- xalan-j 2.7.2
- openJDK 1.8.0_121
- FreeBSD 11.0