横並びのリストを中央寄せにする5つの方法
- acky.infoホーム
- デザインのヒント
- CSSテクニック
- 横並びのリストを中央寄せにする5つの方法
横並びのリストを中央寄せにする5つの方法の概要です
横並びになったリストを中央寄せにする方法を、float: left;
・display: inline
・display: inline-block
・display: table-cell
・display: flex
を使う5つのパターンで紹介します。
ブログのページ数やバナーを並べるときなど、いろいろなところで使えます。
まとめ!
- 古いブラウザまで対応させるなら
display: inline-block;
またはfloat: left;
を使って中央寄せ - 最新ブラウザだけの対応なら
display: flex;
を使って中央寄せ
HTML・CSSとデモページ
HTMLコード
<ul class="float"> <li>1</li> <li>2</li> <li>3</li> </ul> <ul class="inline"> <li>1</li> <li>2</li> <li>3</li> </ul> <ul class="inline-block"> <li>1</li> <li>2</li> <li>3</li> </ul> <ul class="table-cell"> <li>1</li> <li>2</li> <li>3</li> </ul> <ul class="flex"> <li>1</li> <li>2</li> <li>3</li> </ul>
CSSコード
ul { list-style-type: none; padding-left: 0; } li { background: #CCC; width: 50px; height: 50px; padding: 10px; margin: 10px; } .float { width: 270px; margin: auto; overflow: hidden; } .float li { float: left; } .inline { text-align: center; } .inline li { display: inline; } .inline-block { text-align: center; } .inline-block li { display: inline-block; } .table-cell { display: table; margin: auto; } .table-cell li { display: table-cell; } .flex { display: flex; justify-content: center; }
デモページ・ファイルはこちら
ul のCSSについて
CSSコード
ul { list-style-type: none; padding-left: 0; }
ul
にはブラウザが持っているCSSが適用されるので、2~3行目のように
list-style-type: none;
padding-left: 0;
と指定してリストアイテム要素のビュレット(リストのマーク)とul
の左にある余白をとります。
float: left; を使うリストの中央寄せ
いいところ
- liとliのあいだに余白ができない
- 幅の決まった正確なレイアウトに向いている
ここがいまいち…
- ulとliの幅が固定されるのでliの増減、サイズ変更に対応できない
HTML・CSSと方法
HTMLコード
<ul class="float"> <li>1</li> <li>2</li> <li>3</li> </ul>
CSSコード
ul { list-style-type: none; padding-left: 0; } li { background: #CCC; width: 50px; height: 50px; padding: 10px; margin: 10px; } .float { width: 270px; margin: auto; overflow: hidden; } .float li { float: left; }
float
を使うリストの中央寄せは、ul
にwidth
とmargin
を使ってブロック要素を中央寄せにしてから、中のli
にfloat: left;
を指定して横並びにします。
ul
はmargin: auto;
を使って中央寄せにするのでul
の幅は余白を含めたli
の幅の合計を指定します。
デモのli
の幅は50px
でmargin
とpadding
が左右合わせて40px
なので合計90px
になります。90px
のli
が3個なので、CSSの13行目のように
width: 270px;
と指定して、CSSの14行目のように
margin: auto;
と指定して左右のmarginを自動的に計算させると、ul
が中央寄せになります。
float
を使うので、CSSの15行目の
overflow: hidden;
やclearfixのCSSを使ってfloat
をクリアします。
li
を、CSSの18行目のように
float: left;
と指定すると横並びになるので、横並びのリストが中央寄せになります。
いいところ
float: left;
で左に寄せているのでli
とli
のあいだに余白をつくらずにぴったりとくっつけることができます。
また、li
はリストアイテム要素のままなので、margin
とpadding
が使えます。
ここがいまいち…
ul
とli
の幅と個数を決めて中央寄せするので、li
を増減したときやli
の幅が変わったりしたときは、ul
のCSSを再調整しないとカラム落ちしたり、左寄せに見えてしまします。
display: inline; を使うリストの中央寄せ
いいところ
- liの増減、幅の変更に対応できる
ここがいまいち…
- liとliのあいだに余白ができる
- widthとheightが使えない
HTML・CSSと方法
HTMLコード
<ul class="inline"> <li>1</li> <li>2</li> <li>3</li> </ul>
CSSコード
ul { list-style-type: none; padding-left: 0; } li { background: #CCC; width: 50px; height: 50px; padding: 10px; margin: 10px; } .inline { text-align: center; } .inline li { display: inline; }
display: inline;
を使うリストの中央寄せは、ul
にtext-align: center;
を指定して中のインライン要素が中央寄せになるようにしてから、中のli
をdisplay: inline;
に変換します。
ul
を、CSSの13行目のように
text-align: center;
と指定してul
の中のインライン要素を中央寄せにします。
li
を、CSSの16行目のように
display: inline;
と指定してリストアイテム要素からインライン要素に変換すると、横並びのリストが中央寄せになります。
いいところ
text-align: center;
を使ってインライン要素を中央寄せするときは、ul
のCSSを再調整しなくても中央寄せのままなので、li
を増やしたり、減らしたりすることが簡単にできます。
ここがいまいち…
li
はインライン要素に変換されたのでwidth
やheight
が使えません。
また、HTMLの中でli
とli
のあいだのに改行があると余白ができるので、li
がぴったりとくっついたデザインには使えません。
※HTMLやCSSを工夫すると余白を消すことができます。
display: inline-block; を使うリストの中央寄せ
いいところ
- liの増減、幅の変更に対応できる
ここがいまいち…
- liとliのあいだに余白ができる
HTML・CSSと方法
HTMLコード
<ul class="inline-block"> <li>1</li> <li>2</li> <li>3</li> </ul>
CSSコード
ul { list-style-type: none; padding-left: 0; } li { background: #CCC; width: 50px; height: 50px; padding: 10px; margin: 10px; } .inline-block { text-align: center; } .inline-block li { display: inline-block; }
display: inline-block;
を使うリストの中央寄せは、ul
にtext-align: center;
を指定して中のインライン要素が中央寄せになるようにしてから、中のli
をdisplay: inline-block;
に変換します。
ul
を、CSSの13行目のように
text-align: center;
と指定してul
の中のインライン要素を中央寄せにします。
li
を、CSSの16行目のように
display: inline-block;
と指定してリストアイテム要素からインラインブロック要素に変換すると、横並びのリストが中央寄せになります。
インラインブロック要素をInternet Explorer 6と7にも対応させるときはli
に
/zoom: 1;
を書きたします。
いいところ
text-align: center;
を使ってインラインブロック要素を中央寄せするときは、ul
のCSSを再調整しなくても中央寄せのままなので、li
を増やしたり、減らしたりすることが簡単にできます。
また、インラインブロック要素はブロック要素に似た特徴ををもつのでmargin
とpadding
が使えます。
ここがいまいち…
HTMLの中でli
とli
のあいだのに改行があると余白ができるので、li
がぴったりとくっついたデザインには使えません。
※HTMLやCSSを工夫すると余白を消すことができます。
display: table-cell; を使うリストの中央寄せ
いいところ
- liとliのあいだに余白ができない
- liの増減、幅の変更に対応できる
- vertical-alignが使える
ここがいまいち…
- marginが使えない
- ulの幅をliの幅の合計が超えたときも折り返さない
HTML・CSSと方法
HTMLコード
<ul class="table-cell"> <li>1</li> <li>2</li> <li>3</li> </ul>
CSSコード
ul { list-style-type: none; padding-left: 0; } li { background: #CCC; width: 50px; height: 50px; padding: 10px; margin: 10px; } .table-cell { display: table; margin: auto; } .table-cell li { display: table-cell; }
display: table-cell;
を使うリストの中央寄せは、ul
をdisplay: table;
とmargin: auto;
を指定して中央寄せしにてから、li
をdisplay: table-cell;
を指定して横並びにします。
ul
を13~14行目のように
display: table;
margin: auto;
と指定してテーブル要素に変換したul
を中央寄せにします。
li
を17行目のように
display: table-cell;
と指定してリストアイテム要素からtr
と同じ特徴をもつテーブルセル要素に変換すると横並びになるので、横並びのリストが中央寄せになります。
いいところ
テーブルセル要素はtr
と同じ特徴をもつのでvertical-align
が使えます。
また、li
とli
のあいだに余白もできずにぴったりとくっつき、li
が増減してもul
のCSSの調整は必要ありません。
ここがいまいち…
テーブルセル要素はtr
と同じ特徴をもつのでmargin
が使えません。
また、li
の幅の合計がul
の幅を超えても、折り返さずにはみ出たままで横に並び続けます。
display: flex; を使うリストの中央寄せ
いいところ
- liとliのあいだに余白ができない
- liの増減、幅の変更に対応できる
- 折り返しの指定ができる
ここがいまいち…
- Chrome 28・Firefox 22・Internet Explorer 11・Edgeからしか対応していない
HTML・CSSと方法
HTMLコード
<ul class="flex"> <li>1</li> <li>2</li> <li>3</li> </ul>
CSSコード
ul { list-style-type: none; padding-left: 0; } li { background: #CCC; width: 50px; height: 50px; padding: 10px; margin: 10px; } .flex { display: flex; justify-content: center; }
display: flex;
を使うリストの中央寄せは、ul
にdisplay: flex;
とjustify-content: center;
を指定します。
ul
を、CSSの13行目のように
display: flex;
と指定してフレックス要素に変換し、CSSの14行目のように
justify-content: center;
と指定して中の要素を中央寄せにすると、横並びのリストが中央寄せになります。
ul
にCSSを指定するだけで、li
は横並びの中央寄せになるのでli
への指定はありません。
いいところ
li
とli
のあいだに余白ができず、ul
のCSSを再調整しなくても中央寄せのままなので、li
を増やしたり、減らしたりすることが簡単にできます。
また、ul
に折り返しをしないflex-wrap: nowrap;
(初期値)、折り返しをするflex-wrap: wrap;
を指定することで、li
の幅の合計がul
の幅を超えたときの折り返しを調整できます。
ここがいまいち…
display: flex;
は仕様が確定していないので今後CSSの書き方が変わるかもしれません。
また、flexはChrome 28・Firefox 22・Internet Explorer 11・Edgeからのように、新しいブラウザしか対応していません。
liとliのあいだの余白を消す方法
li
をインライン要素またはインラインブロック要素に変換すると簡単に中央寄せできるので便利なのですが、HTMLの中でli
とli
のあいだに改行があると余白ができます。
余白のあるデザインのときはmargin
を少し減らすなどすれば対応できますが、li
とli
のあいだに余白のないデザインでは使えません。
しかし、HTMLをやCSSを工夫することで余白を消すことができるので、方法を3つ紹介します。
liを1行に書く
HTMLにli
を書くときはリストアイテム要素なので改行して書くときが多いと思いますが、改行せずにli
の全てを1行に書くと余白が消えます。
欠点は、1行なのでコードが長くなり読みにくくなります。
liを一行で書いた例
<li>リストタグの内容</li><li>リストタグの内容</li><li>リストタグの内容</li>
コメントタグの中で改行する
コメントタグの中での改行はHTMLに反映されないので、li
とli
をコメントタグでつないでコメントタグの中で改行すると余白が消えます。
欠点は、無駄なコメントタグが増えること、この工夫を知らない人が見たときにコメントタグの意味を理解できないことです。
コメントタグの中で改行した例
<li>リストタグの内容</li><!-- --><li>リストタグの内容</li><!-- --><li>リストタグの内容</li>
ulのフォントサイズを0にする
ul
のフォントサイズを0
にするとli
とli
のあいだにある余白が消えます。このままではli
もフォントサイズが0
になるので、16px
などを指定してli
の文字を大きくします。
欠点は、em
や%
を使ってフォントサイズを変えることができるサイトでは、li
のフォントサイズが0x1.6em=0
のように0
になるのでこの方法は使えません。
要素ごとにフォントサイズをpx
で指定しているときや、ルートからフォントサイズを計算するrem
で指定しているときにだけこの方法が使えます。
フォントサイズを0にした例
ul{ font-size: 0; } ul li{ font-size: 16px; }