有了前面的canvas基礎以後,如今開始就精彩了,後面寫的canvas教程都是屬於綜合應用,前面已經寫了經常使用的canvas基礎知識,參考連接以下:javascript
[js高手之路] html5 canvas系列教程 - 認識canvas以及基本使用方法html
[js高手之路] html5 canvas系列教程 - 掌握畫直線圖形的經常使用APIhtml5
[js高手之路] html5 canvas系列教程 - 開始路徑beginPath與關閉路徑closePath詳解java
[js高手之路] html5 canvas系列教程 - arc繪製曲線圖形(曲線,弧線,圓形)git
[js高手之路] html5 canvas系列教程 - arcTo(弧度與二次,三次貝塞爾曲線以及在線工具)github
[js高手之路] html5 canvas系列教程 - 線條樣式(lineWidth,lineCap,lineJoin,setLineDash)chrome
[js高手之路] html5 canvas系列教程 - 文本樣式(strokeText,fillText,measureText,textAlign,textBaseline)canvas
[js高手之路] html5 canvas系列教程 - 圖片操做(drawImage,clip,createPattern)框架
[js高手之路] html5 canvas系列教程 - 狀態詳解(save與restore)dom
[js高手之路] html5 canvas系列教程 - 像素操做(反色,黑白,亮度,復古,蒙版,透明)
[js高手之路] html5 canvas系列教程 - 線形漸變,徑向漸變與陰影設置
[js高手之路] html5新增的定時器requestAnimationFrame實戰進度條
本文來作一個簡單的實時獲取鼠標座標的功能,在canvas動畫開發中,獲取鼠標的座標,鍵盤的按鍵等等,都是經常使用的操做,咱們就慢慢得把他們封裝成一個公共庫。
1、事件的兼容:
1 function bindEvent(obj, event, fn) { 2 if (obj.attachEvent) { //ie 3 obj.attachEvent('on' + event, function () { 4 fn.call(obj); 5 }); 6 } else { 7 //chrome&ff 8 obj.addEventListener(event, fn, false); 9 } 10 }
上面兼容ie8以及修正this關鍵字在ie低版本的指向,下面兼容chrome和ff。其餘更經常使用的封裝能夠參考個人javascript開源框架gdom
2、用當即表達式搭建一個基本的庫
添加獲取鼠標座標的方法
1 ;(function (window) { 2 window.G = {}; 3 function bindEvent(obj, event, fn) { 4 if (obj.attachEvent) { //ie 5 obj.attachEvent('on' + event, function () { 6 fn.call(obj); 7 }); 8 } else { 9 //chrome&ff 10 obj.addEventListener(event, fn, false); 11 } 12 } 13 14 G.getPos = function( dom ){ 15 var oPos = { x : 0, y : 0 }; 16 bindEvent( dom, 'mousemove', function( ev ){ 17 var oEvent = ev || event, x, y; 18 if ( oEvent.pageX || oEvent.pageY ){ 19 x = oEvent.pageX; 20 y = oEvent.pageY; 21 }else { 22 x = oEvent.clientX + document.body.scrollLeft || document.documentElement.scrollLeft; 23 y = oEvent.clientX + document.body.scrollTop || document.documentElement.scrollTop; 24 } 25 x -= dom.offsetLeft; 26 y -= dom.offsetTop; 27 oPos.x = x; 28 oPos.y = y; 29 } ); 30 return oPos; 31 }; 32 33 })(window);
3、引入封裝的js庫,綁定canvas爲監聽對象,打印當前鼠標的座標
鼠標的座標,我這裏畫了2根線,便於觀察.
1 <head> 2 <meta charset='utf-8' /> 3 <script> 4 ;(function (window) { 5 window.G = {}; 6 function bindEvent(obj, event, fn) { 7 if (obj.attachEvent) { //ie 8 obj.attachEvent('on' + event, function () { 9 fn.call(obj); 10 }); 11 } else { 12 //chrome&ff 13 obj.addEventListener(event, fn, false); 14 } 15 } 16 17 G.getPos = function( dom ){ 18 var oPos = { x : 0, y : 0 }; 19 bindEvent( dom, 'mousemove', function( ev ){ 20 var oEvent = ev || event, x, y; 21 if ( oEvent.pageX || oEvent.pageY ){ 22 x = oEvent.pageX; 23 y = oEvent.pageY; 24 }else { 25 x = oEvent.clientX + document.body.scrollLeft || document.documentElement.scrollLeft; 26 y = oEvent.clientX + document.body.scrollTop || document.documentElement.scrollTop; 27 } 28 x -= dom.offsetLeft; 29 y -= dom.offsetTop; 30 oPos.x = x; 31 oPos.y = y; 32 } ); 33 return oPos; 34 }; 35 36 })(window); 37 </script> 38 <style> 39 #canvas{ 40 border:1px dashed #aaa; 41 } 42 </style> 43 <script> 44 window.onload = function(){ 45 var oCanvas = document.querySelector( "#canvas" ), 46 oGc = oCanvas.getContext( '2d' ), 47 width = oCanvas.width, height = oCanvas.height, 48 oInfo = document.querySelector( "#info" ), 49 oPos = G.getPos( oCanvas ); 50 oCanvas.addEventListener( "mousemove", function(){ 51 52 oGc.clearRect( 0, 0, width, height ); 53 oGc.beginPath(); 54 oGc.moveTo( oPos.x, 0 ); 55 oGc.lineTo( oPos.x, height ); 56 oGc.moveTo( 0, oPos.y ); 57 oGc.lineTo( width, oPos.y ); 58 oGc.closePath(); 59 oGc.strokeStyle = '#09f'; 60 oGc.stroke(); 61 62 oInfo.innerHTML = '鼠標的當前座標是:(' + oPos.x + ',' + oPos.y + ')'; 63 }, false ); 64 } 65 </script> 66 </head> 67 <body> 68 <canvas id="canvas" width="500" height="400"></canvas> 69 <div id="info"></div> 70 </body>
4、點擊'run code'能夠預覽效果額