Canvas 是 HTML5 提供的一個用於展現繪圖效果的標籤. Canvas 原意爲畫布, 在 HTML 頁面中用於展現繪圖效果. 最先 Canvas 是蘋果提出的一個方案, 今天已經在大多數瀏覽器中實現。css
canvas 的使用領域html
判斷瀏覽器是否支持 canvas 標籤前端
var canvas = document.getElementById('canvas') if (canvas.getContext) { console.log('你的瀏覽器支持Canvas!') } else { console.log('你的瀏覽器不支持Canvas!') }
一、使用 canvas 標籤, 便可在頁面中開闢一格區域,能夠設置其寬高,寬高爲 300 和 150vue
<canvas></canvas>
二、獲取 dom 元素 canvaswebpack
canvas 自己不能繪圖. 是使用 JavaScript 來完成繪圖. canvas 對象提供了各類繪圖用的 api。git
var cas = document.querySelector('canvas')
三、經過 cas 獲取上下文對象(畫布對象!)github
var ctx = cas.getContext('2d')
四、經過 ctx 開始畫畫(設置起點 設置終點 連線-描邊 )web
ctx.moveTo(10, 10) ctx.lineTo(100, 100) ctx.stroke()
context.moveTo( x, y )
context.lineTo( x, y )
context.stroke()
context.fill()
context.closePath()
canvas 還能夠設置線條的相關屬性,以下:vue-cli
CanvasRenderingContext2D.lineWidth
設置線寬.CanvasRenderingContext2D.strokeStyle
設置線條顏色.CanvasRenderingContext2D.lineCap
設置線末端類型,'butt'( 默認 ), 'round', 'square'.CanvasRenderingContext2D.lineJoin
設置相交線的拐點, 'miter'(默認),'round', 'bevel',CanvasRenderingContext2D.getLineDash()
得到線段樣式數組.CanvasRenderingContext2D.setLineDash()
設置線段樣式.CanvasRenderingContext2D.lineDashOffset
繪製線段偏移量.封裝一個畫矩形的方法npm
function myRect(ctxTmp, x, y, w, h) { ctxTmp.moveTo(x, y) ctxTmp.lineTo(x + w, y) ctxTmp.lineTo(x + w, y + h) ctxTmp.lineTo(x, y + h) ctxTmp.lineTo(x, y) ctxTmp.stroke() } var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') myRect(ctx, 50, 50, 200, 200)
fillRect( x , y , width , height)
填充以(x,y)爲起點寬高分別爲 width、height 的矩形 默認爲黑色stokeRect( x , y , width , height)
繪製一個空心以(x,y)爲起點寬高分別爲 width、height 的矩形clearRect( x, y , width , height )
清除以(x,y)爲起點寬高分別爲 width、height 的矩形 爲透明繪製圓弧的方法有
CanvasRenderingContext2D.arc()
CanvasRenderingContext2D.arcTo()
6 個參數: x,y(圓心的座標),半徑,起始的弧度(不是角度 deg),結束的弧度,(bool 設置方向 ! )
var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') ctx.arc(100, 100, 100, 0, degToArc(360)) ctx.stroke() // 角度轉弧度 function degToArc(num) { return (Math.PI / 180) * num }
繪製扇形
var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') ctx.arc(300, 300, 200, degToArc(125), degToArc(300)) // 自動連回原點 ctx.closePath() ctx.stroke() function degToArc(num) { return (Math.PI / 180) * num }
var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') var isDraw = false // 鼠標按下事件 cas.addEventListener('mousedown', function () { isDraw = true ctx.beginPath() }) // 鼠標移動事件 cas.addEventListener('mousemove', function (e) { if (!isDraw) { // 沒有按下 return } // 獲取相對於容器內的座標 var x = e.offsetX var y = e.offsetY ctx.lineTo(x, y) ctx.stroke() }) cas.addEventListener('mouseup', function () { // 關閉開關了! isDraw = false })
原理和畫布類似,只不過用的是clearRect()方法。
var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') ctx.fillRect(0, 0, 600, 600) // 開關 var isClear = false cas.addEventListener('mousedown', function () { isClear = true }) cas.addEventListener('mousemove', function (e) { if (!isClear) { return } var x = e.offsetX var y = e.offsetY var w = 20 var h = 20 ctx.clearRect(x, y, w, h) }) cas.addEventListener('mouseup', function () { isClear = false })
<div> <img src="./images/2.jpg" alt="" /> <canvas width="600" height="600"></canvas> </div>
css
img { width: 600px; height: 600px; position: absolute; top: 10%; left: 30%; } canvas { width: 600px; height: 600px; position: absolute; top: 10%; left: 30%; border: 1px solid #000; }
js
var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') var img = document.querySelector('img') // 加一個遮罩層 ctx.fillStyle = '#ccc' ctx.fillRect(0, 0, cas.width, cas.height) setImgUrl() // 開關 var isClear = false cas.addEventListener('mousedown', function () { isClear = true }) cas.addEventListener('mousemove', function (e) { if (!isClear) { return } var x = e.offsetX var y = e.offsetY ctx.clearRect(x, y, 30, 30) }) cas.addEventListener('mouseup', function () { isClear = false }) function setImgUrl() { var arr = ['./images/1.jpg', './images/2.jpg', './images/3.jpg', './images/4.jpg'] // 0-3 var random = Math.round(Math.random() * 3) img.src = arr[random] }
更多demo,請查看 github.com/Michael-lzg…
搭建一個 vue-cli4+webpack 移動端框架(開箱即用)
從零構建到優化一個相似vue-cli的腳手架
封裝一個toast和dialog組件併發布到npm
從零開始構建一個webpack項目
總結幾個webpack打包優化的方法
總結vue知識體系之高級應用篇
總結vue知識體系之實用技巧
總結vue知識體系之基礎入門篇
總結移動端H5開發經常使用技巧(乾貨滿滿哦!)
關注的個人公衆號不按期分享前端知識,與您一塊兒進步!