ブレンドモードとして明度を使用して、ワンステップでそれを行うことができます。
このモードでは、明度は前面レイヤー (画像) から取得され、色相と彩度は背景 (ここでは単色) から取得されます。
次のデモでは、クラスを介してカラー フィルターを割り当てることもできます。
.test {
width: 400px;
height: 200px;
margin: 10px;
background-size: cover;
background-image: url(http://placekitten.com/1000/750);
}
.test:hover {
background-blend-mode: luminosity;
}
.red {
background-color: red;
}
.green {
background-color: greenyellow;
}
<div class="test red"></div>
<div class="test green"></div>
画像の黒が(黒の代わりに)完全な飽和色を与える別の解決策。設定が少し複雑ですが、達成可能です。
.test {
width: 400px;
height: 200px;
background-size: cover;
background-color: white;
background-image: linear-gradient(red, red), url(http://placekitten.com/1000/750);
background-blend-mode: screen, luminosity;
}
<div class="test"></div>
この効果を再利用可能なクラスとして実現する方法。画像はすでに要素上にあり、クラスを設定して効果を設定し、色用に別のクラスを設定しただけです。
したがって、シーケンスは次のようにする必要があります。
- 最初のレイヤー = 白
- 2 番目のレイヤーは画像で、ブレンドは明度に設定されています。このようにして、画像の明度が白と組み合わされ、明度が高い場合は白、明度が低い場合は黒になります (つまり、グレースケール フィルター)。
- 3 番目のレイヤーは単色で、ブレンドがスクリーンに設定されています。これにより、白は白のままですが、黒が色に変わります。
独立したクラスでこれらすべてを簡単に設定できるようにするために、最終的なブレンドに疑似要素を使用する必要があります。これは、 background-blend の代わりに mix-blend で設定されます:
#cat {
width: 760px;
height: 560px;
background-image: url(http://placekitten.com/1000/750);
}
.test {
background-color: white;
background-position: 0px 0px;
background-size: cover;
background-blend-mode: luminosity;
position: relative;
}
.test:after {
content: "";
position: absolute;
left: 0px;
top: 0px;
right: 0px;
bottom: 0px;
mix-blend-mode: screen;
pointer-events: none;
}
.blue:after {
background-color: blue;
}
<div class="test blue" id="cat"></div>