2012-06-24 16 views
23

Làm cách nào tôi có thể rescale tất cả phần tử bên trong canvas Raphael khi thay đổi cửa sổ?Làm cách nào tôi có thể chia tỷ lệ phần tử Raphael js trên cửa sổ thay đổi kích thước bằng cách sử dụng jquery

xem xét đoạn mã sau/DEMO nếu tôi thay đổi kích thước cửa sổ của tôi chỉ div container quy mô kể từ khi tôi thiết lập chiều rộng của nó đến 50% chiều rộng cửa sổ và không có sự thay đổi (rect, circle hoặc path)

<div id="container"></div>​ 
#container{border : 1px solid black ; 
       width : 50% ; 
       height:300px}​ 
var con = $("#container"); 
var paper = Raphael(con.attr('id'), con.attr('width'), con.attr('height')); 
var win = paper.rect(0,0,400,300).attr({stroke: 'black' }) ; 
var path = paper.path("M 200 100 l 100 0 z") ; 
var cir = paper.circle(50, 50, 40); 

Trả lời

29

Nếu bạn sử dụng Raphaël phiên bản 2.0 hoặc mới hơn một sự thay thế là để gọi paper.setViewBox để thiết lập hệ tọa độ của bạn và sau đó cho phép các trình duyệt tự động điều chỉnh kích thước.

Cập nhật: Ok, quay ra Raphaël là một chút ít tự động mở rộng hơn tôi nghĩ ... dù sao, đây là một example (Raphaël vẫn đặt một chiều rộng tuyệt đối/chiều cao trên gốc < svg>, vì vậy họ cần sẽ được gỡ bỏ để mở rộng quy mô svg bình thường). Kích thước sau đó được quyết định bởi CSS và svg chỉ vừa với khu vực đã cho. Có thể tinh chỉnh điều này để xử lý nội dung tràn, điều này có thể xảy ra do tỷ lệ khung hình svg viewBox không khớp với hộp CSS được đặt vào. Bạn làm điều này bằng cách thêm thuộc tính preserveAspectRatio vào phần tử gốc svg.

Bạn có thể đọc thêm về các giá trị bạn có thể thiết lập trên svg preserveAspectRatio thuộc tính here, nhưng ba giá trị mà có lẽ quan tâm là 'none' (ví ép/kéo dài để phù hợp với bất cứ điều gì rect được đưa ra), 'xMidYMid slice' (để mở rộng quy mô để điền vào một số phần nếu khía cạnh không khớp), 'xMidYMid meet' (đây là mặc định, giống như không chỉ định pAR, và có nghĩa là nội dung sẽ được căn giữa và sẽ tràn theo một hướng nếu khía cạnh không không phù hợp).

+0

bạn có thể chỉnh sửa nó vào [jsfiddle] của tôi (http://jsfiddle.net/minagabriel/vHXCc/), tôi thực sự đánh giá cao, bởi vì tôi không thực sự biết làm thế nào để làm điều này –

+0

cảm ơn đó là rất hữu ích –

+0

caveat: có thể không hoạt động đầy đủ cho chương trình phụ trợ VML (IE8 trở xuống), vui lòng kiểm tra. –

2

Bạn có thể sử dụng kịch bản này một lần tôi đã sử dụng trước đó:

http://www.shapevent.com/scaleraphael/

Thanh Điền cửa sổ - không có ví dụ cắt cho thay đổi kích thước canvas:

http://www.shapevent.com/scaleraphael/demo1.html

+0

nhờ Luffy .. tôi thấy điều này trước khi có bất kỳ cách nào khác hơn là sử dụng thư viện bên ngoài để làm –

+0

này Nếu bạn nhìn vào nguồn của nó chỉ có 90 hàng và không phức tạp. Bạn có thể lấy hàm paper.changeSize (30 ~ hàng). Đó là chức năng bạn đang tìm kiếm. – Luffy

+0

Bản demo scaleraphael được liên kết không hoạt động. Tải trang, sau đó thay đổi kích thước chế độ xem hẹp hơn: không có gì xảy ra. Nhưng, kỳ lạ, nếu bạn tải trang với khung nhìn hẹp, và sau đó mở rộng nó, nó hoạt động trên tất cả các resizings tiếp theo. Tôi không biết tại sao. – Ben

4

tôi nghĩ rằng tôi tìm thấy một giải pháp: đoạn mã sau sẽ tái quy mô tất cả các phần tử khi lại kích thước cửa sổ, và đây là những gì tôi đang tìm kiếm

  var w = $(window).width(); 
      var h = $(window).height(); 
      function draw(w, h) { 
       var paper = Raphael($('#wrap').attr('id'), w, h); 
       paper.setViewBox(0, 0, 1500, 1500, true); 
       var rec = paper.rect(0, 0, 200, 200).attr({ stroke: 'black' }); 
       var cir = paper.circle(100, 100, 50); 
      }; 
      draw(w, h); 
      function resize() { 
       var xw = $(window).width(); 
       var xh = $(window).height(); 
       draw(xw, xh) 
      } 
      $(window).resize(resize); 

tham khảo từ @Erik Dahlström: Paper.setViewBox(x, y, w, h, fit) ‘viewBox’ attribute

19

http://jsfiddle.net/vnTQT/

var paper = Raphael("wrap"); 
    paper.setViewBox(0,0,w,h,true); 
    paper.setSize('100%', '100%'); 

Được sử dụng này (paper.setViewBox) với paper.setSize ('100%', '100%') và thay đổi kích thước cửa sổ với thay đổi kích thước của nội dung svg làm việc mà không cần sử dụng hàm svg direcly.

+0

nhưng tiếc là chiều cao có vẻ là màn hình vừa vặn, bao gồm các nội dung khác trong trang: (ai cũng có giải pháp cho vấn đề này? ** http: //jsfiddle.net/ vnTQT/22/** – Muhammed

+0

đặt 'chiều cao tối đa: 300px;' hoặc bất kỳ thứ gì trên svg hoặc vùng chứa của nó hoạt động cho tôi. – r8n5n

0

Nếu bạn có bộ phần tử để đổi kích thước, bạn có thể sử dụng trực tiếp mã js của mình ...

for (var i = 0; i < your_set.length; i++) { 
    your_set[i].scale(ratio, ratio, 0,0); 
}; 

... và một chức năng để tải lại trang web trên trình duyệt thay đổi kích thước:

window.addEventListener('resize', function() { 
    "use strict"; 
    window.location.reload(); 
});