要素の横並び配置

要素の横並び配置
Image by 5311692 from Pixabay

2020.12.06(更新日:2021.03.22)

CSSで親要素の直下の子要素を横並び配置する方法はいくつかあるが、昨今flexbox頼りになっているので忘れ気味。
備忘録として、基本的なものをまとめてみる。

この記事は1年以上経過しています。内容的に古い場合があります。

float

今更ながらだけど、たまに使用するので。横並びにしたい要素に指定すればOK。

<!-- HTML例 -->
<div class="wrapper">
  <div class="leftbox">左のボックス</div>
  <div class="rightbox">右のボックス</div>
</div>
/* CSS */
.leftbox {
  float: left;
  width: 48%; //ここは適宜設定
}
.rightbox {
  float: right;
  width: 48%; //ここは適宜設定
}

ここで忘れてはいけないのが「回り込み解除」。clearを最後の横並び要素の次に指定するのだけど、そのためのどーでもいい要素を作るのはしたくないので以下を使う。

/* clearfixをwrapperのclassに追加 */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}
/* 面倒ならwrapper自体に */
.wrapper::after {
  content: "";
  display: block;
  clear: both;
}

/* もしくはwrapper自体にoverflow */
.wrapper { overflow: hidden; }

clearfixの場合どちらでも反映されるが、clearfixを単体で設定しておくと使い回し出来る。
また注意点としてoverflowはシンプルだが、親(wrapper)からはみ出たものは表示されなくなる。(box-shadowとかよくある話)

inline / inline-block

文字の様にダランと横並びにしたい時。横並びにしたい要素に指定すればOK。
リストなどで使うことが多いかもしれないのでリストの例。

<!-- HTML例 -->
<ul>
  <li>1要素</li>
  <li>2要素</li>
  <li>3要素</li>
</ul>
/* inline */
li { display: inline; }
/* もしくはinline-block */
li { display: inline-block; }

2つの違いは「親要素の範囲を超えた時、文字要素の場合li内で改行されるか否か」。
使用頻度はinline-blockの方が多いかも。

横並びした要素間に隙間が生じる

この方法だと改行分?の隙間が生じる。ピタッとはくっつかないので以下を使用。
(ただし</li>で改行せず、続けて記述する場合は、隙間は生じないので不要)

/* 親要素のテキストの水平方向の字間のスペースを詰めて */
ul {
  letter-spacing: -0.4em;
}
/* 子要素のテキストの水平方向の字間のスペースを戻す */
li { 
  display: inline-block; 
  letter-spacing: normal;
}

display:table

テーブルタグの形にして横並びにする。HTML例は上のinlineを参考に。

/* 親要素をテーブル化 */
ul {
  display: table;
  table-layout: fixed; //ie,edge対策。セルを均等化してくれる
  width: 100%; //幅を指定したい場合
}
/* 子要素をセル化 */
li { 
  display: table-cell; 
  vertical-align: middle; //お好みでtop,middle,bottom選択
}

扱い的にはテーブルタグを理解していれば問題なし。inlineの様に親要素の範囲を超えても流れていかない。