2020年10月30日金曜日

リスト要素の項目を横並びにする

CSS Flexbox を使用して、リスト要素の項目を横並びにする方法です。

カスタムデータ属性で、折り返す(左寄せ|中央寄せ|右寄せ)・折り返さないの指定ができるようにしています。

折り返さない場合、ブラウザが対応していれば、スクロール時に項目単位で止まります(スクロールスナップ)。

デモページを表示

CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* 共通定義 */
 
ul[data-flex-wrap] {
  display: flex;                  /* flexコンテナ */
  overflow: auto;                 /* スクロールバーを自動表示する */
  scroll-snap-type: x mandatory;  /* for リスト要素の項目単位でスクロール */
}
 
ul[data-flex-wrap="left"] {
  flex-wrap: wrap;                /* 折り返す */
  justify-content: flex-start;    /* 左寄せ */
}
 
ul[data-flex-wrap="center"] {
  flex-wrap: wrap;                /* 折り返す */
  justify-content: center;        /* 中央寄せ */
}
 
ul[data-flex-wrap="right"] {
  flex-wrap: wrap;                /* 折り返す */
  justify-content: flex-end;      /* 右寄せ */
}
 
ul[data-flex-wrap="nowrap"] {
  flex-wrap: nowrap;              /* 折り返さない */
  justify-content: flex-start;    /* 左寄せ */
}
 
ul[data-flex-wrap] > li {
  flex: none;                      /* flexアイテムの伸長・収縮指定 */
  width: 33.3%;                    /* flexアイテムの幅【初期値:3列表示】 */
  scroll-snap-align: start;        /* for リスト要素の項目単位でスクロール */
}
 
/* 個別定義 */
 
#container ul[data-flex-wrap] > li {
  width: 25%;                      /* flexアイテムの幅を上書き設定(4列表示) */
}
補足
  • 個別定義として、li 要素の幅を指定する(指定が無い時は3列表示)。
  • レイアウトが崩れる場合は リセットCSS・共通CSS の内容を確認。

HTML

1
2
3
4
5
6
7
8
<ul data-flex-wrap="left">
  <li><span class="button">新着情報</span></li>
  <li><span class="button">商品</span></li>
  <li><span class="button">キャンペーン</span></li>
  <li><span class="button">資料請求</span></li>
  <li><span class="button">企業情報</span></li>
  <li><span class="button">お問い合わせ</span></li>
</ul>
補足
  • ul 要素に "data-flex-wrap" を追加し、折り返し方法を指定する。
  • このサンプルでは li 要素の中にボタンを入れているが、画像やテキストでも良い。
data-flex-wrap折り返し方法
left折り返す:左寄せ
center折り返す:中央寄せ
right折り返す:右寄せ
nowrap折り返さない