SVGとCSSで画像の境界線をぼかす。

〽️周りだけをぼかす仕組み。 〽️マスクしてみよう。 〽️アニメーションさせてみる。





⬆︎SVGついてのまとめページ、CSSアニメーションの基本コーナーはこちら。

こんにちは、「ふ」です。
今回はSVGのmask効果を使って、「画像の周りだけをぼかす」方法について紹介します。SVGアニメーションのコーナーなので、もちろん動かしますよ♪

ときに、全体ぼかしならCSSで十分。

#element { filter: blur(4px); }

画像全体のぼかしについては、CSSのfliterを使うことで実装できますが、画像自体はある程度鮮明に表示して、まわり(境界線)だけをぼかすとなると〜どうでしょうか?

⬆︎は境界線をくっきり/ぼかすの比較です。 画像要素の輪郭をぼかすことで、脳内イメージの表現やどこかレトロ風な画像切り替えに使えそうです。
もちろん画像は差し替えることもできるし、SVGなので自由な形状でトリミングすることが可能です。

周りだけをぼかす仕組み。


SVGのマスク要素は、マスクを掛けられたオブジェクトに自身の「不透明度」を移植するものでした。

黒(#000000)でマスクした部分は完全な透明に、白(#ffffff)でマスクした部分は完全な不透明に成増。

ところで、ここに白い楕円のオブジェクトがあります(背景は見やすいように色を付けています)。
このオブジェクトにCSSでぼかしフィルターを掛けてみましょう。

#element { filter:blur(10px); }

白楕円がぼやけました。

「ぼやけた」といってもよく見てみると、オブジェクトの内側はほとんど不透明な白(#fff)です。境界線部分についてはぼやけて不透明度が低くなっています。

「不透明度を移植する」働きを持つSVGのマスク要素に、このぼかしフィルターを施した白いオブジェクト(周りはじんわり透明、真ん中は不透明)を使ってみるとどうでしょうか。
マスクされる側の画像は「境界線はぼやけて、内部ははっきり表示」されるのでは?

〜いけそうですよ🎵

SVGのマスク要素については、⬇︎の記事で詳しく紹介しています。

SVG アニメーション、パスの内側を切り抜いて透過させる。

2021.03.18
不透明度を移植する。


マスクしてみよう。


では実際に上手くいくか試してみましょう。
マスク用のオブジェクトには長方形を用意しました。長方形はベクターソフトで作りましたが、もちろんSVGコードで書いてしまっても構いません。

わかりやすいように現時点では線に色を付けています。「塗り」はもちろん#ffffff(完全な不透明)です。

<svg viewBox="0 0 841.9 595.3"> <rect x="144.3" y="93.6" width="553.2" height="408" fill = "#fff" stroke = "#00A0E9"/> </svg>

SVGで書き出したもの⬆︎です。
ここに好きな画像を貼り付けましょう。

<svg viewBox="0 0 841.9 595.3"> 「「1<image xlink:href = "fu.png"/>」」 <rect x="144.3" y="93.6" width="553.2" height="408" fill = "#fff" stroke = "#00A0E9"/> </svg>

現在の状態をブラウザで表示するとこの⬆︎ように。
ここからぼかしとマスクを施します。

<image id = 「「5"img1"」」 xlink:href = "fu.png"/> 「「1<mask id = 「「5"mask1"」」>」」 bb<rect id = 「「5"rect1"」」 x="144.3" y="93.6" width="553.2" height="408" fill = "#fff" stroke = "#00A0E9"/> 「「1</mask>」」

長方形要素を<mask> 〜 </mask>で囲んでマスク要素として定義します。id名を「mask1」としました。
この時点で描画要素ではなくなるので、ブラウザ上には表示されなく成増。
さらにマスク要素になってしまった長方形要素にもid名「rect1」、貼り付けた画像にはid名「img1」としておきます。

■ CSS

「「3/* mask用の長方形をぼかす */」」 #rect1 { filter:blur(10px); } 「「3/* 定義したmask要素で画像をマスク */」」 #img1 { mask:url(mask1); }

できました。画像の真ん中部分は鮮明なままで、境界線のところだけがぼやけています。
ちなみに元の長方形には線の色を「#00A0E9」としていたのですが、mask要素として定義した段階で線の色は反映されなくなるので、コードを削除する必要は特にありません。

アニメーションさせてみる。


「画像の境界線をぼかす」方法、あっさりとできてしまいました。
せっかくなのでアニメーションさせてみましょう。

#rect1 { filter:blur(10px); transform-origin:center; animation:rect1 2s linear alternate infinite; } @keyframes rect1 { from { transform:scale(0); } to { transfrom:scale(1.5); } }

animationは<mask>要素ではなくその中にある<rect>に施すとうまくいきます。
今回のサンプルでは長方形を使いました。でももちろん、SVGで作ったオブジェクトなので自由な形状でマスクすることができます。
楕円系を使えば、「回想シーン」っぽくなりそうです。またblurの値は「10px」となっていますが、色々変えてみて変化を楽しんでください。

最後までお読みくださり、ありがとうございました。
じつは最初、「画像の境界線をぼかす方法」を考えたときに「グラデーションを使うか? そのオフセットを動かすか?」などと手の込んだことをあれこれ考えていた「ふ」でした。
しかし記事完成直前に「CSSとマスクでできるやん!」と気付いてしまい、コンテンツをゼロから書き直した次第です。

「発想の転換」って大切ですね!
ではまた〜 ♩♩♩




SVGに画像をぴったりと配置〜
preserveAspectRatio。

2021.02.19
縦横比が違っても安心。

SVG アニメーション、カメラのシャッターを再現。

2021.04.11
「アニメーションごと」重ねていく。











「ふ」です。

swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。