CSSフィルタ
画像以外にも有効です。
SVGにも有効です。(直書きもimgタグも、背景画像にも、objectで読み込んでも)
※複数適用はカンマ無しの半角スペース
フィルタ名 | 範囲 | 初期値 | 効果 |
---|---|---|---|
blur | 0px~ | 0px | ぼかし効果 |
grayscale | 0%~100% | 0% | モノクロ効果 |
sepia | 0%~100% | 0% | セピア効果 |
saturate | 0%~ | 100% | 彩度変更 |
hue-rotate | 0deg~360deg | 0deg | 色相回転 |
invert | 0%~100% | 0% | 階調反転 |
opacity | 0%~100% | 100% | 不透明度変更 |
brightness | 0%~ | 100% | 明度変更 |
contrast | 0%~ | 100% | コントラスト変更 |
drop-shadow | CSS3のdrop-shadowと同様 | - | 影効果 |
url() | - | - | 指定したSVGフィルター適用 |
Brightness
0%にすると黒、100%でオリジナルと同じ明度です。
100%以上の値を指定すると、画像を明るくできます。
img {
filter: brightness(300%);
}
Hue-rotate
0deg/360degでオリジナルと同じです。
180degで色が反転します。
img {
filter: hue-rotate(90deg);
}
Saturate
0%にすると彩度がなくなり、100%でオリジナルと同じになります。
100%以上の値を指定すると、画像を鮮やかにできます。
img {
filter: saturate(0%);
}
img {
filter: saturate(1000%);
}
Invert
0%でオリジナル画像が表示され、100%で完全に反転します。
値を50%にすると、灰色1色になります。
img {
filter: invert(100%);
}
Contrast
値を0%にすると灰色1色になります。
100%でオリジナルの画像と同じになります。
img {
filter: contrast(50%);
}
Grayscale
モノクロ写真を再現
0%でオリジナル画像が表示され、100%で完全にグレーになります。
sturate(0%)はgrayscale(100%)と同じです。
img {
filter: grayscale(100%);
}
Sepia
0%でオリジナル画像が表示され、100%で完全にセピアになります。
img {
filter: sepia(100%);
}
Blur
0pxでオリジナル画像が表示され、値が大きくなるほどぼかしの度合いが強くなります。
img {
filter: blur(5px);
}
Opacity
100%で完全に不透明、0%で完全に透明です。
(opacityプロパティと同じ)
img {
filter: opacity(75%);
}
Drop Shadow
影
shadowの種類 | 内容 |
---|---|
box-shadow | 要素全体 |
filter: drop-shadow | 画像内の透明部分 |
img {
/* filter: drop-shadow(水平方向 垂直方向 影の広がり 色の指定); */
filter: drop-shadow(5px 5px 10px #666);
}
url()メソッド
独自に作成したSVGフィルターを適用することができます。
そのデータのidを指定します。
filter: url(#id);
フィルタの重ねがけ
CSSフィルタは複数利用することができます。
適用したいフィルターを続けて入力するだけで重ねがけ可能です。
モノクロでぼかされた画像なども作成できます。
img {
filter: contrast(175%) brightness(3%);
}
ジェネレータ
SVGフィルタ
SVGにはCSSより多くのフィルタ効果があり、CSSより複雑な効果が使えます。
効果をかける対象はSVG要素に限らず、DOM要素ならなんでも効果の対象にできます。
divにフィルタをかける場合
<svg class="svgfilter">
<defs>
<filter id="GaussianBlur" width="200%" height="200%" filterUnits="userSpaceOnUse">
<feGaussianBlur stdDeviation="10" />
</filter>
</defs>
</svg>
<div class="filter"><img src="image1.jpg" alt=""></div>
.svgfilter {
width: 0;
height: 0;
}
.filter {
filter: url(#GaussianBlur);
}
filter要素のfilterUnits属性
x、y、width、height の座標系を定義します。
値 | 内容 |
---|---|
objectBoundingBox(デフォルト) | filter要素を使用している要素の比率で設定 |
userSpaceOnUse | filter要素を使用している要素に対する座標が基準 |
SVGにフィルタをかける場合
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400" >
<filter id="mergeTest" x="-100" y="-100" width="500" height="500">
<feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur" />
</filter>
<rect x="50" y="50" width="200" height="200" style="stroke: #333333; fill: #2980b9; filter: url(#mergeTest);" />
</svg>
SVGフィルターの種類
フィルタ名 | 特別な属性 |
---|---|
feBlend | in,in2,mode |
feColorMatrix | in,type,values |
feComponentTransfer | in |
feComposite | in,in2,operator,k1,k2,k3,k4 |
feConvolveMatrix | in,order,kernelMatrix,divisor,bias,targetX,targetY,edgeMode,kernelUnitLength,preserveAlpha |
feDiffuseLighting | in,surfaceScale,diffuseConstant,kernelUnitLength |
feDisplacementMap | in,in2,scale,xChannelSelector,yChannelSelector |
feDropShadow | dx,dy,stdDeviation |
feFlood | flood-color,flood-opacity |
feGaussianBlur | in,stdDeviation,edgeMode |
feImage | preserveAspectRatio,xlink:href |
feMorphology | in,operator,radius |
feOffset | in,dx,dy |
feSpecularLighting | in,surfaceScale,specularConstant,specularExponent,kernelUnitLength |
feTile | in |
feTurbulence | baseFrequency,numOctaves,seed,stitchTiles,type |
feMerge
複数フィルタ
子要素として記述したfeMergeNodeタグのin属性で指定された出力画像を、上から順番に重ねます。
描画結果では、先に書いたfeMergeNodeタグの画像が奥になります。
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400" >
<filter id="mergeTest" x="-100" y="-100" width="500" height="500">
<feOffset in="SourceGraphic" dx="100" dy="100" result="move"/>
<feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur" />
<feMerge>
<feMergeNode in="blur" />
<feMergeNode in="move" />
</feMerge>
</filter>
<rect x="50" y="50" width="200" height="200" style="stroke: #333333; fill: #2980b9; filter: url(#mergeTest);" />
</svg>
この場合、SourceGraphicはrect要素で、「ぼかし」と「移動」したものが出力されます。
属性 | 内容 |
---|---|
dx | 要素またはそのコンテンツの位置のX軸に沿った移動 |
dy | 要素またはそのコンテンツの位置のX軸に沿った移動 |
(feColorMatrix要素の)type | translate/scale/rotate/skewX/skewY |
(feTurbulence要素の)type | fractalNoise/turbulence |
in属性,in2属性
フィルタの入力元を指定する属性で、result属性で定義した名前か以下のいずれかになる
値 | 内容 |
---|---|
SourceGraphic | フィルタを適用する図形の画像 |
SourceAlpha | アルファチャンネルのみのSourceGraphic(カラーチャンネルはすべて黒になる) |
BackgroundImage | フィルタの効果範囲の背景(適用対象の図形よりも後ろの画像) |
BackgroundAlpha | アルファチャンネルのみのBackgraundAlpha |
FillPaint | 対象図形のfill属性に設定された色で塗り潰した画像を入力とする |
StrokePaint | 対象図形のstroke属性に設定された色で塗り潰した画像を入力とする |
mode属性
値 | 内容 |
---|---|
normal | feMergeと同じ |
multiply | inとin2を乗算する |
screen | 加算合成した値から乗算合成の値を減算する |
overlay | 下の色が暗い場合は乗算、下の色が明るい場合はスクリーン |
darken | inとin2の暗い方を採用 |
lighten | inとin2の明るい方を採用 |
color-dodge | 下の色を上の色の逆数で割った結果(前景が黒い場合変化無し、背景の逆色の前景は完全に明るい色) |
color-burn | 下の色を反転、値を上の色で除算し、その値を反転 |
hard-light | 上の色が暗い場合は乗算、上の色が明るい場合はスクリーン |
soft-light | hard-lightよりソフト |
difference | 明るい色から暗い色を差し引く(黒いレイヤーは効果無し、白いレイヤーは他のレイヤーの色を反転) |
exclusion | differenceとの違いは、コントラストが低くなる |
hue | 上の色の色相、下の色の彩度と明度を使用 |
saturation | 上の色の彩度、下の色の色相と明度を使用(灰色の背景は効果なし) |
color | 上の色の色相と彩度、下の色の明度を使用(グレーレベルを保持) |
luminosity | 上の色の明度、下の色の色相と彩度を使用 |
operator属性
値 | 内容 |
---|---|
over | feMergeと同じ |
in | inの画像のうち、in2と共通の領域のみを出力する |
out | inの画像から、in2と共通の領域を除いたものを出力する |
atop | in2の画像の上にoperator="in"の合成結果を重ねるて出力する |
xor | inとin2を重ねた画像から、inとin2の共通の領域を除いたものを出力する |
arithmetic | k1、k2、k3、k4の各属性値を係数として計算した結果を出力する |
光源
feDiffuseLighting
布やゴムなどの表現に適します。
feGaussianBlurは、feDiffuseLightingの入力となるハイトマップを生成します。
輪郭をぼかしたシルエット画像をハイトマップとして使います。
属性 | 内容 |
---|---|
surfaceScale | ハイトマップの高さ |
diffuseConstant | 光源の光の強さ |
lighting-color | 光源の色 |
ライトの情報は、feDiffuseLightingタグの子要素として記述
光源の種類 | 内容 |
---|---|
feDistantLight | 平行光源 |
fePointLight | 点光源 |
feSpotLight | スポットライト |
operator
feCompositeのoperator="arithmetic"で元の画像と合成します。
合成方法がarithmeticの場合、feCompositeタグにはk1~k4の4つの属性を指定できます。
feCompositeの属性 | 内容 |
---|---|
k1 | 物体の色とライティング結果は乗算にするので1 |
k2 | 不要なので0 |
k3 | 環境光をエミュレートするためにk3に適当な値を指定 |
k4 | 不要なので0 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400" >
<filter id="lighting">
<feGaussianBlur stdDeviation="8" in="SourceAlpha" />
<feDiffuseLighting surfaceScale="10" diffuseConstant="1" lighting-color="#fff" result="diffuse">
<fePointLight x="50" y="50" z="50" />
</feDiffuseLighting>
<feComposite operator="arithmetic" in="diffuse" in2="SourceGraphic" k1="1" k2="0" k3="0.5" k4="0" />
</filter>
<circle cx="100" cy="100" r="50" fill="#1e90ff" filter="url(#lighting)"/>
</svg>
※feGaussianBlurは、feDiffuseLightingで使うハイトマップを生成
feSpecularLighting
プラスチックや金属のような鏡面反射光の表現に適します。
属性 | 内容 |
---|---|
specularConstant | ライトの強さ |
specularExponent | 値を大きくすると金属的な鋭いハイライトになる |
※他の属性、ライトの指定方法はfeDiffuseLightingと同じです。 |
operator
feCompositeのoperator="arithmetic"で元の画像と合成します。
合成方法がarithmeticの場合、feCompositeタグにはk1~k4の4つの属性を指定でます。
feCompositeの属性 | 内容 |
---|---|
k1 | 合成方法を加算にするので1 |
k2 | 不要なので0 |
k3 | 合成方法を加算にするので1 |
k4 | 不要なので0 |
<filter id="lighting">
<feGaussianBlur stdDeviation="8" in="SourceAlpha" />
<feSpecularLighting surfaceScale="10" specularConstant="1" specularExponent="10" lighting-color="#fff" result="specular">
<fePointLight x="250" y="-50" z="100" />
</feSpecularLighting>
<feComposite operator="arithmetic" in="specular" in2="SourceGraphic" k1="0" k2="1" k3="1" k4="0" />
</filter>
<circle cx="100" cy="100" r="50" fill="#1e90ff" filter="url(#lighting)"/>
</svg>
※feGaussianBlurは、feDiffuseLightingで使うハイトマップを生成
学習ツール
SVG Filters
SVGフィルターをスライダーで操作して、結果を確認しながら学習できます。
mix-blend-mode
※IEとEdgeでは使えません。
mix-blend-mode: overlay;
値 | 意味 | 内容 |
---|---|---|
darken | 比較(暗) | 上下の画像を比較して暗いピクセルが表示される |
lighten | 比較(明) | 上下の画像を比較して明るいピクセルが表示される |
multiply | 乗算 | 暗い表現を作るときに使う描画モード |
color-burn | 焼きこみ | 乗算よりもより暗くなる描画モード |
screen | スクリーン | 明るい表現を作るときに使う |
color-dodge | 覆い焼き | スクリーンよりもより明るくなる |
overlay | オーバーレイ | 乗算とスクリーンの両方に近い効果 |
soft-light | ソフトライト | 明るい部分はさらに明るく、暗い部分はさらに暗くする |
hard-light | ハードライト | ソフトライトよりも強い効果が得られる |
difference | 差の絶対値 | 二枚の画像の違いを可視化 |
exclusion | 除外 | 差の絶対値よりも弱い効果が得られる |
hue | 色相 | 下レイヤーの輝度と彩度、上レイヤーの色相 |
saturation | 彩度 | 下レイヤーの輝度と色相、上位レイヤー彩度 |
color | カラー | 下レイヤーの輝度、上位レイヤーの彩度と色相 |
luminosity | 輝度 | HSL色空間で合成 下レイヤーの彩度と色相、上位レイヤーの輝度 |
<div class="image1"><img src="image1.jpg" alt=""></div>
<div class="image2"><img src="image2.jpg" alt=""></div>
.image1 {
position: absolute;
z-index: 0;
}
.image2 {
position: absolute;
z-index: 1;
mix-blend-mode: luminosity;
}