53

HTML:

  <div class="canvas-wrapper">
    <canvas id="myCanvas"></canvas>
  </div>

CSS

.canvas-wrapper {
    width: 900px;
    min-height: 600px;
 }

 #myCanvas{
     border:1px solid red;
     position: absolute;
     top:22px;
     left:0px;
     height: 100%;
     width: 99%;
 }

JS

var myCanvas = new fabric.Canvas('myCanvas');

我的画布在初始化后被调整为 300x150,为什么?

4

3 回答 3

79

在最新版本中,您必须执行以下操作:

var canvas = new fabric.Canvas('myCanvas');
canvas.setHeight(500);
canvas.setWidth(800);

....你的代码....

canvas.renderAll();

对我来说很好..

对于动态改变大小,这也适用

于 2013-01-09T10:51:43.627 回答
26

初始化画布时,Fabric 读取画布元素上的宽度/高度属性或获取传入选项的宽度/高度。

var myCanvas = new fabric.Canvas('myCanvas', { width: 900, height: 600 });

或者:

<canvas width="900" height="600"></canvas>
...
var myCanvas = new fabric.Canvas('myCanvas');
于 2012-05-15T10:38:51.750 回答
1

这个问题的真正答案——不涉及新的静态大小,但实际上允许 CSS 有效——是以下选项之一:

  1. 在 CSS 中,您可以覆盖单个属性并使用 !important; 跟随它们。这样做的缺点是任何进一步的定义也必须使用 !important 否则它们将被忽略:
[width], [height], [style]
{
  width:      100vw!important;
  min-height: 100vh!important;
}
  1. 使用 JQuery,您可以将内联属性值设置为空字符串。您大概可以在没有 JQuery 的情况下实现这一点,但我将把它作为练习留给您。

Javascript(JQuery):

$('[style]').attr(  'style',  function(index, style){  return ''; });
$('[height]').attr( 'height', function(index, height){ return ''; });
$('[width]').attr(  'width',  function(index, height){ return ''; });

CSS:

*, *:before, *:after
{
  box-sizing: border-box;
}

body
{
  width:      100vw; 
  min-height: 100vh;
  padding:    0;
  margin:     0;
}

.canvas-container,
canvas
{
  width:      inherit; 
  min-height: inherit;
}

canvas.lower-canvas
{
  position: absolute;
  top:      0;
}

之后,CSS 将按预期应用。

显然也有必要将更改告诉 Fabric:

function sizeCanvas()
{
  var width  = Math.max(document.documentElement.clientWidth,  window.innerWidth  || 0);
  var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
  canvas.setHeight( height )
  canvas.setWidth( width )
}

window.addEventListener('resize', draw, false);

function initDraw()
{
  // setup
}

function draw()
{  
  canvas.renderAll();  
}

sizeCanvas();
initDraw();

这会将 Fabric 配置为视口大小,并在调整大小时保持相应大小。

值得注意的是,这个问题的出现有两个原因:

  1. 有人认为使用内联样式是一个好主意,应该受到严厉的谴责,因为在任何情况下这是不合适的做法。

  2. Fabric 更改了 DOM 排列并将原始画布嵌套在具有第二个嵌套画布的新 div 中,这可能会导致意外。

于 2017-10-05T19:17:13.710 回答