JINMUSOFTWARE

擬似要素のbeforeとafterで画像を表示する方法【CSS】

擬似要素のbeforeとafterで画像を表示する方法について

擬似要素のbeforeとafterで画像を表示する方法を説明します。

これらは、とっても便利で簡単で使いどころがいっぱいあります。がしかし、ちょっと癖があるので完全に理解していきましょう。

それではbeforeとafterの中で、content: url()content: background-image(url())を使用して画像を表示する2つの方法を説明します。

content:url()を使用して擬似要素内に画像を表示する方法

サイズ100x100pxの画像を適当に表示するSamleを作成していきましょう。

擬似要素の::after(::before)を使用します。

content: url()で画像のパスを指定して画像を表示します。

.span1::after {
  content: url("./100x100.png");
  vertical-align: bottom;
  display: inline-block;
  height: 100px;
  width: 100px;
}
<div class="div1">
  <span class="span1">span1</span>
</div>
span1

::afterを使用したので、テキストの後に画像が表示されました。

画像の下側の隙間の除去

よくある問題ですが、インラインで画像を表示すると画像の下側に隙間(ディセンダー部分)が現れます。

これを除去する為に以下のCSSを設定しています。

  • display: inline-block;
  • vertical-align: bottom;
  • height: 100px;

まず、擬似要素にinline-blockを指定してheight: 100pxを設定して高さを調整します。

次に、vertical-align: bottomでテキストと高さの位置を揃えます。

ここでのheightの指定は、画像に対してではなく、擬似要素(背景領域)に対して作用します。contentで表示された画像には作用しません。画像サイズが大きい場合ははみ出して表示されます。

擬似要素は元要素の子要素

擬似要素afterのDOMの様子
擬似要素afterのDOMの様子

after(before)で挿入された要素は規定でinlineです。contentで生成された要素は無名の置換要素です。挿入された要素は元要素の子要素になります。

参考程度に覚えておきましょう。::before、::afterは子要素の位置にあります。各種ブラウザのデベロッパーツールでDOM構造を確認してみましょう。

表示する画像のサイズを調整する

content: url()で表示している画像には、heightやwidthが効きません。

transform: scale()を使用して拡縮して調整してみます。

.span3 {
  position: relative;
}
.span3::after {
  position: absolute;
  content: url(./100x100.png);
  transform-origin: top left;
  transform: scale(0.3);
  margin-left: 5px;
  top: -4px;
}
<div class="div1">
  <span class="span3">test-test-test-test</span>
</div>
Xyz

擬似要素をposition:absoluteで通常レイアウトから外します。そのままですと元のサイズ分を占有したままになってしまいます。

scaleで縮小してます。

今回はtransform-originで左上pivotにしています。scale()するときは、transform-originも覚えておくと良いでしょう。

content:url()の画像にはwidthは効きません。inline-blockに変更してもwidthは効きません。疑似要素のサイズにはには作用します。

background-image:url()を使用して擬似要素内に画像を表示する方法

.span4::after {
  content: "";
  background-image: url(./100x100_3.png);
  background-size: contain;
  display: inline-block;
  vertical-align: -40%;
  width: 32px;
  height: 32px;
  margin-left: 5px;
}
<div class="div1">
  <span class="span4">span4</span>
</div>
span4

まず、空のcontentが必要です。これがないと擬似要素が生成されません。

内容物がないのでwidthとheightでサイズを与えています。これがないと、この要素はつぶれてしまいます。

次に、background-image: url()、で画像を表示します。

さらに、背景サイズをbackground-size: containeを指定して画像がすべて内側に含まれるようにします。

ここでの擬似要素は通常のレイアウトフローです。要素の高さは親要素の行高さに影響します。

擬似と疑似の違い

調べたましたがあまり違いがよくわかりませんでした。疑似のほうが漢字としては古いようですが…

MDNの翻訳が”擬似”なのでWebの世界ではこれが正解なのです。

ちなみに英語では”pseudo”です。発音は、”súːdoʊ””すーどぉぅ”です。最初の”p”は発音しないんですね。

擬似:なぞらえる。なにかに似せる。なんの罪にあたるか評議する。

疑似:疑う。紛らわしく見分け難いこと。

参考

mdn links

視覚整形モデル

置換要素

content

::before

類似の記事

擬似クラスと擬似要素の違いを確認してみよう