I’m trying to draw multiple strokes on a canvas and I’d like them to have a common shadow. Currently the cast shadows on one another which is not what I want.
Ideal result

What I’ve tried
- Creating shadow using
ctx.shadowColorjsfiddle - Creating shadow using
ctx.filterjsfiddle - Creating shadow using css
box-shadowon the canvas — draws shadow on the whole box - Creating shadow using css
filteron the canvas — draws shadow on the whole box
Advertisement
Answer
You can use Path2D and add all your segments to one path, then do the stroke to that path.
Here is your jsfiddle using ctx.filter with my recommendation.
const segments = [
[{x: 10, y: 50}, {x: 50, y: 50}],
[{x: 50, y: 10}, {x: 50, y: 50}],
[{x: 90, y: 50}, {x: 50, y: 50}],
[{x: 50, y: 90}, {x: 50, y: 50}],
]
let path = new Path2D()
segments.forEach(segment => {
path.moveTo(segment[0].x, segment[0].y)
path.lineTo(segment[1].x, segment[1].y)
})
const ctx = document.getElementById('my-canvas').getContext('2d')
ctx.lineWidth = 5
ctx.filter = 'drop-shadow(-3px -3px 3px #f00)';
ctx.strokeStyle = 'black'
ctx.stroke(path)<canvas width="100" height="100" id="my-canvas" style="background: #00ff00"/>
You can read more about Path2D here:
https://developer.mozilla.org/en-US/docs/Web/API/Path2D/Path2D