摘要:效果不帶連線效果帶連線的效果教程要實(shí)現(xiàn)這樣的效果其實(shí)很簡(jiǎn)單,大概分為這么幾個(gè)步驟創(chuàng)建首先需要在需要展示粒子背景的父元素中創(chuàng)建一個(gè)標(biāo)簽指定和在我們生成隨機(jī)點(diǎn)坐標(biāo)的時(shí)候需要用和來(lái)做參照。調(diào)用函數(shù)開(kāi)啟動(dòng)畫(huà)如果不需要畫(huà)線,取消下面這行代碼即可。
效果 :)
不帶連線效果:
帶連線的效果:
要實(shí)現(xiàn)這樣的效果其實(shí)很簡(jiǎn)單,大概分為這么幾個(gè)步驟:
創(chuàng)建canvas首先需要在需要展示粒子背景的父元素中創(chuàng)建一個(gè)canvas標(biāo)簽, 指定width和height, 在我們生成隨機(jī)點(diǎn)坐標(biāo)的時(shí)候需要用width和height來(lái)做參照。width和height等于父元素的寬和高。
// 假如父元素是body const ele = document.body; const canvas = document.createElement("canvas"); canvas.width = ele.clientWidth; canvas.height = ele.clientHeight; // 將canvas標(biāo)簽插入 ele.appendChild(canvas);隨機(jī)生成一定數(shù)量的點(diǎn)坐標(biāo)信息
以width和height做參照隨機(jī)生成一定數(shù)量的點(diǎn)坐標(biāo)信息,包含x, y, rateX(點(diǎn)在X軸的移動(dòng)速率), rateY(點(diǎn)在Y軸移動(dòng)的速率), rateX和rateY決定了點(diǎn)的運(yùn)動(dòng)軌跡。
const points = []; // 隨機(jī)生成點(diǎn)的坐標(biāo),需指定radius的最大值 function getPoint(radius) { const x = Math.ceil(Math.random() * this.width), // 粒子的x坐標(biāo) y = Math.ceil(Math.random() * this.height), // 粒子的y坐標(biāo) r = +(Math.random() * this.radius).toFixed(4), // 粒子的半徑 rateX = +(Math.random() * 2 - 1).toFixed(4), // 粒子在x方向運(yùn)動(dòng)的速率 rateY = +(Math.random() * 2 - 1).toFixed(4); // 粒子在y方向運(yùn)動(dòng)的速率 return { x, y, r, rateX, rateY }; } // 隨機(jī)生成100個(gè)點(diǎn)的坐標(biāo)信息 for (let i = 0; i < 100; i++) { points.push(this.getPoint()); }將生成的點(diǎn)數(shù)組畫(huà)到canvas上
function drawPoints() { points.forEach((item, i) => { ctx.beginPath(); ctx.arc(item.x, item.y, item.r, 0, Math.PI*2, false); ctx.fillStyle = "#fff"; ctx.fill(); // 根據(jù)rateX和rateY移動(dòng)點(diǎn)的坐標(biāo) if(item.x > 0 && item.x < width && item.y > 0 && item.y < height) { item.x += item.rateX * rate; item.y += item.rateY * rate; } else { // 如果粒子運(yùn)動(dòng)超出了邊界,將這個(gè)粒子去除,同時(shí)重新生成一個(gè)新點(diǎn)。 points.splice(i, 1); points.push(getPoint(radius)); } }); }畫(huà)線
遍歷點(diǎn)數(shù)組,兩兩比較點(diǎn)坐標(biāo),如果兩點(diǎn)之間距離小于某個(gè)值,在兩個(gè)點(diǎn)之間畫(huà)一條直線,lineWidth隨兩點(diǎn)之間距離改變,距離越大,線越細(xì)。
// 計(jì)算兩點(diǎn)之間的距離 function dis(x1, y1, x2, y2) { var disX = Math.abs(x1 - x2), disY = Math.abs(y1 - y2); return Math.sqrt(disX * disX + disY * disY); } function drawLines() { const len = points.length; //對(duì)圓心坐標(biāo)進(jìn)行兩兩判斷 for(let i = 0; i < len; i++) { for(let j = len - 1; j >= 0; j--) { const x1 = points[i].x, y1 = points[i].y, x2 = points[j].x, y2 = points[j].y, disPoint = dis(x1, y1, x2, y2); // 如果兩點(diǎn)之間距離小于150,畫(huà)線 if(disPoint <= 150) { ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.strokeStyle = "#fff"; //兩點(diǎn)之間距離越大,線越細(xì),反之亦然 ctx.lineWidth = 1 - disPoint / distance; ctx.stroke(); } } } }動(dòng)畫(huà)
使用requestAnimationFrame循環(huán)調(diào)用draw方法(draw方法里包含畫(huà)點(diǎn)和畫(huà)線),同時(shí)在draw的時(shí)候根據(jù)rateX和rateY來(lái)改動(dòng)點(diǎn)的位置。
// 調(diào)用draw函數(shù)開(kāi)啟動(dòng)畫(huà) (function draw() { ctx.clearRect(0, 0, width, height); drawPoints(); // 如果不需要畫(huà)線,取消下面這行代碼即可。 drawLines(); window.requestAnimationFrame(draw); }());
完整代碼請(qǐng)看: https://github.com/PengJiyuan...我的Github:https://github.com/PengJiyuan
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/97190.html
摘要:模擬飛機(jī)航班線路動(dòng)畫(huà)一款基于的飛機(jī)航班線路模擬動(dòng)畫(huà),它模擬了許多航班在不同目的地的起飛降落數(shù)量。跳動(dòng)加載動(dòng)畫(huà)可調(diào)節(jié)參數(shù)這是一款基于的跳動(dòng)加載動(dòng)畫(huà),它的另一個(gè)特點(diǎn)是可以動(dòng)態(tài)調(diào)節(jié)動(dòng)畫(huà)參數(shù)。 showImg(https://segmentfault.com/img/bVblze6?w=900&h=383); HTML5 動(dòng)畫(huà)在Canvas 上得到了充分的發(fā)揮,我們 VIP 視頻也分享過(guò)很多相...
摘要:在融合動(dòng)畫(huà)的過(guò)程中,我并不想讓動(dòng)畫(huà)占用網(wǎng)頁(yè)的版面,而是作為背景動(dòng)畫(huà)。作為背景層進(jìn)行動(dòng)畫(huà)繪制,內(nèi)容文字層懸浮在上面。簡(jiǎn)化的代碼是這樣浮動(dòng)在上的文字內(nèi)容官方截圖到這里全背景動(dòng)畫(huà)問(wèn)題已經(jīng)順利的解決了。 在日常的學(xué)習(xí)中我接觸到一些HTML5 Canvas動(dòng)畫(huà),在開(kāi)發(fā) tiomg.org 太美在線工具網(wǎng)站 的時(shí)候,想將這些震撼或小清新的動(dòng)畫(huà)融合到工具網(wǎng)站中,這樣可以使原本單調(diào)的網(wǎng)頁(yè)看起來(lái)豐富和更...
摘要:在融合動(dòng)畫(huà)的過(guò)程中,我并不想讓動(dòng)畫(huà)占用網(wǎng)頁(yè)的版面,而是作為背景動(dòng)畫(huà)。作為背景層進(jìn)行動(dòng)畫(huà)繪制,內(nèi)容文字層懸浮在上面。簡(jiǎn)化的代碼是這樣浮動(dòng)在上的文字內(nèi)容官方截圖到這里全背景動(dòng)畫(huà)問(wèn)題已經(jīng)順利的解決了。 在日常的學(xué)習(xí)中我接觸到一些HTML5 Canvas動(dòng)畫(huà),在開(kāi)發(fā) tiomg.org 太美在線工具網(wǎng)站 的時(shí)候,想將這些震撼或小清新的動(dòng)畫(huà)融合到工具網(wǎng)站中,這樣可以使原本單調(diào)的網(wǎng)頁(yè)看起來(lái)豐富和更...
摘要:在融合動(dòng)畫(huà)的過(guò)程中,我并不想讓動(dòng)畫(huà)占用網(wǎng)頁(yè)的版面,而是作為背景動(dòng)畫(huà)。作為背景層進(jìn)行動(dòng)畫(huà)繪制,內(nèi)容文字層懸浮在上面。簡(jiǎn)化的代碼是這樣浮動(dòng)在上的文字內(nèi)容官方截圖到這里全背景動(dòng)畫(huà)問(wèn)題已經(jīng)順利的解決了。 在日常的學(xué)習(xí)中我接觸到一些HTML5 Canvas動(dòng)畫(huà),在開(kāi)發(fā) tiomg.org 太美在線工具網(wǎng)站 的時(shí)候,想將這些震撼或小清新的動(dòng)畫(huà)融合到工具網(wǎng)站中,這樣可以使原本單調(diào)的網(wǎng)頁(yè)看起來(lái)豐富和更...
閱讀 1437·2021-10-09 09:44
閱讀 1495·2021-09-28 09:36
閱讀 16376·2021-09-22 15:55
閱讀 1306·2021-09-22 15:45
閱讀 2261·2021-09-02 09:48
閱讀 2854·2019-08-29 17:19
閱讀 2358·2019-08-29 10:54
閱讀 1010·2019-08-23 18:40