CSS3の filter
プロパティで blur
を指定して背景画像やimg
タグの画像にぼかし効果を施すと、ぼかし具合が大きいほど、対象要素のフチまでぼやけてしまって、なんだか美しくありませんね。
Webデザインをやってる方は、案外こんな経験をされた方もいるのではないでしょうか?
というわけで、今回のTipsはfilter:blur
で画像にブラー効果を施したときに、フチにかかるぼやけを解消する方法を、CSSのbackground-image
プロパティで背景画像として表示する場合と img
タグで画像を直接表示する場合の両方についてご紹介します。
まずは、両方の比較サンプルをご覧ください!
上段が background-image
プロパティによる背景画像表示の場合で、下段がimg
タグによる画像表示の場合です。
それぞれ、左側の画像がフチのぼやけ対策をしていない状態で、右側がぼやけを解消した状態です。
See the Pen Sharpen Blurred Edges With CSS3 Filter Blur by digistate (@digistate) on CodePen.
要は画像を表示している要素に対して、ブラーの度合い(ピクセル)分、上下左右のマージンも同じ値で引き伸ばす(マイナス)ことで若干拡大してフチのぼやけ部分を見えなくしてあげれば、画像全体にきれいなブラーがかかった状態となります。
理屈はとても簡単、単純ですね!
INDEX
HTML/CSSの構造
background-imageプロパティによる背景画像の場合
background-image
プロパティで背景画像を表示し、その要素に対してフィルターでブラー効果を施した場合のHTMLとCSSのの構造のサンプルを解説します。
HTMLの構造
まずは、figure
要素内に、背景画像を表示するためのdiv
要素を追加し、インラインスタイルのbackground-image
で画像のURLを直接指定しています。
<figure> <div class="blur-img" style="background-image:url(画像のURL);"></div> </figure>
CSSの構成
img
タグとは異なり、background-image
で画像を指定している要素は、指定している画像のサイズを要素のサイズとしてくれるわけではないため、自分自身か親(ラッパー)要素に対して予めCSSでサイズを指定しておかないと、高さ(height)がないため画像が表示されません。
今回のサンプルでは、親要素にあたる figure
要素に対して幅(width)と高さ(height)を予め指定しておきます。
figure { position: relative; overflow: hidden; width: 46vw; height: 28vw; }
フィルターでブラーを施す要素(.blur-img
)は、上下左右のマージンをブラーの度合い分、マイナス方向へ引き伸ばすため、この要素自体にはサイズ(width, height)を指定せず、その代わり、絶対位置にして、top, right, bottom, leftの値をすべて「0」にしておきます。
figure .blur-img { position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-position: center; background-size: cover; -webkit-filter: blur(10px); filter: blur(10px); margin: -10px; /* blurの値と同じ値だけマイナス */ }
imgタグによる画像の場合
次に、img
タグで画像を表示し、その要素に対してフィルターでブラー効果を施した場合のHTMLとCSSのの構造のサンプルを解説します。
HTMLの構造
figure
要素内に、画像を表示するためのimg
要素を追加し、src
属性に画像のURLを指定します。
<figure> <img src="画像のURL" class="blur-img" /> </figure>
CSSの構成
今回のサンプルでは、親にあたるfigure
要素にサイズが指定されているので、ブラーを施すimg
タグ(.blur-img
セレクタ)は親要素の幅いっぱいに表示するために、width:100%
としたいところですが、これではfilter:blur
でフチがぼやけてしまうため、幅はブラーの度合い分を拡大して非表示のオーバーフローした部分にぼやけたフチを隠すために、width:calc(100% + 20px)
とします。
20ピクセルとなっているのは、左右の10ピクセルを足しているためです。
figure .blur-img { position: absolute; top: 0; left: 0; -webkit-filter: blur(10px); filter: blur(10px); margin: -10px; /* blurの値と同じ値だけマイナス */ width: calc(100% + 20px); /* 左右の10ピクセル分加算 */ }
いかがでしたか?
background-image
とimg
タグそれぞれでのfilter:blur
のフチのぼやけ対策をご紹介しましたが、考え方さえわかれば、とても簡単ですね!
以前のスクロールブラーのデモに活かしてみる
過去に投稿した「スクロールに合わせて画像が徐々にぼやけていくエフェクトを施す方法」のデモを改良して、上記の方法でfilter:blur
で発生するフチのぼやけをなくしてみました。
See the Pen Blurring image gradually by scroll (Sharpen blurred edges) by digistate (@digistate) on CodePen.