CSS Blend Modes: The Art of Layered Visuals
Understanding Blend Modes
If you've used Photoshop or other image editing software, you're surely familiar with "layer blend modes." When two layers overlap, the upper layer doesn't always completely obscure the lower one; instead, they can "blend" through different algorithms, creating various visual effects. CSS Blend Modes bring this capability to the web.
Imagine you have two slides: one with a red circle, the other with a blue square. If you overlay them on a projector, depending on the material (transparent film, colored glass, mirror surface, etc.), the overlapping area will produce different visual effects: perhaps purple, perhaps brighter blue, or perhaps complex textures. CSS Blend Modes allow us to precisely control this "overlay effect."
CSS provides two main properties to control blending:
- mix-blend-mode: Controls how an element blends with its parent and sibling content
- background-blend-mode: Controls blending between multiple background layers of an element or between background images and colors
mix-blend-mode: Element Blending
mix-blend-mode defines how an element blends with the content of its parent element and sibling elements.
Basic Syntax
.element {
mix-blend-mode: normal; /* Default, no blending */
mix-blend-mode: multiply; /* Multiply */
mix-blend-mode: screen; /* Screen */
mix-blend-mode: overlay; /* Overlay */
/* ...and many more modes */
}Core Blend Modes Detailed
normal - Normal Mode
Default value, no blending, upper layer completely obscures lower layer:
.normal {
mix-blend-mode: normal;
}multiply - Multiply
Multiplies the color values of the upper and lower layers, result is always darker. Similar to overlapping two slides:
.multiply {
mix-blend-mode: multiply;
}Features:
- White becomes transparent (white × any color = that color)
- Black stays black (black × any color = black)
- Other colors become darker
Practical scenario - Text融入 background:
<div class="hero">
<h1 class="blend-title">Amazing Design</h1>
</div>.hero {
background: url("colorful-bg.jpg");
background-size: cover;
padding: 100px 0;
}
.blend-title {
font-size: 120px;
font-weight: bold;
color: white;
mix-blend-mode: multiply;
/* White text blends with background through multiply,
presenting background colors while maintaining text shape */
}screen - Screen
Opposite of multiply, multiplies inverted color values then inverts back, result is always lighter. Similar to projector light overlapping:
.screen {
mix-blend-mode: screen;
}Features:
- Black becomes transparent (black + any color = that color)
- White stays white
- Other colors become lighter
Practical scenario - Glow effect:
.glow-effect {
position: relative;
}
.glow-effect::after {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(circle, rgba(255, 255, 255, 0.8), transparent);
mix-blend-mode: screen;
pointer-events: none;
}overlay - Overlay
Combines multiply and screen: dark areas become darker, light areas become lighter, mid-tones stay the same. Increases contrast:
.overlay {
mix-blend-mode: overlay;
}Practical scenario - Texture overlay:
.textured-card {
background-color: #3498db;
position: relative;
}
.textured-card::before {
content: "";
position: absolute;
inset: 0;
background-image: url("texture.png");
mix-blend-mode: overlay;
opacity: 0.3;
}darken - Darken
Compares each color channel of upper and lower layers, choosing the darker value:
.darken {
mix-blend-mode: darken;
}lighten - Lighten
Opposite of darken, chooses the brighter value:
.lighten {
mix-blend-mode: lighten;
}color-dodge - Color Dodge
Makes bright colors brighter, creating high-contrast effects:
.color-dodge {
mix-blend-mode: color-dodge;
}Practical scenario - Neon light effect:
.neon-text {
color: #ff00ff;
text-shadow: 0 0 20px currentColor;
mix-blend-mode: color-dodge;
}color-burn - Color Burn
Makes dark colors darker, increases saturation:
.color-burn {
mix-blend-mode: color-burn;
}difference - Difference
Calculates the difference between upper and lower layer colors, creating inversion effects:
.difference {
mix-blend-mode: difference;
}Practical scenario - Always visible cursor or highlight:
.cursor-highlight {
position: absolute;
width: 40px;
height: 40px;
background: white;
border-radius: 50%;
mix-blend-mode: difference;
pointer-events: none;
}No matter the background color, this highlight remains clearly visible.
exclusion - Exclusion
Similar to difference but with lower contrast, more subtle effect:
.exclusion {
mix-blend-mode: exclusion;
}hue - Hue
Keeps lower layer's lightness and saturation, uses upper layer's hue:
.hue {
mix-blend-mode: hue;
}Practical scenario - Monochrome color images:
.colorize {
position: relative;
}
.colorize::before {
content: "";
position: absolute;
inset: 0;
background-color: #ff6b6b; /* Desired color */
mix-blend-mode: hue;
}saturation - Saturation
Keeps lower layer's lightness and hue, uses upper layer's saturation:
.saturation {
mix-blend-mode: saturation;
}color - Color
Keeps lower layer's lightness, uses upper layer's hue and saturation:
.color {
mix-blend-mode: color;
}luminosity - Luminosity
Keeps lower layer's hue and saturation, uses upper layer's lightness:
.luminosity {
mix-blend-mode: luminosity;
}background-blend-mode: Background Blending
background-blend-mode controls blending between an element's multiple background images, or between background images and colors.
Basic Usage
.element {
background-image: url("image1.jpg"), url("image2.jpg");
background-blend-mode: multiply;
}Practical: Creative Background Effects
Duotone Effect
.duotone {
background-image: linear-gradient(to right, #ff6b6b, #4ecdc4),
url("portrait.jpg");
background-blend-mode: multiply;
background-size: cover;
background-position: center;
}This creates an effect similar to Spotify album covers.
Gradient Overlay
.gradient-overlay {
background-image: linear-gradient(
135deg,
rgba(52, 152, 219, 0.8),
rgba(142, 68, 173, 0.8)
),
url("background.jpg");
background-blend-mode: overlay;
background-size: cover;
}Texture Blending
.textured-bg {
background-color: #2c3e50;
background-image: url("paper-texture.png");
background-blend-mode: multiply;
}Multiple Blending
Different blend modes can be specified for each background layer:
.complex-blend {
background-image: linear-gradient(45deg, rgba(255, 0, 0, 0.3), transparent),
url("texture.png"), url("photo.jpg");
background-blend-mode: screen, overlay;
/* First gradient uses screen, texture uses overlay, photo as base */
}Practical Application Cases
Case 1: Dynamic Text Effects
Create text that changes color with the background:
<div class="dynamic-bg">
<h1 class="blend-text">Dynamic Text</h1>
</div>.dynamic-bg {
background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
padding: 100px;
animation: gradient-shift 5s ease infinite;
}
@keyframes gradient-shift {
0%,
100% {
background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
}
50% {
background: linear-gradient(45deg, #f093fb 0%, #f5576c 100%);
}
}
.blend-text {
font-size: 100px;
font-weight: bold;
color: white;
mix-blend-mode: difference;
/* Text color inverts with background, always visible and dynamically changing */
}Case 2: Image Mask Effect
<div class="image-mask">
<img src="photo.jpg" alt="Photo" />
<div class="mask"></div>
</div>.image-mask {
position: relative;
width: 500px;
height: 500px;
}
.image-mask img {
width: 100%;
height: 100%;
object-fit: cover;
}
.mask {
position: absolute;
inset: 0;
background: linear-gradient(
45deg,
transparent 30%,
rgba(255, 255, 255, 0.5) 50%,
transparent 70%
);
background-size: 200% 200%;
mix-blend-mode: overlay;
animation: shine 3s infinite;
}
@keyframes shine {
from {
background-position: -100% -100%;
}
to {
background-position: 200% 200%;
}
}This creates a moving shine effect over the image.
Case 3: Hover Blending Effects
.gallery-item {
position: relative;
overflow: hidden;
}
.gallery-item img {
transition: transform 0.5s;
}
.gallery-item:hover img {
transform: scale(1.1);
}
.gallery-item::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(135deg, #667eea, #764ba2);
opacity: 0;
mix-blend-mode: color;
transition: opacity 0.5s;
pointer-events: none;
}
.gallery-item:hover::before {
opacity: 0.8;
}On hover, images get colorized, creating movie poster-like effects.
Case 4: Brand Colorization
Colorize black and white logos to brand colors:
.logo-container {
position: relative;
background-color: #3498db; /* Brand color */
}
.logo-container img {
/* Assume logo is black icon */
mix-blend-mode: lighten;
/* Black parts will show brand color, white background stays white */
}Case 5: Text Cutout Effect
<div class="cutout-text-container">
<h1 class="cutout-text">HOLLOW</h1>
</div>.cutout-text-container {
background: url("colorful-bg.jpg") center/cover;
padding: 100px;
position: relative;
}
.cutout-text-container::before {
content: "";
position: absolute;
inset: 0;
background: white;
}
.cutout-text {
position: relative;
font-size: 150px;
font-weight: bold;
color: black;
mix-blend-mode: multiply;
/* Black text lets background show through through multiply,
creating text cutout effect */
}Performance Considerations
Blend modes trigger browser compositing layers and can affect performance:
Optimization Suggestions
- Avoid large area usage: Limit the scope of blend modes
/* ❌ Poor performance: entire page blending */
body {
mix-blend-mode: multiply;
}
/* ✅ Better: limit to specific elements */
.specific-element {
mix-blend-mode: multiply;
}- Use transform to improve performance:
.blended {
mix-blend-mode: multiply;
transform: translateZ(0); /* Create separate compositing layer */
}- Avoid changing blend modes in animations:
/* ❌ Poor performance */
@keyframes bad {
from {
mix-blend-mode: normal;
}
to {
mix-blend-mode: multiply;
}
}
/* ✅ Better: use opacity to control blend intensity */
.better {
position: relative;
}
.better::before {
content: "";
position: absolute;
inset: 0;
background: /* some color or pattern */;
mix-blend-mode: multiply; /* Fixed blend mode */
opacity: 0;
transition: opacity 0.3s;
}
.better:hover::before {
opacity: 1;
}Browser Compatibility
Blend modes have good support in modern browsers:
- mix-blend-mode: Chrome 41+, Firefox 32+, Safari 8+, Edge 79+
- background-blend-mode: Chrome 35+, Firefox 30+, Safari 8+, Edge 79+
For unsupported browsers, provide fallbacks:
.element {
/* Fallback: use semi-transparent overlay */
background-color: rgba(52, 152, 219, 0.5);
}
@supports (mix-blend-mode: multiply) {
.element {
background-color: #3498db;
mix-blend-mode: multiply;
}
}Common Issues
Issue 1: Blend Modes Not Working
Ensure elements have actual content to blend with:
/* ❌ Problem: no lower content, blending ineffective */
.isolated {
isolation: isolate; /* Create new stacking context */
mix-blend-mode: multiply;
}
/* ✅ Solution: ensure there's background or lower elements */
.container {
background: url("image.jpg");
}
.overlay {
mix-blend-mode: multiply;
}Issue 2: Blend Range Exceeds Expectations
Use isolation: isolate to limit blend range:
.container {
isolation: isolate; /* Create isolated stacking context */
}
.container .blend-element {
mix-blend-mode: multiply;
/* Only blends with content inside .container, doesn't affect outside */
}Issue 3: Text Readability Decreases
Some blend modes may reduce text readability, use with caution:
.readable-blend {
position: relative;
}
.readable-blend::before {
/* Use pseudo-element for blending, keep text clear */
content: "";
position: absolute;
inset: 0;
background: /* decorative background */;
mix-blend-mode: overlay;
z-index: -1;
}Summary
CSS Blend Modes bring image editing software-level visual control to web design:
Core Concepts:
mix-blend-modecontrols element blending with lower contentbackground-blend-modecontrols blending between background layers- 16 blend modes each have characteristics and use cases
Common Scenarios:
- Creative text effects
- Image colorization and filters
- Brand element adaptation
- Dynamic visual effects
- Texture overlay
Best Practices:
- Limit usage scope to ensure performance
- Use
isolationto control blend range - Provide fallbacks for unsupported browsers
- Pay attention to text readability
Blend modes open new dimensions of visual creativity. Use them appropriately, and you can create stunning effects that make web design more vivid and professional.