2012-05-14 24 views
28

HTML:Fabric.js thay đổi kích thước canvas của tôi để 300x150 sau khi khởi

<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'); 

canvas của tôi bị thay đổi kích cỡ để 300x150 sau khi nó được khởi tạo, tại sao?

+0

Tôi đã thêm thử nghiệm không thành công tại đây http://jsfiddle.net/QcZ54/ – user469652

Trả lời

44

trong phiên bản mới nhất, bạn sẽ phải làm một cái gì đó như:

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

.... Mã của bạn ....

canvas.renderAll(); 

Làm việc tốt cho tôi ..

+0

Đây là cách dễ nhất mà tôi đã tìm thấy để thực hiện việc này. –

+2

Bạn nên thêm điều này vào cuối để tính toán lại tất cả các vị trí đối tượng: canvas.calcOffset(); –

+3

Làm cách nào tôi có thể đặt canvas thành 100% chiều rộng và chiều cao của thành phần gốc? Tôi không hiểu tại sao điều này lại khó khăn hơn đến mức bất kỳ thành phần nào khác tôn trọng các thuộc tính css 100% và mọi câu trả lời chỉ cho thấy cách thiết lập chiều rộng/chiều cao cố định. – krb686

20

Khi khởi tạo canvas, Vải đọc thuộc tính chiều rộng/chiều cao trên phần tử canvas hoặc mất chiều rộng/chiều cao được chuyển trong tùy chọn.

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

hay:

<canvas width="900" height="600"></canvas> 
... 
var myCanvas = new fabric.Canvas('myCanvas'); 
+0

Có vẻ như chúng tôi phải thực hiện việc này. – user469652

+1

@kangax, tôi có nhiều phần tử canvas trên trang của mình và tất cả chúng được định vị trên thời gian chạy với một số phép tính js. Người dùng cũng có thể thêm các yếu tố canvas khác. Tạo fabric.canvas ("canvas1") khiến chúng mất vị trí của chúng. Tôi đã thử, như bạn đã đề xuất: $ jArtB = $ ("#" + artB); c = new fabric.Canvas ('' + artB, { chiều rộng: $ jArtB.width(), chiều cao: $ jArtB.height(), left: parseInt ($ jArtB.css ("left")), đầu: parseInt ($ jArtB.css ("trên cùng")) }); '. Nhưng điều này cũng không hiệu quả. – ScorpionKing2k5

+1

Có cách hiệu quả nào để thay đổi kích thước canvas để vừa với kích thước hình ảnh đang được tải bằng fabric.Image.fromURL không? Cảm ơn – tomexx

0

Một câu trả lời thực sự cho câu hỏi này, không liên quan đến một kích thước tĩnh mới nhưng thực tế cho phép CSS để có hiệu quả-là một trong những tùy chọn sau:

  1. Trong CSS, bạn có thể ghi đè lên các thuộc tính cá nhân và sau đó với! quan trọng; nhược điểm này là bất kỳ định nghĩa hơn nữa cũng phải sử dụng quan trọng hoặc họ sẽ bị bỏ qua:
[width], [height], [style] 
{ 
    width:  100vw!important; 
    min-height: 100vh!important; 
} 
  1. Sử dụng JQuery bạn có thể thiết lập các giá trị tài sản inline để một sản phẩm nào chuỗi. Bạn có lẽ có thể đạt được điều này mà không có JQuery, nhưng tôi sẽ để nó như là một bài tập cho bạn.

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; 
} 

Sau đó, CSS sẽ được áp dụng như mong đợi.

Đó là dường như cũng cần thiết để nói Vải về sự thay đổi:

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(); 

này sẽ cấu hình vải với kích thước khung nhìn và giữ cho nó có kích thước phù hợp nếu nó thay đổi kích thước.

Nó đáng chú ý rằng vấn đề này phát sinh vì hai lý do:

  1. Có người nghĩ đó là một ý tưởng tốt để sử dụng phong cách nội tuyến và nên bị khiển trách nặng nề, như không có tình huống mà đây là bao giờ một thích hợp thực hành.

  2. Vải thay đổi sắp xếp DOM và tổ chức canvas gốc trong div mới bằng canvas lồng nhau thứ hai, điều này có thể dẫn đến điều bất ngờ.

Các vấn đề liên quan