これは何
SVGを使ってノイズの背景を作る際にbackground-blend-mode
を使っていたらiOSで表示が崩れてしまったので、mix-blend-mode
にしたらうまく行ったよというメモです。
要点
要点はこんな感じです。
- SVGで生成したノイズの色味調整にCSSの
background-blend-mode
を使用していた - iOSで検証してみたら色味調整がうまくいかず、ノイズがカラフルになっていた
- 調べてみると、iOSでは
background-blend-mode
とbackground-repeat: repeat
を一緒に使うと効かなくなるらしい.. - -> 色味の調整を
mix-blend-mode
に変更したら上手くいきました
最終的に作ったSVG
<svg height="200" viewBox="0 0 200 200" width="200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<filter id="noise">
<feTurbulence
baseFrequency="0.3"
numOctaves="3"
stitchTiles="stitch"
type="fractalNoise"
/>
</filter>
<g>
<rect fill="#EDEEEE" height="100%" width="100%"/>
<rect style="mix-blend-mode: overlay;" filter="url(#noise)" height="100%" width="100%"/>
<rect style="mix-blend-mode: color;" fill="#EDEEEE" height="100%" width="100%"/>
</g>
</svg>
解説
【前提】SVGでノイズを作る
まず、SVGでfeTurbulence
を使って簡単にノイズを生成することができます。
See the Pen Noise by kabechiyo_shunkaaizawa (@kabechiyo) on CodePen.
これを活用して、よく見る「ざらっとしたテクスチャ」を表現しようとしました。
もちろんこのままの色が混ざった状態では使えないので、ここから色味を調整していきます。
background-blend-mode
で色味を調整してみる
Figmaで色々試してみたところ、「①グレーの下地のレイヤー」の上にoverlay
で「②ノイズのレイヤー」を重ね、さらにcolor
で「③グレーの色調整レイヤー」を重ねるとイメージ通りのテクスチャになることがわかりました。
早速これをCSSで再現してみます。
大体以下の手順です
- HTMLで適当なコンテナとdivを用意する
- コンテナに背景色を指定する
- divをコンテナいっぱいに広げ、
background
にノイズのSVGと背景色と同じ色を指定する - さらにdivに
background-blend-mode: overlay, color;
を指定し、色味を調整する
<section>
<div class="inner"></div> <!-- ノイズ用のdiv -->
</section>
section {
background-color: #EDEEEE;
}
.inner {
background-blend-mode: overlay, color;
background:
url(#{image_url('../image/noise.svg')}),
linear-gradient(#EDEEEE, #EDEEEE);
}
この方法でも上手くいっているかのように見えたのですが、iOSで実機検証してみるとbackground-blend-mode
が効いていませんでした..
調べてみると、iOSではbackground-blend-mode
とbackground-repeat: repeat
を一緒に使うと効かなくなるらしいです
色味の調整をmix-blend-mode
に変更する
ノイズを背景に敷き詰めたい関係上、background-repeat: repeat
を外すことはできなかったので、background-blend-mode
を使わないで実現する方法を考えました。
結論、mix-blend-mode
を使うとよりシンプルにかける&iOSでも崩れなかったのでこちらにしました。
作成したSVGはこんな感じです。
SVG内にrectを3つ作成し、それぞれを「背景」「ノイズ」「色味調整」にしています
まず背景のrectにベースとなる色を指定し、その上にノイズをmix-blend-mode: overlay
で乗せます。
さらに色味調整用のrectに色を指定してmix-blend-mode: color
で乗せています。
<svg height="200" viewBox="0 0 200 200" width="200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<filter id="noise">
<feTurbulence
baseFrequency="0.3"
numOctaves="3"
stitchTiles="stitch"
type="fractalNoise"
/>
</filter>
<g>
<rect fill="#EDEEEE" height="100%" width="100%"/> <!-- 背景 -->
<rect style="mix-blend-mode: overlay;" filter="url(#noise)" height="100%" width="100%"/> <!-- ノイズ -->
<rect style="mix-blend-mode: color;" fill="#EDEEEE" height="100%" width="100%"/> <!-- 色味調整 -->
</g>
</svg>