<!DOCTYPE html>
<body>
  <canvas id="canvas" width="300" height="300"></canvas>
</body>
<script>
  /*
  The shadow and shadow blur effects should be the same regardless if they were
  defined with filters or properties. The blur parameter is set as double when
  using the shadowBlur property since its uses havlf of the value set as the
  standard deviation for the gaussian blur (https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowblur-dev)
  while the filter parameter is used directly as the standard deviation
  (https://drafts.fxtf.org/filter-effects/#funcdef-filter-drop-shadow). The
  fuzziness is defined with a maxDifference of 13 as to be the 5% of 256, since
  the CSS spec defines the expected behavior in relation to an ideal Gaussian blur
   with a tolerance of 5%. See: https://drafts.csswg.org/css-backgrounds-3/#shadow-blur.
  */
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.shadowOffsetX = 10;
  ctx.shadowOffsetY = 10;
  ctx.shadowBlur = 4;
  ctx.shadowColor = 'red';
  ctx.fillRect(20, 20, 50, 50);
  ctx.shadowBlur = 8;
  ctx.shadowColor = 'blue';
  ctx.fillRect(100, 20, 50, 50);
  ctx.shadowBlur = 20;
  ctx.shadowColor = 'yellow';
  ctx.fillRect(20, 100, 50, 50);
  ctx.shadowBlur = 30;
  ctx.shadowColor = 'cyan';
  ctx.fillRect(100, 100, 50, 50);
</script>
