箇条書きを表形式で表示

やりたいこと

olulを使った箇条書きを表形式で表示するスタイルシートを考える.具体的には,以下の箇条書きを3×3の表形式にする.

この箇条書きを

  1. 項目1
  2. 項目2
  3. 項目3
  4. 項目4
  5. 項目5
  6. 項目6
  7. 項目7
  8. 項目8
  9. 項目9

こんな表形式にする.

  1. 項目1
  2. 項目2
  3. 項目3
  4. 項目4
  5. 項目5
  6. 項目6
  7. 項目7
  8. 項目8
  9. 項目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を使ってみる.

  1. 親要素であるoldisplay: flex;flex-wrap: wrap;を指定
  2. 子要素のliの幅は3.5em
  3. 親要素olの幅は10.5em(3.5em*3要素)
  4. 奇数行の背景色は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. 項目1
  2. 項目2
  3. 項目3
  4. 項目4
  5. 項目5
  6. 項目6
  7. 項目7
  8. 項目8
  9. 項目9

インラインブロック

次に,display: inline-box;を使ってみる.display: inlineではwidthが指定できないのでinline-boxを使う.

  1. lidisplay: inline-block;を指定
  2. 子要素のliの幅は3.5em
  3. 親要素olの幅は10.5em(3.5em*3要素)
  4. ブロック要素の間に空白が発生するので,ol要素にletter-spacing: -0.4em;を指定
  5. 奇数行の背景色は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. 項目1
  2. 項目2
  3. 項目3
  4. 項目4
  5. 項目5
  6. 項目6
  7. 項目7
  8. 項目8
  9. 項目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

参考

inline-blockを並べた場合に発生する「隙間」を消去するCSS