Javascript利用canvas繪制兩點(diǎn)間曲線和箭頭
Javascript利用canvas,在兩點(diǎn)間繪制曲線,矩形,并且在矩形中繪制文字,實(shí)現(xiàn)居中對(duì)齊,同時(shí)實(shí)現(xiàn)了箭頭繪制,效果如圖:
一、html代碼
代碼如下
<canvas id="canvas" width="1000" height="600"></canvas>
二、css代碼
canvas { display: block; width: 1000px; height: 600px; background: conic-gradient(#eee 25%, white 0deg 50%, #eee 0deg 75%, white 0deg) 0 / 20px 20px; margin-inline: auto; } @media (max-width: 640px) { canvas { width: 100vw; height: 60vw; } }
三、Javascript代碼
代碼如下
var context = document.getElementById("canvas").getContext("2d"); ; // 繪制尺寸 var width = canvas.width; var height = canvas.height; // 兩個(gè)方塊的坐標(biāo)、尺寸,顏色等數(shù)據(jù) var data = [{ x: 800, y: 180, width: 200, height: 50, color: 'deepskyblue', text:"+u+ate" }, { x: 600, y: 680, width: 200, height: 50, color: 'deeppink', text:"gress 邁步" }]; // 繪制矩形方法 var drawRect = function () { data.forEach(function (obj) { context.beginPath(); context.fillStyle = obj.color; context.fillRect(obj.x, obj.y, obj.width, obj.height); context.closePath(); context.font="30px Verdana"; context.fillStyle="#fff"; console.log(context.measureText(obj.text)) const textMetrics = context.measureText(obj.text); // 所有字在這個(gè)字體下的高度 let fontHeight = textMetrics.fontBoundingBoxAscent + textMetrics.fontBoundingBoxDescent; console.log(fontHeight) context.fillText(obj.text,0,0) context.fillText(obj.text,obj.x+(obj.width-context.measureText(obj.text).width)/2,obj.y+fontHeight); }); }; // 繪制連接曲線方法 var drawCurve = function () { // 按照坐標(biāo)位置排序 var dataSort = data.sort(function (objA, objB) { return (objA.y + objA.height) - (objB.y + objB.height); }); // 知道上下數(shù)據(jù) var from = dataSort[0]; var to = dataSort[1]; // 曲線的起點(diǎn)終點(diǎn) var fromX = from.x + from.width / 2; var fromY = from.y + from.height; var toX = to.x + to.width / 2; var toY = to.y; // 曲線控制點(diǎn)坐標(biāo) var cp1x = fromX; var cp1y = fromY + (toY - fromY) / 2; var cp2x = toX; var cp2y = toY - (toY - fromY) / 2; // 開始繪制曲線 context.beginPath(); context.lineWidth = 1 context.strokeStyle = '#000'; context.moveTo(fromX, fromY); // 繪制曲線點(diǎn) context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, toX, toY); context.stroke(); }; // 繪制方法 var draw = function () { context.clearRect(0, 0, width, height); drawRect(); drawCurve(); }; draw(); canvas_arrow(ctx, 10, 30, 200, 150); canvas_arrow(ctx, 100, 200, 400, 50); canvas_arrow(ctx, 200, 30, 10, 150); canvas_arrow(ctx, 400, 200, 100, 50); ctx.stroke(); function canvas_arrow(context, fromx, fromy, tox, toy) { var headlen = 10; // length of head in pixels var dx = tox - fromx; var dy = toy - fromy; var angle = Math.atan2(dy, dx); context.moveTo(fromx, fromy); context.lineTo(tox, toy); context.lineTo(tox - headlen * Math.cos(angle - Math.PI / 6), toy - headlen * Math.sin(angle - Math.PI / 6)); context.moveTo(tox, toy); context.lineTo(tox - headlen * Math.cos(angle + Math.PI / 6), toy - headlen * Math.sin(angle + Math.PI / 6)); }
ok,代碼就是如此
完整代碼
<!DOCTYPE HTML> <html> <head> <style> canvas { display: block; width: 1000px; height: 600px; background: conic-gradient(#eee 25%, white 0deg 50%, #eee 0deg 75%, white 0deg) 0 / 20px 20px; margin-inline: auto; } @media (max-width: 640px) { canvas { width: 100vw; height: 60vw; } } </style> </head> <body> <canvas id="canvas" width="2000" height="1200"></canvas> <script> var context = document.getElementById("canvas").getContext("2d"); ; // 繪制尺寸 var width = canvas.width; var height = canvas.height; // 兩個(gè)方塊的坐標(biāo)、尺寸,顏色等數(shù)據(jù) var data = [{ x: 800, y: 180, width: 200, height: 50, color: 'deepskyblue', text:"+u+ate" }, { x: 600, y: 680, width: 200, height: 50, color: 'deeppink', text:"gress 邁步" }]; // 繪制矩形方法 var drawRect = function () { data.forEach(function (obj) { context.beginPath(); context.fillStyle = obj.color; context.fillRect(obj.x, obj.y, obj.width, obj.height); context.closePath(); context.font="30px Verdana"; context.fillStyle="#fff"; console.log(context.measureText(obj.text)) const textMetrics = context.measureText(obj.text); // 所有字在這個(gè)字體下的高度 let fontHeight = textMetrics.fontBoundingBoxAscent + textMetrics.fontBoundingBoxDescent; console.log(fontHeight) context.fillText(obj.text,0,0) context.fillText(obj.text,obj.x+(obj.width-context.measureText(obj.text).width)/2,obj.y+fontHeight); }); }; // 繪制連接曲線方法 var drawCurve = function () { // 按照坐標(biāo)位置排序 var dataSort = data.sort(function (objA, objB) { return (objA.y + objA.height) - (objB.y + objB.height); }); // 知道上下數(shù)據(jù) var from = dataSort[0]; var to = dataSort[1]; // 曲線的起點(diǎn)終點(diǎn) var fromX = from.x + from.width / 2; var fromY = from.y + from.height; var toX = to.x + to.width / 2; var toY = to.y; // 曲線控制點(diǎn)坐標(biāo) var cp1x = fromX; var cp1y = fromY + (toY - fromY) / 2; var cp2x = toX; var cp2y = toY - (toY - fromY) / 2; // 開始繪制曲線 context.beginPath(); context.lineWidth = 1 context.strokeStyle = '#000'; context.moveTo(fromX, fromY); // 繪制曲線點(diǎn) context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, toX, toY); context.stroke(); }; // 繪制方法 var draw = function () { context.clearRect(0, 0, width, height); drawRect(); drawCurve(); }; draw(); canvas_arrow(ctx, 10, 30, 200, 150); canvas_arrow(ctx, 100, 200, 400, 50); canvas_arrow(ctx, 200, 30, 10, 150); canvas_arrow(ctx, 400, 200, 100, 50); ctx.stroke(); function canvas_arrow(context, fromx, fromy, tox, toy) { var headlen = 10; // length of head in pixels var dx = tox - fromx; var dy = toy - fromy; var angle = Math.atan2(dy, dx); context.moveTo(fromx, fromy); context.lineTo(tox, toy); context.lineTo(tox - headlen * Math.cos(angle - Math.PI / 6), toy - headlen * Math.sin(angle - Math.PI / 6)); context.moveTo(tox, toy); context.lineTo(tox - headlen * Math.cos(angle + Math.PI / 6), toy - headlen * Math.sin(angle + Math.PI / 6)); } </script> </body> </html>
到此這篇關(guān)于Javascript利用canvas繪制兩點(diǎn)間曲線和箭頭的文章就介紹到這了,更多相關(guān)Javascript canvas內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS調(diào)用打印方法設(shè)置頁眉頁腳的實(shí)例
一個(gè)網(wǎng)頁打印相關(guān)功能的擴(kuò)展演示特效,在實(shí)現(xiàn)了打印功能外,還實(shí)現(xiàn)了打印預(yù)覽、打印前的頁眉頁腳設(shè)置,直接打印等功能,以前對(duì)JS打印前設(shè)置頁腳見的不多,所以這一個(gè)也算是挺有價(jià)值的,希望閑暇時(shí)參閱2013-05-05JavaScript中通過提示框跳轉(zhuǎn)頁面的方法
這篇文章主要介紹了JavaScript中通過提示框跳轉(zhuǎn)頁面的方法的相關(guān)資料,需要的朋友可以參考下2016-02-02JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10JavaScript獲取地址欄參數(shù)的方法實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于JavaScript獲取地址欄參數(shù)的方法實(shí)現(xiàn),項(xiàng)目中經(jīng)常遇到獲取上個(gè)頁面跳轉(zhuǎn)過來獲取當(dāng)前的參數(shù),文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07小程序webview內(nèi)網(wǎng)頁實(shí)現(xiàn)微信支付的代碼示例
這篇文章主要介紹了在小程序中使用webview實(shí)現(xiàn)微信支付功能,需要在小程序和webview之間進(jìn)行交互,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02