[CSS] HTMLとCSSだけで作成した吹き出しに影をつける
こんにちは、@yoheiMuneです。
以前に画像を用いずにCSSとHTMLで吹き出しを作成するで作成した吹き出しに、 影をつける実装をブログに書きたいと思います。

実装方法については、こちらをご参照ください。
今回は、上記の吹き出しに影をつけてみたいと思います。
(ソースコード)
本実装では、Androidブラウザーとかでは影が表示されません。
「まぁ影は無いならないで良いんじゃない?」というレベルの重要度なら、上記実装もありかと思います。
本実装は、ページ上部で紹介した吹き出しの実装とは少し異なります。
(ソースコード)
実装のポイントとしては、:before疑似要素で吹き出しの部分を作成して、 :after疑似要素で:before疑似要素のはみ出た部分を塗りつぶす感じで実装されています。
(ちょっと無理矢理な感じなので、あまり好きな実装ではないです。)
吹き出し+影をデザインで要求されたら、いまのところは画像で対応するのが良さそうです。
Lineアプリみたいに、縦横可変の吹き出しがいいなんていわれるとまた大変ですが、ここはがんばるしかなーい。
最後までご覧頂きましてありがとうございました。
以前に画像を用いずにCSSとHTMLで吹き出しを作成するで作成した吹き出しに、 影をつける実装をブログに書きたいと思います。

吹き出しに影をつける
以前のブログで、以下のような吹き出しをHTMLとCSSのみで作成しました。実装方法については、こちらをご参照ください。
今回は、上記の吹き出しに影をつけてみたいと思います。
最近使えるようになったfilterを使って影をつける
ChromeやiOS6などで使えるようになったCSS Filter(詳しくは、こちら)。 Filter機能のうち、shadowを使うことで簡単に影をつけることができます。(ソースコード)
.baloon2 {
width: 200px;
height: 100px;
background-color: #fffaee;
border: 2px solid #66ff66;
border-radius: 10px;
-webkit-border-radius: 10px;
margin: 20px auto;
position: relative;
/* 以下の1行でドロップシャドウが適用される */
-webkit-filter:drop-shadow(2px 2px 2px rgba(0,0,0,0.5));
}
.baloon2:before, .baloon2:after {
width: 0;
height: 0;
content: "";
position: absolute;
right: 0px;
}
.baloon2:before {
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-left: 20px solid #66ff66;
border-right: 0px solid transparent;
margin-right: -20px;
top: 50%;
margin-top: -20px;
}
.baloon2:after {
border-top: 18px solid transparent;
border-bottom: 18px solid transparent;
border-left: 18px solid #fffaee;
border-right: 0px solid transparent;
margin-right: -18px;
top: 50%;
margin-top: -18px;
}
filterのdropShdowはbox-shadowと異なり、表示されているコンテンツに対して影を表示することができ、
いい感じに影をつけてくれます。上記例では:before要素、:after要素には影の設定をしなくても影が付く点はいい感じです。本実装では、Androidブラウザーとかでは影が表示されません。
「まぁ影は無いならないで良いんじゃない?」というレベルの重要度なら、上記実装もありかと思います。
:before要素ではみ出す部分を:after要素で隠しながら影を作成する
続いて、:before要素と:after要素を巧みに使いながら、いい感じに影を表現する方法です。本実装は、ページ上部で紹介した吹き出しの実装とは少し異なります。
吹き出しに表示する文言
(ソースコード)
<style type="text/css">
.baloon3 {
position: relative;
background-color: #fffaee;
width: 200px;
padding: 5px 10px;
margin: 20px auto;
-webkit-box-shadow:0 0 5px #000;
border: 1px solid #66ff66;
-webkit-border-radius: 10px;
}
.baloon3:before {
display: block;
content: "";
/* borderとwidthで三角形を作る */
border-color: transparent #fffaee #fffaee transparent;
border-width: 5px;
border-style: solid;
width: 0;
/* 回転して▼にする */
-webkit-transform:rotate(-45deg);
/* ▼の位置を右部に表示調整 */
position: absolute;
left: 100%;
top: 50%;
margin: -6px 0 0 -5px;
/* ▼に影をつける */
-webkit-box-shadow: 1px 1px 0 #66ff66, 2px 2px 5px #000;
}
.baloon3:after {
display: block;
content: "";
/* ▼を右側に */
position: absolute;
top: 50%;
right: 0%;
bottom: 0;
margin: -9px 0px 0 -20px;
/* ■を作って見せたくない影を塗りつぶす */
height: 16px;
width: 20px;
background-color: #fffaee;
}
.baloon3 > p {
/* :after疑似要素より上に描画されるように指定する */
position: relative;
z-index: 1;
background-color: #fffaee;
color: #333;
}
</style>
<div class="baloon3">
<p>吹き出しに表示する文言</p>
</div>
実装のポイントとしては、:before疑似要素で吹き出しの部分を作成して、 :after疑似要素で:before疑似要素のはみ出た部分を塗りつぶす感じで実装されています。
(ちょっと無理矢理な感じなので、あまり好きな実装ではないです。)
最後に
Web上で吹き出しを作るだけなら可能ですが、吹き出しに影をつけようとすると大変です(上記よりももっといい方法があると思いますが、自分が無知でわかりません)。吹き出し+影をデザインで要求されたら、いまのところは画像で対応するのが良さそうです。
Lineアプリみたいに、縦横可変の吹き出しがいいなんていわれるとまた大変ですが、ここはがんばるしかなーい。
最後までご覧頂きましてありがとうございました。






