摘要:使用標簽來繪制圖形或動畫需要掌握一些基本的和知識,通過的和了解繪圖的原理即可。通過不斷的擦出和重繪,就會出現動作效果,通過加快速度不被人眼識破。清除畫布通過方法來為元素得到對象。
HTML5 也出來一段時間了,帶來了一些新的技術標準,例如 HTML5 里的 Canvas 標簽,,允許我們使用 Javascript 在 canvas 標簽里繪制 2D 或 3D 圖形和動畫。下面就談談對 canvas 繪圖的理解以及介紹其中一些使用過的方法,用一個條形進度條和一個仿科幻文字做展示例子。
canvas 在 html 文檔中通過標簽創建后是空白的,是一個固定大小的畫布,可以通過 width 和 height 控制它的寬高,默認大小為300像素×150像素(px)。為了展示,首先需要找到渲染上下文,然后通過 js 在 canvas 上進行繪制。
var canvas = document.getElementByTagName("canvas")[0]; var ctx = canvas.getContext("2d"); // 清除畫布 context.clearRect(0, 0, canvas.width, canvas.height);
通過 document.getElementByTagName() 方法來為
var canvas = document.getElementById("canvas"), context = canvas.getContext("2d"), centerX = canvas.width/2, centerY = canvas.height/2, speed = 0.1; function text(n){ context.save(); context.fillStyle = "#F47C7C"; context.font = "40px Arial"; context.textAlign = "center"; context.textBaseline = "middle"; context.fillText(n.toFixed(0)+"%", centerX, centerY); context.restore(); } function rectfixed(){ context.beginPath(); context.rect(50, 140, 400, 20); context.lineWidth = 1; context.strokeStyle = "white"; context.fillStyle = "white"; context.fill(); context.stroke(); } function rectmove(speed){ context.beginPath(); context.rect(50, 140, speed*4, 20); context.lineWidth = 1; context.fillStyle = "#F47C7C"; context.fill(); context.stroke(); } (function drawFrame(){ window.requestAnimationFrame(drawFrame, canvas); context.clearRect(0, 0, canvas.width, canvas.height); text(speed); rectfixed() rectmove(speed) if(speed > 100) speed = 0; speed += 0.2; }());
從代碼上看,首先繪制矩形的 api 是 context.rect(x, y, width, height),分別是x/y坐標,寬和高。第一個條形是固定不動的,第二個條形的寬隨著speed的變動而變動,通過window.requestAnimationFrame循環調動drawFrame函數達到動畫的效果。requestAnimationFrame是一個新的API,作用與setTimeInterval一樣,不同的是它會根據瀏覽器的刷新頻率自動調整動畫的時間間隔。也別忘了要對畫布調用clearRect方法清除上一幀的圖案才能產生正確效果。繪制文本的 api 是,給圖形上色有兩個重要的屬性可以做到,分別是 fillStyle 和 strokeStyle。fillStyle 是設置圖形的填充顏色,strokestyle 是設置圖形的輪廓顏色,通過 fill() 和stroke() 方法,還有更多樣式設置可以參考 MDN 中的 canvas API。
第二個例子是仿科幻文字效果,https://codepen.io/zgfrank/pe...
var canvas = document.querySelector("#test"), ctx = canvas.getContext("2d"); canvas.width = window.innerWidth, canvas.height = window.innerHeight; var shadowColor = "rgba(0, 0, 0, 0.08)", //用于覆蓋文字的漸變陰影 textColor = "#33ff33", //文字顏色 words = "0123456789qwertyuiopasdfghjklzxcvbnm,./;"[]QWERTYUIOP{}ASDFGHJHJKL:ZXCVBBNM<>?", //隨機文字 wordsArray = words.split(""), //將文字拆分進一個數組 fontSize = 18, //字體大小 columns = canvas.width / fontSize, //文字降落的列數 drops = []; //文字行數 for(var i = 0; i < columns; i++){ //從第一行開始 drops[i] = 1; } function drawText(){ ctx.save(); ctx.fillStyle = textColor; ctx.font = fontSize + "px arial"; for (var i = 0; i < drops.length; i++){ // 隨機取文字 var text = wordsArray[Math.floor(Math.random() * wordsArray.length)]; // 繪制第n行文字 ctx.fillText(text, i * fontSize, drops[i] * fontSize); // 差異,數字越小差異越小 if (drops[i] * fontSize > canvas.height && Math.random() > 0.99){ drops[i] = 0; } drops[i]++; } ctx.restore(); } (function drawFrame(){ window.requestAnimationFrame(drawFrame, canvas); // 陰影覆蓋文字 ctx.fillStyle = shadowColor; ctx.fillRect(0, 0, canvas.width, canvas.height); drawText(); }())
上面的代碼就是實現該效果的關鍵:通過 fillText() 方法來繪制隨機的字符,通過 fillRect() 方法覆蓋一個帶有透明度的黑色矩形實現文字被覆蓋形成陰影的效果。繪制列數是 canvas 寬度 / 字體大小。在繪制函數中,最開始是一行行繪制,所以創建drop數組一開始都為1,為了從第一行開始繪制,因此剛刷新的時候是從第一行繪制到最后一行。
context.fillText(text, i * fontSize, drops[i] * fontSize);
fillText() 有三個參數,第一個是繪制的隨機文字,第二是文字的 X 起始坐標,三是文字的 Y 起始坐標。所以第一行每個文字的 X 軸坐標是 0, 18, 36...,而 Y 軸坐標為 18, 18, 18, ...。繪制第二行則將 drops 數組的值都加 1 ,即第二行的 Y 軸坐標為(32,32,32...)。依次類推,從第一行到最后一行就繪制了滿屏的文字,通過 fillRect() 加上覆蓋的黑色透明矩形,就有點類似實現了漸變陰影的文字向下運動動畫。為了顯示重復繪制的效果,需要設置當繪制到最后一行了,需要從第一行開始繪制:
if (drops[i] * fontSize > canvas.height ){ drops[i] = 0; }
但是這樣我們會發現,每一行文字都是同時繪制的,沒有差異性,這樣不能達到不同列錯落有致的效果。為了顯示出每一行文字的差異性,就必須讓一些列先從第一行開始繪制,一些列后面再從第一行開始繪制,怎么達到呢,可以增加隨機數,同時判斷隨機數和是否繪制到了最后一行,同時滿足的列才開始從第一行繪制:
if (drops[i] * fontSize > canvas.height && Math.random() > 0.99){ drops[i] = 0; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/115533.html
摘要:任務名稱響應式砸蛋頁面任務背景前輩方方啊最近項目也沒什么事情你看這個砸蛋頁面不是很好看要不你做一個響應式砸蛋頁面吧系統鄭方方接下前輩的任務鄭方方自動解析任務步驟任務響應式砸蛋頁面與入門閱讀秘籍響應式布局制作層搭配搭配控制器完成任務人物背 任務名稱:響應式砸蛋頁面 任務背景 前輩:方方啊,最近項目也沒什么事情,你看這個砸蛋頁面不是很好看,要不你做一個響應式砸蛋頁面吧? 系統:鄭方方接下前...
摘要:任務名稱響應式砸蛋頁面任務背景前輩方方啊最近項目也沒什么事情你看這個砸蛋頁面不是很好看要不你做一個響應式砸蛋頁面吧系統鄭方方接下前輩的任務鄭方方自動解析任務步驟任務響應式砸蛋頁面與入門閱讀秘籍響應式布局制作層搭配搭配控制器完成任務人物背 任務名稱:響應式砸蛋頁面 任務背景 前輩:方方啊,最近項目也沒什么事情,你看這個砸蛋頁面不是很好看,要不你做一個響應式砸蛋頁面吧? 系統:鄭方方接下前...
閱讀 2470·2023-04-25 21:41
閱讀 1647·2021-09-22 15:17
閱讀 1920·2021-09-22 10:02
閱讀 2432·2021-09-10 11:21
閱讀 2568·2019-08-30 15:53
閱讀 996·2019-08-30 15:44
閱讀 946·2019-08-30 13:46
閱讀 1123·2019-08-29 18:36