【CSS】連続する <span> 要素の間に隙間ができてしまう問題について

2021年10月26日 2023年11月8日
カテゴリ: プログラミング
CSS HTML

あらすじ

HTML上で文字列を一文字ずつ違うスタイルを適用したかったので、一文字ずつ span 要素にすることにしました。
ところが、実際にコードを書いてみると span 要素同士に隙間が空いてしまいさぁ困った!というお話です。

実際に書いたコードがこんな感じです。

HTML
<div class="outer">
  <div class="inner1">
    <span class="test1">ね</span>
    <span class="test1">こ</span>
    <span class="test1">飼</span>
    <span class="test1">い</span>
    <span class="test1">た</span>
    <span class="test1">い</span>
  </div>
</div>

CSSはこんな感じ。

CSS
div.outer{
  padding:0.5rem 0;
}
div.inner1{
  background-color: blue;
  display: inline-block;
}
span.test1{
  color: red;
  font-weight: bold;
  background-color: yellow;
}

するとこうなります。

こんな風に隙間が空いてしまうのです。

隣り合う span 要素同士の隙間をなくす方法 その1

色々調べてみると、どうやら block 要素内の span 要素は後続のスペース改行コードを表示に反映してしまうという仕様が原因であることが分かりました。
そもそも、span の親要素を display: inline-block; としているのは上記のコードで display: block; とするとなぜか改行されてしまうのでその対策だったのですが、この仕様が原因だと分かりちょっとすっきりしました。

で、span 要素同士の隙間をなくす方法としてはコード内にスペースや改行を入れなければいいのです。

こんな風に、 span 要素間にスペースや改行を入れないようにすると...

HTML
<div class="outer">
  <div class="inner1">
    <span class="test1">ね</span><span class="test1">こ</span><span class="test1">飼</span><span 
  class="test1">い</span><span class="test1">た</span><span class="test1">い</span>
  </div>
</div>

こうなります。

また、 span 要素間にコメントタグを挟んでコメント内で改行すれば隙間ができることなくコードも見やすくなります。

HTML
<div class="outer">
  <div class="inner1">
    <span class="test1">ね</span><! --
  --><span class="test1">こ</span><! --
  --><span class="test1">飼</span><! --
  --><span class="test1">い</span><! --
  --><span class="test1">た</span><! --
  --><span class="test1">い</span>
  </div>
</div>

隣り合う span 要素同士の隙間をなくす方法 その2

もう一つの解決方法はもっとシンプルです。
span を格納する要素を block 要素ではなく table 要素にすればよいのです。

特に block 要素にする必要がなければこの方法が簡単でおすすめです。

CSSはこんな感じ。

CSS
div.inner2{
  background-color: blue;
  display: table; /* ここ */
}

上記のCSSを適用すると...

HTML
<div class="outer">
  <div class="inner2"> <!-- ここ -->
    <span class="test1">ね</span>
    <span class="test1">こ</span>
    <span class="test1">飼</span>
    <span class="test1">い</span>
    <span class="test1">た</span>
    <span class="test1">い</span>
  </div>
</div>

こうなります。

やっぱりコードを見やすくするために改行は入れたいですよね。

関連の記事

【Django】CSS や JavaScript の変更が反映されないときの対処法

文章を全部読むまで押せないチェックボックスを作ってみよう

CSSで色見本のアイコンを作ろう

ラジオボタンを未選択の状態にする方法を考えよう