Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enable responsive design for Fabric.js

Is there a way to make a Fabric.js canvas resize with the browser to enable the same result on any device? I'm talking about responsive design.

Has anyone a code example?

like image 546
gco Avatar asked Feb 21 '14 10:02

gco


People also ask

What is the upgrade guide for fabric JS?

Upgrade Guide - A summary of major changes across each major Fabric.js release v4.0 Breaking Changes - A guide on the breaking changes within Fabric.js v.4x Changelog v2.x and up - Fabric.js current release highlights

What is the Best CSS framework for Responsive design?

All popular CSS Frameworks offer responsive design. They are free, and easy to use. W3.CSS is a modern CSS framework with support for desktop, tablet, and mobile design by default. W3.CSS is smaller and faster than similar CSS frameworks. W3.CSS is designed to be a high quality alternative to Bootstrap.

What is HTML responsive web design?

HTML Responsive Web Design. ❮ Previous Next ❯. Responsive Web Design is about using HTML and CSS to automatically resize, hide, shrink, or enlarge, a website, to make it look good on all devices (desktops, tablets, and phones): Try it Yourself ». Note: A web page should look good on any device!

How do I make my website look responsive?

Using W3.CSS. A great way to create a responsive design, is to use a responsive style sheet, like W3.CSS W3.CSS makes it easy to develop sites that look nice at any size; desktop, laptop, tablet, or phone:


2 Answers

This jsFiddle is a working solution. It is inspired by this github issue.

These are the required things:

A div that surrounds the canvas that is controlled by fabric.

<div class="fabric-canvas-wrapper">
    <canvas id="theCanvas"></canvas>
</div>

And a window resize handler that triggers the calculation and setting of the new canvas dimension and the zoom.

window.onresize = resizeCanvas() {
    const outerCanvasContainer = document.getElementById('fabric-canvas-wrapper');

    const ratio          = canvas.getWidth() / canvas.getHeight();
    const containerWidth = outerCanvasContainer.clientWidth;
    const scale          = containerWidth / canvas.getWidth();
    const zoom           = canvas.getZoom() * scale;

    canvas.setDimensions({width: containerWidth, height: containerWidth / ratio});
    canvas.setViewportTransform([zoom, 0, 0, zoom, 0, 0]);
}

That's all. It seems to work perfectly. Please let me know if any issues come up with this solution.

I have used fabric.js in version 3.6.2.

like image 147
robsch Avatar answered Oct 22 '22 22:10

robsch


Basically you need to get the device screen's width and height. Afterwards just resize the canvas accordingly in your Javascript. Example:

var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
var height = (window.innerHeight > 0) ? window.innerHeight : screen.height;
var canvas = document.getElementById("canvas");
canvas.width = width;
canvas.height = height;

You might have screens with varying resolution ratios though, what I usually do in this case is calculate your original width's and the device's width ratio and then adjust both width and height accordingly with that value. Example:

var originalWidth = 960;  //Example value
var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
var widthRatio = originalWidth / width;
canvas.width *= widthRatio;
canvas.height *= widthRatio;

This usually works fine for me on any device, hope this helps.

like image 38
Joao Avatar answered Oct 22 '22 23:10

Joao