半角スペースのHTMLにおける特徴とそれを応用したCSSテクニック
HTMLとCSSを勉強しはじめた頃の「あるある」の一つに、記述した覚えのないところに空白が生じるというのがあります。
例えば、リストアイテム (li要素) をインライン (display: inline;
) で表示させた際に、リストアイテム間に空白ができる場合があります。
今回は、この空白の正体である半角スペースのHTMLにおける特徴と、その特徴を生かしたCSSテクニックを紹介します。
リストアイテムをインラインで表示させると空白が生じる理由
次のようなHTMLコードをブラウザで表示させると、リストアイテム間に空白が生じます。
…
<style>
ul { padding: 0; }
ul > li { display: inline; }
</style>
…
<ul>
<li>リストアイテム</li>
<li>リストアイテム</li>
<li>リストアイテム</li>
<li>リストアイテム</li>
</ul>
…
これは、ブラウザでウェブページを表示させる際、空白に関する次のような処理が行われるためです。
1. 改行やタブスペースは半角スペースに置き換えられる
HTMLコードを見やすくするために、改行やタブスペースでコードを整形するのが一般的です。その改行やタブスペースは表示される際、半角スペースに置き換えられます。
HTMLコードの改行を “↵”、タブスペースを “__” で可視化すると次のようになります。
<ul>↵
__<li>リストアイテム</li>↵
__<li>リストアイテム</li>↵
__<li>リストアイテム</li>↵
__<li>リストアイテム</li>↵
</ul>
これらが半角スペースに置き換えられることで、次のHTMLコードと同等になります。
<ul> <li>リストアイテム</li> <li>リストアイテム</li> <li>リストアイテム</li> <li>リストアイテム</li> </ul>
2. 連続する半角スペースは1つの半角スペースに省略される
連続する半角スペースは1つにまとめられます。
Microsoft Wordなどで文書を作成する要領で半角スペースを大量に打ち込み、ウェブページの余白を調整しようとしたが、意図した通りに反映されない、その理由がコレです。
これにより、先のHTMLコードは次のHTMLコードと同等になります。
<ul> <li>リストアイテム</li> <li>リストアイテム</li> <li>リストアイテム</li> <li>リストアイテム</li> </ul>
3. 行頭と行末にある半角スペースは省略される
行頭と行末にある半角スペースはブラウザでは表示されません。
段落の行頭をインデントさせようと半角スペースを打ち込んだが、意図した通りに反映されない、その理由がコレです。
これにより、先のHTMLコードは次のHTMLコードと同等になります。
<ul><li>リストアイテム</li> <li>リストアイテム</li> <li>リストアイテム</li> <li>リストアイテム</li></ul>
ブラウザでの表示
ブラウザでウェブページが表示される際、当然、HTMLタグは表示されないので、先のHTMLコードは次のように表示されます。リストアイテム間に半角スペースによる余白が生じています。
この余白をどうにかできないかと何度悩んだことか。
半角スペースを余白設定に有効活用する
リストアイテムを横並びにさせたいケースとしては、ウェブページのヘッダーやフッターなどに配置するリンク一覧などではないでしょうか?
リンク間には適度な余白が必要となります。任意の幅の余白を設定する際、邪魔になる半角スペースをどうにかするのではなく、半角スペースで任意の幅の余白を設定してみたらどうでしょうか?
半角スペースで余白設定する方法
半角スペースは通常、全角文字 (1em) の1/3程度 (約0.33em) で表示されます。つまり、0.167em足してあげれば約0.5emとなりエンスペース1つ分 ( )、0.67em足してあげれば約1emとなりエムスペース1つ分 ( ) の余白になります。
半角スペースの幅の調整はCSSのword-spacingプロパティで行えます。word-spacingプロパティが子孫要素に継承される点だけ注意しましょう。
ul {
padding: 0;
word-spacing: 0.67em; /* 幅を約1emに広げる */
}
ul > li {
display: inline;
word-spacing: normal; /* 幅を元に戻す */
}
上記のCSSコードを適用すると、ul要素直下 (li要素間) の半角スペースの幅が広げられ、次のように表示されます。
また、擬似要素を使用することで、区切り文字 (|
) を設定したり、半角スペースがない部分に半角スペース ( 
) を挿入することもできます。
ul > * + li:before {
content: "\20\7C\20"; /* => " | " => " | " */
word-spacing: 0.67em;
}
上記のCSSコードを適用すると次のように表示されます。
半角スペースで余白設定するメリット
marginプロパティなどで余白を設定した場合、リストの内容が一行に収まらず余白が行頭や行末になった場合、不自然な余白がある状態になってしまいます。
また、リストの内容を行揃え (text-alignプロパティを設定) する場合、リストアイテムの余白の設定を右側のみ・左右両側・左側のみといった具合に分ける必要も出てきます。
半角スペースで余白を設定した場合、行頭と行末にある余白は表示されず、常に文字間・要素間にのみ余白が作られるため、不自然に空いてしまう問題は発生しませんし、行揃えするために設定を分ける必要もありません。
半角スペースで余白設定するデメリット
半角スペースは全角文字の1/3程度で表示されますが、表示されるフォント毎に微妙な差異があるため、0.5emや1emといった狙ったサイズにならない場合があります。
また、半角スペースの幅はemなどの文字サイズを基準とする単位と相性が良い反面、pxなどの固定値とは相性が良くありません。
そのため、ピクセル単位で細かく設計されたデザインには向きません。
CodePen
〆
いかがでしたか?昔はリストアイテムを横並びさせるとき邪魔者だった半角スペースも、フレックスボックス (display: flex;
) やグリッドレイアウト (display: grid;
) の登場で影が薄くなりました。
しかし、逆転の発想で半角スペースを余白に活用すると、様々な閲覧環境に対応させなければならない現在において、非常に有用なCSSテクニックになるのではないでしょうか?