Skip to main content

Responsive Canvas Stage Demo

Do you need responsive/adaptive canvas for you desktop and mobile applications?

So first of all, there are many ways to make your canvas stage "responsive". And you may need a different behavior for different applications.

This demo will show you the simplest solution. We will fit a canvas stage into user window with scaling. In the demo we will care only about stage WIDTH. You may need to add extra logic if you need to fit height too.

import Konva from 'konva';

// create container div
const stageParent = document.createElement('div');
stageParent.id = 'stage-parent';
stageParent.style.width = '100%';
document.body.appendChild(stageParent);

const container = document.createElement('div');
container.id = 'container';
stageParent.appendChild(container);

// let's think our scene virtual size will be 1000x1000px
// but the real size will be different to fit user's page
const sceneWidth = 1000;
const sceneHeight = 1000;

const stage = new Konva.Stage({
  container: 'container',
  // first just set set as is
  width: sceneWidth,
  height: sceneHeight,
});

const layer = new Konva.Layer();
stage.add(layer);

// add circle into center
const circle = new Konva.Circle({
  radius: 50,
  fill: 'red',
  x: stage.width() / 2,
  y: stage.height() / 2,
});
layer.add(circle);

// rectangle in bottom right of the stage
const rect = new Konva.Rect({
  fill: 'green',
  x: stage.width() - 100,
  y: stage.height() - 100,
  width: 100,
  height: 100,
});
layer.add(rect);

function fitStageIntoParentContainer() {
  const container = document.querySelector('#stage-parent');

  // now we need to fit stage into parent container
  const containerWidth = container.offsetWidth;

  // but we also make the full scene visible
  // so we need to scale all objects on canvas
  const scale = containerWidth / sceneWidth;

  stage.width(sceneWidth * scale);
  stage.height(sceneHeight * scale);
  stage.scale({ x: scale, y: scale });
}

fitStageIntoParentContainer();
// adapt the stage on any window resize
window.addEventListener('resize', fitStageIntoParentContainer);

Instructions: Try to resize your browser window to see how the stage adapts to the container size.