20 CSS Image Hover Effects 07 / 20
CSS Image Color Overlay Tint on Hover
Brand-tint hover where a per-card accent colour washes over a neutral image using mix-blend-mode to preserve the underlying texture.
The code
<div class="ih-07">
<div class="ih-07__grid">
<div class="ih-07__card">
<div class="ih-07__img ih-07__img--1"><span class="ih-07__icon">🏗️</span></div>
<div class="ih-07__tint"></div>
<span class="ih-07__corner-tag">Brand A</span>
<div class="ih-07__label"><p class="ih-07__name">Ember Orange Tint</p></div>
</div>
<div class="ih-07__card">
<div class="ih-07__img ih-07__img--2"><span class="ih-07__icon">💡</span></div>
<div class="ih-07__tint"></div>
<span class="ih-07__corner-tag">Brand B</span>
<div class="ih-07__label"><p class="ih-07__name">Pacific Blue Tint</p></div>
</div>
<div class="ih-07__card">
<div class="ih-07__img ih-07__img--3"><span class="ih-07__icon">🔮</span></div>
<div class="ih-07__tint"></div>
<span class="ih-07__corner-tag">Brand C</span>
<div class="ih-07__label"><p class="ih-07__name">Deep Violet Tint</p></div>
</div>
</div>
</div> <div class="ih-07">
<div class="ih-07__grid">
<div class="ih-07__card">
<div class="ih-07__img ih-07__img--1"><span class="ih-07__icon">🏗️</span></div>
<div class="ih-07__tint"></div>
<span class="ih-07__corner-tag">Brand A</span>
<div class="ih-07__label"><p class="ih-07__name">Ember Orange Tint</p></div>
</div>
<div class="ih-07__card">
<div class="ih-07__img ih-07__img--2"><span class="ih-07__icon">💡</span></div>
<div class="ih-07__tint"></div>
<span class="ih-07__corner-tag">Brand B</span>
<div class="ih-07__label"><p class="ih-07__name">Pacific Blue Tint</p></div>
</div>
<div class="ih-07__card">
<div class="ih-07__img ih-07__img--3"><span class="ih-07__icon">🔮</span></div>
<div class="ih-07__tint"></div>
<span class="ih-07__corner-tag">Brand C</span>
<div class="ih-07__label"><p class="ih-07__name">Deep Violet Tint</p></div>
</div>
</div>
</div>.ih-07,.ih-07 *,.ih-07 *::before,.ih-07 *::after{margin:0;padding:0;box-sizing:border-box}
.ih-07 ::selection{background:#f97316;color:#000}
.ih-07{
--bg:#0d0d0f;--text:#f1f5f9;--muted:#94a3b8;
--duration:0.38s;--ease:cubic-bezier(0.25,0.46,0.45,0.94);
font-family:system-ui,sans-serif;background:var(--bg);padding:40px 24px;
min-height: 100vh;display:flex;align-items:center;justify-content:center;
}
.ih-07__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;max-width:780px;width:100%}
.ih-07__card{position:relative;border-radius:14px;overflow:hidden;aspect-ratio:1;cursor:pointer}
.ih-07__img{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;transition:transform var(--duration) var(--ease)}
.ih-07__img--1{background-image: url('https://picsum.photos/seed/landscape-orange/600/600'), linear-gradient(135deg,#111827,#1f2937,#374151); background-size: cover; background-position: center; background-repeat: no-repeat}
.ih-07__img--2{background-image: url('https://picsum.photos/seed/landscape-blue/600/600'), linear-gradient(135deg,#0c0c0c,#1c1c1e,#2c2c2e); background-size: cover; background-position: center; background-repeat: no-repeat}
.ih-07__img--3{background-image: url('https://picsum.photos/seed/landscape-violet/600/600'), linear-gradient(135deg,#0f0f14,#1a1a24,#252535); background-size: cover; background-position: center; background-repeat: no-repeat}
.ih-07__card:hover .ih-07__img{transform:scale(1.06)}
.ih-07__icon{font-size:56px;opacity:0.5;transition:opacity var(--duration) var(--ease)}
.ih-07__card:hover .ih-07__icon{opacity:0.2}
/* The tint overlay uses a CSS custom property for the brand colour per card */
.ih-07__tint{
position:absolute;inset:0;
background:var(--tint-color);
opacity:0;
transition:opacity var(--duration) var(--ease);
mix-blend-mode:color; /* blend mode keeps underlying texture visible */
}
.ih-07__card:hover .ih-07__tint{opacity:0.7}
/* Dark overlay under the text (separate from tint so blend mode doesn't affect it) */
.ih-07__label{
position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;
justify-content:center;gap:6px;
}
.ih-07__name{font-size:14px;font-weight:700;color:var(--text);opacity:0;transform:scale(0.9);transition:opacity var(--duration) var(--ease),transform var(--duration) var(--ease)}
.ih-07__card:hover .ih-07__name{opacity:1;transform:none}
.ih-07__card:first-child { --tint-color: #f97316; } /* orange */
.ih-07__card:nth-child(2) { --tint-color: #3b82f6; } /* blue */
.ih-07__card:nth-child(3) { --tint-color: #8b5cf6; } /* violet */
.ih-07__corner-tag{
position:absolute;top:10px;left:10px;
background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.1);
border-radius:6px;padding:3px 8px;font-size:10px;font-weight:600;color:var(--muted);
}
@media(prefers-reduced-motion:reduce){.ih-07__img,.ih-07__tint,.ih-07__icon,.ih-07__name{transition:none}.ih-07__tint{opacity:0.5}.ih-07__name{opacity:1;transform:none}} .ih-07,.ih-07 *,.ih-07 *::before,.ih-07 *::after{margin:0;padding:0;box-sizing:border-box}
.ih-07 ::selection{background:#f97316;color:#000}
.ih-07{
--bg:#0d0d0f;--text:#f1f5f9;--muted:#94a3b8;
--duration:0.38s;--ease:cubic-bezier(0.25,0.46,0.45,0.94);
font-family:system-ui,sans-serif;background:var(--bg);padding:40px 24px;
min-height: 100vh;display:flex;align-items:center;justify-content:center;
}
.ih-07__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;max-width:780px;width:100%}
.ih-07__card{position:relative;border-radius:14px;overflow:hidden;aspect-ratio:1;cursor:pointer}
.ih-07__img{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;transition:transform var(--duration) var(--ease)}
.ih-07__img--1{background-image: url('https://picsum.photos/seed/landscape-orange/600/600'), linear-gradient(135deg,#111827,#1f2937,#374151); background-size: cover; background-position: center; background-repeat: no-repeat}
.ih-07__img--2{background-image: url('https://picsum.photos/seed/landscape-blue/600/600'), linear-gradient(135deg,#0c0c0c,#1c1c1e,#2c2c2e); background-size: cover; background-position: center; background-repeat: no-repeat}
.ih-07__img--3{background-image: url('https://picsum.photos/seed/landscape-violet/600/600'), linear-gradient(135deg,#0f0f14,#1a1a24,#252535); background-size: cover; background-position: center; background-repeat: no-repeat}
.ih-07__card:hover .ih-07__img{transform:scale(1.06)}
.ih-07__icon{font-size:56px;opacity:0.5;transition:opacity var(--duration) var(--ease)}
.ih-07__card:hover .ih-07__icon{opacity:0.2}
/* The tint overlay uses a CSS custom property for the brand colour per card */
.ih-07__tint{
position:absolute;inset:0;
background:var(--tint-color);
opacity:0;
transition:opacity var(--duration) var(--ease);
mix-blend-mode:color; /* blend mode keeps underlying texture visible */
}
.ih-07__card:hover .ih-07__tint{opacity:0.7}
/* Dark overlay under the text (separate from tint so blend mode doesn't affect it) */
.ih-07__label{
position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;
justify-content:center;gap:6px;
}
.ih-07__name{font-size:14px;font-weight:700;color:var(--text);opacity:0;transform:scale(0.9);transition:opacity var(--duration) var(--ease),transform var(--duration) var(--ease)}
.ih-07__card:hover .ih-07__name{opacity:1;transform:none}
.ih-07__card:first-child { --tint-color: #f97316; } /* orange */
.ih-07__card:nth-child(2) { --tint-color: #3b82f6; } /* blue */
.ih-07__card:nth-child(3) { --tint-color: #8b5cf6; } /* violet */
.ih-07__corner-tag{
position:absolute;top:10px;left:10px;
background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.1);
border-radius:6px;padding:3px 8px;font-size:10px;font-weight:600;color:var(--muted);
}
@media(prefers-reduced-motion:reduce){.ih-07__img,.ih-07__tint,.ih-07__icon,.ih-07__name{transition:none}.ih-07__tint{opacity:0.5}.ih-07__name{opacity:1;transform:none}}How this works
Each card sets a --tint-color CSS custom property. An overlay div reads this property for its background and uses mix-blend-mode: color, which replaces only the hue and saturation of the pixels beneath it while preserving their luminosity. The result is the image appears to shift colour without losing its tonal structure — much like a coloured gel on a lighting fixture.
The overlay's opacity transitions from 0 to 0.7 on hover. The blend mode is kept on a separate layer from the text so the text element is not affected by the color blend. This approach means a single overlay rule handles any colour by simply changing the custom property.
Customize
- Change the blend mode to
multiplyfor a darker, ink-wash effect, orscreenfor a lighter, overexposed look. - Set the tint per card with an inline style:
style="--tint-color: #00f"— this lets CMS-driven content define brand colours without extra CSS classes. - Animate the tint colour on hover using
@propertyand registered custom properties for a hue-shift effect: requires Chrome 85+. - Layer two tint overlays with different blend modes and animate their opacities at different rates for complex chromatic effects.
- Reduce tint opacity to
0.4for a subtle brand wash that preserves image readability at all times.
Watch out for
mix-blend-modecreates a new stacking context — any descendants withz-indexset above the overlay will also have the blend applied to them unexpectedly.- Place the text layer in a separate element that is NOT a child of the blend-mode overlay, or use
isolation: isolateon the text wrapper to prevent it from being blended. - Safari renders
mix-blend-mode: colorslightly differently to Chrome when applied over gradients — test with your specific tint colours for any hue shift discrepancy.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 41+ | 8+ | 32+ | 41+ |
mix-blend-mode is well-supported but rendering differs slightly across engines due to colour space handling — test with target brand colours.