對於HTML5相信大家都不陌生,很早就出來了,但是貌似都沒有真正的使用過。最近做項目時要實現這樣一個需求:一個圖片,大小不固定,要求能實現類似地圖一樣放大、縮小、移動功能。這里就很合適使用html5的canvas畫布。
實現步驟如下:
1. 定義一個canvas標簽。
<canvas id="bargraphCanvas" width="500" height="600"></canvas>
這里有個很重要的地方,就是這個width和height一定要寫,否則不能實現。同時,畫布的寬高只能用這個方法寫,css設置有問題。大家可以試試。
2.初始化canvas,以及其他所需對象。
var canvas, context; var img,//圖片對象 imgIsLoaded,//圖片是否加載完成; imgX = 0, imgY = 0, imgScale = 1; (function int() { canvas = document.getElementById('bargraphCanvas'); //畫布對象 context = canvas.getContext('2d');//畫布顯示二維圖片 loadImg(); })();
3.定義一個image對象並設置好它的onload事件和src屬性。
function loadImg() { img = new Image(); img.onload = function () { imgIsLoaded = true; drawImage(); } img.src = '../../Content/images/mayday.jpg'; }
4.調用canvas的draw方法。
function drawImage() { context.clearRect(0, 0, canvas.width, canvas.height); context.drawImage( img, //規定要使用的圖像、畫布或視頻。 0, 0, //開始剪切的 x 坐標位置。 img.width, img.height, //被剪切圖像的高度。 imgX, imgY,//在畫布上放置圖像的 x 、y坐標位置。 img.width * imgScale, img.height * imgScale //要使用的圖像的寬度、高度 );}
這里要介紹下canvas的drawImage方法,參考w3school,drawImage是可以實現圖片的裁剪功能,參數的含義以及是否必填如下:
** img 規定要使用的圖像、畫布或視頻。
** sx 可選。開始剪切的 x 坐標位置。
** sy 可選。開始剪切的 y 坐標位置。
** swidth 可選。被剪切圖像的寬度。
** sheight 可選。被剪切圖像的高度。
** x 在畫布上放置圖像的 x 坐標位置。
** y 在畫布上放置圖像的 y 坐標位置。
** width 可選。要使用的圖像的寬度。(伸展或縮小圖像)
** height 可選。要使用的圖像的高度。(伸展或縮小圖像)
5.到這里,如果代碼沒有問題的話,圖片就可以成功地在canvas中顯示了。下面就是實現放大、縮小、平移操作。在初始化canvas的同時也初始化其事件,如下:
/*事件注冊*/ function canvasEventsInit() { canvas.onmousedown = function (event) { var pos = windowToCanvas(event.clientX, event.clientY); //坐標轉換,將窗口坐標轉換成canvas的坐標 canvas.onmousemove = function (evt) { //移動 canvas.style.cursor = 'move'; var posl = windowToCanvas(evt.clientX, evt.clientY); var x = posl.x - pos.x; var y = posl.y - pos.y; pos = posl; imgX = x; imgY = y; drawImage(); //重新繪制圖片 }; canvas.onmouseup = function () { canvas.onmousemove = null; canvas.onmouseup = null; canvas.style.cursor = 'default'; }; }; canvas.onmousewheel = canvas.onwheel = function (event) { //滾輪放大縮小 var pos = windowToCanvas (event.clientX, event.clientY); event.wheelDelta = event.wheelDelta ? event.wheelDelta : (event.deltalY * (-40)); //獲取當前鼠標的滾動情況 if (event.wheelDelta > 0) { imgScale *= 2; imgX = imgX * 2 - pos.x; imgY = imgY * 2 - pos.y; } else { imgScale /= 2; imgX = imgX * 0.5 pos.x * 0.5; imgY = imgY * 0.5 pos.y * 0.5; } drawImage(); //重新繪制圖片 }; } /*坐標轉換*/ function windowToCanvas(x,y) { var box = canvas.getBoundingClientRect(); //這個方法返回一個矩形對象,包含四個屬性:left、top、right和bottom。分別表示元素各邊與頁面上邊和左邊的距離 return { x: x - box.left - (box.width - canvas.width) / 2, y: y - box.top - (box.height - canvas.height) / 2 }; }
按照這些步驟,圖片的加載,放大、縮小、平移都已經實現了。個人感覺這個比較難的地方在於,這個是使用原生javascript寫的,如果使用jquery會不會簡單些,以后有時間再試試吧。目前效果如下: