Mastering halftones, moiré patterns, color mixing, duotones, and animated effects
Create authentic screen-printed dot patterns using CSS radial gradients and background-size.
Simple dot grid - the foundation of halftone printing
Layer different sized dots for tonal variation
Offset dot grids create depth and color mixing
Smaller, tighter dots for delicate effects
Layer diagonal repeating gradients at different angles to create interference patterns.
Classic 45°, -45°, and 0° combination
30°, -60°, and 90° create unique interference
Mix line patterns with dot patterns
Thin lines with tight spacing for delicate effect
Let layers overlap naturally - mix-blend-mode: multiply does the work.
Blue + Yellow + Red create green, purple, orange
Gradients create smooth color blends
Combine patterns with solids for varied density
Moiré + halftone + gradient
Apply color filters to grayscale images for authentic risograph photo look.
Grayscale + color overlay with multiply
Red to light pink creates vintage poster feel
Green tones for natural, organic feeling
Combine duotone with grain filter
Add CSS animations to layers for dynamic registration shifts.
Gentle movement creates living quality
Combines movement with tiny scale changes
Each layer moves at different speeds
Trigger animation on hover
Use Case: Screen-printed look, texture, tonal variation
/* Basic formula */ background: radial-gradient( circle, [COLOR] [DOT_SIZE], transparent [DOT_SIZE] ); background-size: [SPACING] [SPACING]; /* Example */ background: radial-gradient(circle, #0078BF 1.5px, transparent 1.5px); background-size: 10px 10px; /* Variables: - DOT_SIZE: 1-4px (small to large) - SPACING: 8-20px (tight to loose) */
Use Case: Crosshatch, textile-like patterns, visual complexity
/* Basic formula */ background: repeating-linear-gradient( [ANGLE]deg, [COLOR], [COLOR] [LINE_THICKNESS], transparent [LINE_THICKNESS], transparent [SPACING] ); /* Example */ background: repeating-linear-gradient( 45deg, #0078BF, #0078BF 2px, transparent 2px, transparent 12px ); /* Tips: - Use 30°, 45°, 60° for classic moiré - Layer 2-3 different angles - 1px lines = subtle, 3px = bold */
Use Case: Creating secondary colors, depth, richness
/* Required for mixing */
.riso-layer {
position: absolute;
mix-blend-mode: multiply;
}
/* Color combinations:
Blue + Yellow = Green
Red + Blue = Purple
Red + Yellow = Orange */
Use Case: Vintage posters, editorial design
/* Method 1: Direct filter */
.photo-duotone {
filter:
grayscale(100%)
contrast(1.3)
url(#risograph-blue);
}
/* Method 2: Overlay */
<div class="duotone-wrapper">
<img src="photo.jpg"
style="filter: grayscale(100%) contrast(1.2);">
<div style="
mix-blend-mode: multiply;
background: linear-gradient(135deg, #0078BF, #4A9FD8);
"></div>
</div>
Use Case: Living designs, attention-grabbing
/* Create keyframes */
@keyframes shift {
0%, 100% { transform: translate(1px, 0.5px); }
50% { transform: translate(1.5px, 1px); }
}
/* Apply to layer */
.animated-layer {
animation: shift 4s ease-in-out infinite;
}
/* Principles:
- Small movements (0.5-2px)
- Different durations (3-5s)
- ease-in-out timing */
/* All techniques together */
<div class="riso-layers">
<!-- Animated blue halftone -->
<div class="riso-layer layer-blue
animated-layer-1
halftone-basic"></div>
<!-- Red moiré -->
<div class="riso-layer layer-red
animated-layer-2
moire-layer-2"></div>
<!-- Yellow gradient -->
<div class="riso-layer layer-yellow
animated-layer-3"
style="background: radial-gradient(...);"></div>
</div>
mix-blend-mode: multiply - Required for color mixingposition: absolute - Required for layer stackingfilter: url(#riso-grain) - Adds grain texturetransform: translate() - Registration shiftbackground-size - Controls pattern densityclip-path - Creates shapes and masksBlue: #0078BF Red: #FF5C5C Yellow: #FFE800 Green: #00A95C Purple: #765BA7 Pink: #FF48B0 Teal: #00838A Orange: #FF7D27 Black: #000000
will-change: filter on animated elementsprefers-reduced-motion media querytransform for animations (GPU accelerated)/* Halftone Dots */ background: radial-gradient(circle, COLOR SIZE, transparent SIZE); background-size: SPACING SPACING; /* Moiré Lines */ background: repeating-linear-gradient( ANGLE, COLOR, COLOR THICKNESS, transparent THICKNESS, transparent SPACING ); /* Offset Pattern */ background-position: X Y; /* Shift by half for secondary layer */ /* Color Gradient Overlay */ background: linear-gradient(ANGLE, COLOR1, COLOR2); mix-blend-mode: multiply;
/* Example 1: Halftone + Gradient */
<div class="riso-layer layer-blue"
style="background:
radial-gradient(circle, #0078BF 2px, transparent 2px),
linear-gradient(180deg, #0078BF, transparent);
background-size: 15px 15px, 100% 100%;">
</div>
/* Example 2: Moiré + Color Shift */
<div class="riso-layer layer-red"
style="background: repeating-linear-gradient(45deg, ...);
transform: translate(-1px, 1px) rotate(0.5deg);">
</div>
/* Example 3: Animated Duotone */
<img src="photo.jpg" class="duotone-riso animated-layer-1">
mix-blend-mode: multiply is appliedwill-change: transform for GPU accelerationbackground-position to adjust offsettableValues in SVG filter🎨 Design Philosophy: Authentic risograph design embraces imperfection. The grain, registration shifts, and color overlaps aren't bugs—they're features. These "flaws" give risograph its distinctive, handcrafted character. Don't over-polish. Let the technique show through.
All effects use pure CSS and SVG filters - no images or external dependencies. Everything renders in real-time, making it lightweight, scalable, and perfect for web use. Works on any HTML element: divs, text, images, SVG graphics, and more!