Help us understand the problem. What is going on with this article?

HTML/CSSで簡単な吹き出しの作り方

More than 5 years have passed since last update.

社内向けに書いたドキュメントが好評だったので公開しちゃいます。

基本編1

本体と三角形を分けて実装します

<div class="balloon">
  こんにちはこんにちは!
  <div class="triangle"></div>
</div>
.balloon {
  position: relative;
  width: 200px;
  height: 30px;
  background-color: #ccc;
  text-align: center;
}
.balloon .triangle {
  position: absolute;
  bottom: -10px;
  left: 50%;
  margin-left: -10px;
  width: 0;
  height: 0;
  border-top: 10px solid #ccc;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
}

kobito.1424165128.476774.png

解説

三角形の部分は実はborderなんですが、よくわからないと思うので色を変えます。topを赤、leftを緑、rightを青にするとこんな感じです。

.balloon .triangle {
  border-top-color: #f00;
  border-left-color: #0f0;
  border-right-color: #00f;
}

kobito.1424168013.683146.png

三角形が3つありますね!

なぜborderを使うと三角形になるのかといえば、 四角形を囲うためにはborderは台形である必要がある からです。ためしに、.triangleのwidthとheightをちょっと大きめにします。

.balloon .triangle {
  width: 20px;
  height: 20px;
  background-color: #000;
}

kobito.1424166151.904282.png

たしかに一つ一つのborderは台形ですね!

そういうわけで、底辺にしたい部分のborderを太くして、その両脇を透明な状態で太くして、widthとheightを絞ると三角形になります。これは三角形を描画したい場合によく使うテクニックです。

あとはこの要素を、position:absoluteで一番下にくっつければOKです。

.balloon .triangle {
  position: absolute;
  bottom: -10px;
  left: 50%;
  margin-left: -10px;
}

margin-left: -10pxしてるのは、left: 50%で50%の位置に来るのはborderの左端なので、border分左にずらす必要があるからです。

三角形を別の辺にくっつけたい場合でもだいたい同じです。簡単ですね。

基本編2

吹き出しのために空の要素を置くのはバカバカしい気がします。そこで擬似要素でどうにかしましょう。

<div class="balloon">
  こんにちはこんにちは!
</div>
.balloon {
  position: relative;
  width: 200px;
  height: 30px;
  background-color: #ccc;
  text-align: center;
}
.balloon:before {
  content: "";
  position: absolute;
  bottom: -10px;
  left: 50%;
  margin-left: -10px;
  width: 0;
  height: 0;
  border-top: 10px solid #ccc;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
}

kobito.1424166969.027402.png

解説

HTMLがシンプルになりました。

.triangleの代わりに、:beforeに書いています。中身が空の:before擬似要素を置くためには以下のようにします。

.balloon:before {
  content: "";
}

あとは.triangleを置いていたときと変わりません。

応用編

「漫画の吹き出しみたいに灰色のフチで背景色は白にしてください!」とか言われたとしましょう。boderの三角形は塗りつぶししかできません。そこで三角形を2つ作ります。

<div class="balloon">
  こんにちはこんにちは!
</div>
.balloon {
  position: relative;
  width: 200px;
  height: 30px;
  border: 1px solid #ccc;
  background-color: #fff;
  text-align: center;
}
.balloon:before {
  content: "";
  position: absolute;
  bottom: -10px;
  left: 50%;
  margin-left: -10px;
  width: 0;
  height: 0;
  border-top: 10px solid #ccc;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
}
.balloon:after {
  content: "";
  position: absolute;
  bottom: -9px;
  left: 50%;
  margin-left: -10px;
  width: 0;
  height: 0;
  border-top: 10px solid #fff;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
}

kobito.1424167448.441927.png

はい、簡単ですね。

解説

ここでのポイントは、:afterで作ってる三角形です。:before#cccの三角形を作って、その上に:after#fffの三角形を作って重ねます。

ためしに、:afterの三角形を赤色にしてみましょう

.balloon:after {
  border-top-color: #f00;
  }

kobito.1424167583.805812.png

赤い三角形が上方向に1pxズレてるのがわかると思います。わからない人は顔をディスプレイに近づけましょう。

freee
スモールビジネスのバックオフィス業務をテクノロジーで自動化し、日本のスモールビジネスを元気にする
http://www.freee.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away