<canvas>是HTML5中新增長的一個元素,咱們可使用腳本(一般使用JavaScript)在上面繪製圖形,就像個畫布同樣。咱們能夠用它來繪製圖表、製做一些動畫。默認大小爲300px × 150px。canvas
在<canvas>中繪製圖形的方法中,isPointInPath()方法用於檢測指定的點是否在繪製圖形的路徑中,存在返回ture,不存在返回false。瀏覽器
注:在代碼部分,紅色加粗部分是重點要注意的內容哦! 動畫
在畫布上繪製一個空心矩形,而後指定一個點,若是這個點在矩形的路徑中,矩形的顏色爲藍色,不然爲黑色。爲了能清楚的看到那個點在哪裏,咱們後面再畫上兩條灰色的線,交叉的位置就是咱們指定的點:spa
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //矩形 10 ctx.beginPath(); 11 ctx.rect(10,20,280,20); //繪製矩形區域 12 if(ctx.isPointInPath(50,25)) { //判斷(50,25)是否在矩形路徑中 13 ctx.strokeStyle = "#0000FF"; //在則矩形是藍色 14 } 15 else { 16 ctx.strokeStyle = "#000000"; //不在則矩形是黑色 17 } 18 ctx.stroke(); 19 20 //繪製定位用的直線 21 ctx.beginPath(); 22 ctx.strokeStyle = "#CCCCCC"; 23 ctx.moveTo(50,0); 24 ctx.lineTo(50,150); 25 ctx.stroke(); 26 ctx.beginPath(); 27 ctx.moveTo(0,25); 28 ctx.lineTo(300,25); 29 ctx.stroke(); 30 </script> 31 </body>
運行效果以下:3d
能夠看到,咱們定位的點再矩形區域內部,矩形的顏色變成了藍色,也就是說這個點的位置在矩形的路徑中。code
那咱們再arc()建立的弧/曲線區域中定位試試看。以後也是使用兩條灰色線交叉定位咱們判斷的點:blog
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //弧/曲線 10 ctx.beginPath(); 11 ctx.arc(150,75,50,0,1.5 * Math.PI); //繪製圓形區域 12 if(ctx.isPointInPath(170,55)) { //判斷(170,55)是否在矩形路徑中 13 ctx.strokeStyle = "#0000FF"; //在則曲線是藍色 14 } 15 else { 16 ctx.strokeStyle = "#000000"; //不在則曲線是黑色 17 } 18 ctx.stroke(); 19 20 //繪製定位用的直線 21 ctx.beginPath(); 22 ctx.strokeStyle = "#CCCCCC"; 23 ctx.moveTo(170,0); 24 ctx.lineTo(170,150); 25 ctx.stroke(); 26 ctx.beginPath(); 27 ctx.moveTo(0,55); 28 ctx.lineTo(300,55); 29 ctx.stroke(); 30 </script> 31 </body>
運行效果以下:
ip
哦,圓仍是藍色的,說明定位是在路徑中的。。。不對,這樣子看上去好像沒有閉合啊,那咱們給它填充一下顏色(換成fill()):get
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //弧/曲線 10 ctx.beginPath(); 11 ctx.arc(150,75,50,0,1.5 * Math.PI); //繪製圓形區域 12 if(ctx.isPointInPath(170,55)) { //判斷(170,55)是否在矩形路徑中 13 ctx.fillStyle = "#0000FF"; //在則曲線是藍色 14 } 15 else { 16 ctx.fillStyle = "#000000"; //不在則曲線是黑色 17 } 18 ctx.fill(); 19 20 //繪製定位用的直線 21 ctx.beginPath(); 22 ctx.strokeStyle = "#CCCCCC"; 23 ctx.moveTo(170,0); 24 ctx.lineTo(170,150); 25 ctx.stroke(); 26 ctx.beginPath(); 27 ctx.moveTo(0,55); 28 ctx.lineTo(300,55); 29 ctx.stroke(); 30 </script> 31 </body>
嗯,是沒有超過區域,那咱們讓超過區域看看class
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //弧/曲線 10 ctx.beginPath(); 11 ctx.arc(150,75,50,0,1.5 * Math.PI); //繪製圓形區域 12 if(ctx.isPointInPath(180,45)) { //判斷(180,45)是否在矩形路徑中 13 ctx.fillStyle = "#0000FF"; //在則曲線是藍色 14 } 15 else { 16 ctx.fillStyle = "#000000"; //不在則曲線是黑色 17 } 18 ctx.fill(); 19 20 //繪製定位用的直線 21 ctx.beginPath(); 22 ctx.strokeStyle = "#CCCCCC"; 23 ctx.moveTo(180,0); 24 ctx.lineTo(180,150); 25 ctx.stroke(); 26 ctx.beginPath(); 27 ctx.moveTo(0,45); 28 ctx.lineTo(300,45); 29 ctx.stroke(); 30 </script> 31 </body>
變黑了,說明這個點再也不路徑中。
接下來就到最簡單的線條了。其實寫這個筆記就是由於這個線條來着┑( ̄ ▽  ̄)┍
使用moveTo()和lineTo()結合,建立一根直線,定位點在路徑中直線爲藍色,不然爲黑色。使用一條灰色線交叉定位咱們判斷的點:
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //直線 10 ctx.beginPath(); 11 ctx.moveTo(40,40); 12 ctx.lineTo(260,40); 13 if(ctx.isPointInPath(150,40)) { //判斷(150,40)是否在矩形路徑中 14 ctx.strokeStyle = "#0000FF"; //在則直線是藍色 15 } 16 else { 17 ctx.strokeStyle = "#000000"; //不在則直線是黑色 18 } 19 ctx.stroke(); 20 21 //繪製定位用的直線 22 ctx.beginPath(); 23 ctx.strokeStyle = "#CCCCCC"; 24 ctx.moveTo(150,0); 25 ctx.lineTo(150,150); 26 ctx.stroke(); 27 </script> 28 </body>
欸,怎麼是黑色的啊,我不是定位點的y軸和線條兩個點的y軸都重合了麼?
就是這個狀況,定位點若是定位在使用moveTo()和lineTo()繪製的直線中間自動生成的線上,是會返回false的!
那把定位點徹底重合moveTo()的點試試看:
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //直線 10 ctx.beginPath(); 11 ctx.moveTo(40,40); 12 ctx.lineTo(260,40); 13 if(ctx.isPointInPath(40,40)) { //判斷(40,40)是否在直線路徑中 14 ctx.strokeStyle = "#0000FF"; //在則直線是藍色 15 } 16 else { 17 ctx.strokeStyle = "#000000"; //不在則直線是黑色 18 } 19 ctx.stroke(); 20 21 //繪製定位用的直線 22 ctx.beginPath(); 23 ctx.strokeStyle = "#CCCCCC"; 24 ctx.moveTo(40,0); 25 ctx.lineTo(40,150); 26 ctx.stroke(); 27 </script> 28 </body>
藍了,藍了,它藍了!
那接下來咱們用moveTo()和lineTo()作一個閉合的圖形康康,定位就設在一條邊中間,用兩條灰色的線條交叉標記咱們定位的點:
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //直線 10 ctx.beginPath(); 11 ctx.moveTo(40,40); 12 ctx.lineTo(260,40); 13 ctx.lineTo(260,130); 14 ctx.closePath(); 15 if(ctx.isPointInPath(150,40)) { //判斷(150,40)是否在路徑中 16 ctx.fillStyle = "#0000FF"; //在則直線是藍色 17 } 18 else { 19 ctx.fillStyle = "#000000"; //不在則直線是黑色 20 } 21 ctx.fill(); 22 23 //繪製定位用的直線 24 ctx.beginPath(); 25 ctx.strokeStyle = "#CCCCCC"; 26 ctx.moveTo(150,0); 27 ctx.lineTo(150,150); 28 ctx.stroke(); 29 30 ctx.beginPath(); 31 ctx.moveTo(0,40); 32 ctx.lineTo(300,40); 33 ctx.stroke(); 34 </script> 35 </body>
這個區域這個時候是藍的了。也就是說不是閉合區域的時候,moveTo()和lineTo()中的線條是不算在區域內的,得閉合後纔算。(對於這個觀點,其實我是以爲有點怪怪的,感受這個觀點應該是接近正確答案但它不是正確答案)
假如線條寬度有20px,上面咱們知道只有和路徑點重合了纔算,那加粗的線條仍是和路徑點重合了算仍是路徑點y軸(假設是橫線,那麼就當它是長方形吧,豎這的邊上任意一點)也算,這也是剛剛忽然想到的,試試看:
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //直線 10 ctx.beginPath(); 11 ctx.moveTo(40,40); 12 ctx.lineTo(260,40); 13 ctx.lineWidth = 40; 14 if(ctx.isPointInPath(40,35)) { //判斷(40,35)是否在矩形路徑中 15 ctx.strokeStyle = "#0000FF"; //在則直線是藍色 16 } 17 else { 18 ctx.strokeStyle = "#000000"; //不在則直線是黑色 19 } 20 ctx.stroke(); 21 22 //繪製定位用的直線 23 ctx.beginPath(); 24 ctx.lineWidth = 1; 25 ctx.strokeStyle = "#CCCCCC"; 26 ctx.moveTo(40,0); 27 ctx.lineTo(40,150); 28 ctx.stroke(); 29 30 ctx.beginPath(); 31 ctx.moveTo(0,35); 32 ctx.lineTo(300,35); 33 ctx.stroke(); 34 </script> 35 </body>
看起來仍是得和路徑點重合。
那加粗後閉合呢?
1 <body> 2 <canvas id="drawEle"> 3 您的瀏覽器不支持該標籤 4 </canvas> 5 <script> 6 var c = document.getElementById("drawEle"); 7 ctx = c.getContext("2d"); 8 9 //直線 10 ctx.beginPath(); 11 ctx.moveTo(40,40); 12 ctx.lineTo(260,40); 13 ctx.lineTo(260,130); 14 ctx.closePath(); 15 ctx.lineWidth = 40; 16 if(ctx.isPointInPath(40,35)) { //判斷(40,35)是否在矩形路徑中 17 ctx.f = "#0000FF"; //在則直線是藍色 18 } 19 else { 20 ctx.strokeStyle = "#000000"; //不在則直線是黑色 21 } 22 ctx.stroke(); 23 24 //繪製定位用的直線 25 ctx.beginPath(); 26 ctx.lineWidth = 1; 27 ctx.strokeStyle = "#CCCCCC"; 28 ctx.moveTo(40,0); 29 ctx.lineTo(40,150); 30 ctx.stroke(); 31 32 ctx.beginPath(); 33 ctx.moveTo(0,35); 34 ctx.lineTo(300,35); 35 ctx.stroke(); 36 </script> 37 </body>
沒有區別,也就是說加粗的部分並不算在路徑內。
參考資料:MDN - CanvasRenderingContext2D.isPointInPath() : https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/isPointInPath