HTML と CSS だけで見出しにアイコンを付ける
まず結果を見たい人向け
ソースコードとサンプル
作りたいもの (要件)
-
<h1>
とか<h2>
とかの左に画像でアイコンを挿入したい. - アイコンがない見出しも使うことがある (全ての見出しにアイコンを付けるわけではない) のでそのへんは柔軟にしたい.
実装解説
HTML にはアイコンあり見出しとアイコンなし見出しを用意した.
ポイントは, アイコンありの際には見出し文のところを直打ちではなく <span>
等で包み, <h1>
の小要素とするところ. 要件の 2 番目の柔軟性を実現するために重要となる.
<h1>
<img src="{画像ファイルへのパス}" />
<span>This is Heading 1A<br />(with Icon)</span>
</h1>
<h1>This is Heading 1B<br />(without Icon)</h1>
下準備として <h1>
の CSS を好きに改変. デフォルトのスタイルで良いなら position: relative;
以外は特に必要ない.
* {
box-sizing: border-box;
}
h1 {
position: relative; /* これのみ必須. relative は通常の位置を基準にする. */
min-height: 42px;
line-height: 36px;
font-size: 32px;
padding: 3px 6px;
border-bottom: 2px solid #000;
}
次に画像を配置. left
, width
, height
は好きに設定して良い.
ポイントは, top: 50%;
は "参照座標の" 高さ 50% を意味するのに対し, transform: translateY(-50%);
は "自身の" 高さ 50% を意味するという点.
top: 50%;
によって <img>
要素の上辺が <h1>
要素の上下中央と一致する. そのあと transform: translateY(-50%);
によって <img>
要素の高さ半分だけ上に戻して, 結果的に <img>
要素の上下中央と <h1>
要素の上下中央を一致させることができる.
position: absolute;
は <img>
要素の座標基準として <h1>
要素を使用するために設定している.
h1 > img {
position: absolute; /* absolute は祖先要素のうち position が static (初期値) 以外に設定されている要素の左上を基準にする. この場合親要素の h1 の左上が基準となる. */
top: 50%; /* h1 の左上から下方向に h1 の高さの 50% 下げる. */
left: 6px;
transform: translateY(-50%); /* 現在の位置から h1 > img の高さの -50% 下に移動, つまり 50% 上に移動. */
width: 32px;
height: 32px;
}
最後に <span>
要素のスタイルを設定する. padding-left
の値は <img>
要素の幅などを踏まえて自由に指定して良い.
ここで, h1 > span
ではなく h1 > img + span
とすることで, <h1>
要素の直下で <img>
要素の直後にある <span>
要素のみを対象とできる. つまり <h1><span>~~~~</span></h1>
のような HTML の <span>
要素はこのセレクタでは対象とならない.
h1 > img + span {
display: inline-block; /* inline (初期値) では複数行に渡る場合にアイコンの上に文字が乗ってしまう. */
padding-left: 46px;
}
Discussion