擬似要素を使わずCSSで漫画の吹き出しを作る方法

CSS で漫画のような吹き出しを作る際、三角形の部分をどう実現するかが問題になります。

よくある方法なのが、背景色を設定した要素に、擬似要素で作った同じ背景色の三角形を組み合わせるというものです。

そこで今回は、擬似要素を使わない、吹き出しの作り方を紹介しようと思います。

吹き出しの HTML コード

<p>吹き出し</p>

p要素のみのシンプル極まりないコードです。

吹き出しの CSS コード

吹き出しの文章が入る四角形の部分は次のような CSS コードになります。

p {
--background-color: #fff; background: var(--background-color); border-radius: 16px; box-sizing: border-box; color: #202020; inline-size: fit-content; padding: 32px; }

三角形の部分の色を設定するための変数 --background-color があり、border-radius で角が丸められています。

そして、問題となる三角形の部分ですが、box-shadow で作った影を clip-path で切り取るという方法で実現します。box-shadow であれば、色や大きさを調整でき、border-radius とも併用できるためです。今回はp要素の下側に高さ 16px の三角形を作ります。

まずは box-shadow を設定します。border-radius で丸められた部分に影ができないように設定します。

p {
  …
  box-shadow: 0 32px 0 -16px var(--background-color);
}

次に clip-path で吹き出しの形に切り抜きます。

p {
  …
  clip-path: polygon(
    0% 0%,
    100% 0%,
    100% 100%,
    calc(50% + 8px) 100%,
    50% calc(100% + 16px),
    calc(50% - 8px) 100%,
    0% 100%
  );
}

影のサイズは、要素のサイズを元にしているため、要素が小さい場合には、影が離れたり、消えたりする場合があります。これを防ぐために、min-heightmin-width を設定します。

p {
  …
  min-height: 48px;
  min-width: 48px;
}

min-height に設定する数値は、影のオフセット値 + 影の縮小値 です。今回の場合、Y軸のオフセット値が 32px で、縮小値が 16px なので、48px になります (負の値は正の値として計算します)。

min-width に設定する数値は、border-radius の値 (16px * 2) + 三角形の幅 (16px) の 48px になります。

コピペしやすいように CSS コードをまとめると次のようになります。

p {
--background-color: #fff; background: var(--background-color); border-radius: 16px; box-sizing: border-box; color: #202020; inline-size: fit-content; padding: 32px; box-shadow: 0 32px 0 -16px var(--background-color); clip-path: polygon( 0% 0%, 100% 0%, 100% 100%, calc(50% + 8px) 100%, 50% calc(100% + 16px), calc(50% - 8px) 100%, 0% 100% ); min-height: 48px; min-width: 48px; }

CodePen

See the Pen Speech balloon without pseudo-elements by nov (@numerofive) on CodePen.

擬似要素が便利すぎるので、たまには擬似要素を使わない方法を模索してみるのもいいですね。

関連記事