如何使用ES6的class類繼承來實(shí)現(xiàn)絢麗小球效果
介紹
本效果采用Canvas畫布繪制,再利用class類繼承實(shí)現(xiàn),實(shí)現(xiàn)的效果鼠標(biāo)在指定Canvas位置移動(dòng),會(huì)在當(dāng)前鼠標(biāo)的位置產(chǎn)生隨機(jī)顏色的小球,之后小球會(huì)慢慢消失。
效果圖示

實(shí)現(xiàn)步驟
- 書寫HTML
- 創(chuàng)建canvas畫布環(huán)境
- 書寫小球類Ball
- 實(shí)現(xiàn)繼承球類(Ball)的MoveBall類
- 實(shí)例化小球
HTML結(jié)構(gòu)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>絢麗小球</title>
<style>
#canvas{
margin-left: 100px
}
</style>
</head>
<body>
<canvas id="canvas">你的瀏覽器不支持canvas</canvas>
<!-- <script src="./underscore-min.js"></script> -->
<!-- underscore 中已有封裝好的 _.random函數(shù),引入就可以不用再手動(dòng)寫隨機(jī)函數(shù) -->
<script src="./index.js"></script>
</body>
</html>
創(chuàng)建canvas畫布環(huán)境
// index.js
// 1、獲取當(dāng)前的畫布
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 設(shè)置畫布的大小樣式
canvas.width = 1000;
canvas.height = 600;
canvas.style.backgroundColor = '#000'
實(shí)例解析
首先,找到 canvas 元素:
const canvas=document.getElementById("myCanvas");
然后,創(chuàng)建 context 對(duì)象:
const ctx = canvas.getContext('2d');
設(shè)置寬高背景色
書寫小球類Ball
// index.js
// 2、小球類
class Ball {
constructor (x, y, color) {
this.x = x; // x軸
this.y = y; // y軸
this.color = color; // 小球的顏色
this.r = 40; // 小球的半徑
}
// 繪制小球
render () {
ctx.save();
ctx.beginPath();
ctx.arc(this.x, this.y, this.r , 0, Math.PI * 2);
ctx.fillStyle = this.color;
ctx.fill();
ctx.restore();
}
}
實(shí)例解析
- 可以看到里面有一個(gè)constructor()方法,這就是構(gòu)造方法,而this關(guān)鍵字則代表實(shí)例對(duì)象。
- save() ---- 保存當(dāng)前環(huán)境的狀態(tài)
- beginPath() ---- 起始一條路徑,或重置當(dāng)前路徑
- arc() ---- 用于創(chuàng)建弧/曲線(用于創(chuàng)建圓或部分圓)-- 參數(shù)如下表
| 參數(shù) | 描述 |
|---|---|
| x | 圓的中心的 x 坐標(biāo)。 |
| y | 圓的中心的 y 坐標(biāo)。 |
| r | 圓的半徑。 |
| sAngle | 起始角,以弧度計(jì)(弧的圓形的三點(diǎn)鐘位置是 0 度)。 |
| eAngle | 結(jié)束角,以弧度計(jì)。 |
| counterclockwise | 可選。規(guī)定應(yīng)該逆時(shí)針還是順時(shí)針繪圖。False = 順時(shí)針,true = 逆時(shí)針。 |
- fillStyle() ---- 設(shè)置或返回用于填充繪畫的顏色、漸變或模式。
- fill() ---- 填充當(dāng)前繪圖(路徑)
- restore() ---- 返回之前保存過的路徑狀態(tài)和屬性。
實(shí)現(xiàn)繼承球類(Ball)的MoveBall類
// index.js
// 3、會(huì)移動(dòng)小球的類
class MoveBall extends Ball { // 繼承
constructor (x, y, color) {
super(x, y, color);
// 量的變化
// 小球的隨機(jī)坐標(biāo)
this.dX = Random(-5, 5);
this.dY = Random(-5, 5);
// 半徑變小的隨機(jī)數(shù),因?yàn)樾∏蚴菑囊婚_始大然后慢慢的消失
this.dR = Random(1, 3);
}
// 4、改變小球的位置和半徑
upDate () {
this.x += this.dX;
this.y += this.dY;
this.r -= this.dR;
// 判斷小球的半徑是否小于0
if(this.r < 0) {
this.r = 0 // 半徑為0表示小球消失
}
}
}
實(shí)例解析
- 這里定義了一個(gè)MoveBall 類,該類通過extends關(guān)鍵字,繼承了Ball類的所有屬性和方法。
- super關(guān)鍵字,它在這里表示父類的構(gòu)造函數(shù),用來新建父類的this對(duì)象。子類必須在constructor方法中調(diào)用super方法,否則新建實(shí)例時(shí)會(huì)報(bào)錯(cuò)。這是因?yàn)樽宇愖约旱膖his對(duì)象,必須先通過父類的構(gòu)造函數(shù)完成塑造,得到與父類同樣的實(shí)例屬性和方法,然后再對(duì)其進(jìn)行加工,加上子類自己的實(shí)例屬性和方法。如果不調(diào)用super方法,子類就得不到this對(duì)象。(詳情請(qǐng)點(diǎn)擊)
- upDate方法目的就是改變小球的位置和半徑,根據(jù)鼠標(biāo)位置的不同進(jìn)行不同的變化
實(shí)例化小球
// index.js
// 5、實(shí)例化小球
// 存放產(chǎn)生的小球
let ballArr = [];
// 定義隨機(jī)函數(shù) 如果引用了underscore-min.js 就不用寫隨機(jī)函數(shù),可以直接用 _.random
let Random = (min, max) => {
return Math.floor(Math.random() * (max - min) + min);
}
// 監(jiān)聽鼠標(biāo)的移動(dòng)
canvas.addEventListener('mousemove', function (e){
// 隨機(jī)顏色
// 也可以固定顏色數(shù)組 let colorArr = ['red', 'green', 'blue', 'yellow', 'orange', 'pink'];
// bgcolor ==> colorArr[Random(0, colorArr.length - 1)]
let bgColor = `rgb(${Random(0,256)}, ${Random(0,256)}, ${Random(0,256)})`;
ballArr.push(new MoveBall(e.offsetX, e.offsetY, bgColor));
console.log(ballArr);
})
// 開啟定時(shí)器
setInterval(function () {
// 清屏
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 繪制小球
for (let i = 0 ; i < ballArr.length; i++ ) {
ballArr[i].render();
ballArr[i].upDate();
}
}, 50);
實(shí)例解析
- 書寫了一個(gè)用于產(chǎn)生隨機(jī)顏色的Random函數(shù)
- 監(jiān)聽鼠標(biāo)的移動(dòng)創(chuàng)建移動(dòng)的小球,然后推入存儲(chǔ)小球的數(shù)組中,這樣數(shù)組里的小球就有render和upDate方法,最后依次調(diào)用Ball類的render方法進(jìn)行繪制,調(diào)用MoveBall的upDate方法。至此效果就出來啦!
- clearRect清屏操作 ---- 在給定的矩形內(nèi)清除指定的像素(詳情點(diǎn)擊)。不清屏的效果看下圖

我們可以看到不清屏小球半徑逐漸縮小到最后小球是不會(huì)消失的,咋們肯定要的效果不是這樣啦!清屏的效果是啥呢?就是文章開頭的那個(gè)效果啦!(寶,玩得開心喲❤)
index.js完整代碼
// 1、獲取當(dāng)前的畫布
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 設(shè)置畫布的大小樣式
canvas.width = 1000;
canvas.height = 600;
canvas.style.backgroundColor = '#000'
// 2、小球類
class Ball {
constructor (x, y, color) {
this.x = x;
this.y = y;
this.color = color;
this.r = 40;
}
// 繪制小球
render () {
ctx.save();
ctx.beginPath();
ctx.arc(this.x, this.y, this.r , 0, Math.PI * 2);
ctx.fillStyle = this.color;
ctx.fill();
ctx.restore();
}
}
// 3、會(huì)移動(dòng)小球的類
class MoveBall extends Ball { // 繼承
constructor (x, y, color) {
super(x, y, color);
// 量的變化
// 小球的隨機(jī)坐標(biāo)
this.dX = Random(-5, 5);
this.dY = Random(-5, 5);
// 半徑變小的隨機(jī)數(shù)
this.dR = Random(1, 3);
}
// 4、改變小球的位置和半徑
upDate () {
this.x += this.dX;
this.y += this.dY;
this.r -= this.dR;
// 判斷小球的半徑是否小于0
if(this.r < 0) {
this.r = 0
}
}
}
// 5、實(shí)例化小球
// 存放產(chǎn)生的小球
let ballArr = [];
// 定義隨機(jī)函數(shù) 如果引用了underscore-min.js 就不用寫隨機(jī)函數(shù),可以直接用 _.random
let Random = (min, max) => {
return Math.floor(Math.random() * (max - min) + min);
}
// 監(jiān)聽鼠標(biāo)的移動(dòng)
canvas.addEventListener('mousemove', function (e){
// 隨機(jī)顏色
// 也可以固定顏色數(shù)組 let colorArr = ['red', 'green', 'blue', 'yellow', 'orange', 'pink'];
// bgcolor ==> colorArr[Random(0, colorArr.length - 1)]
let bgColor = `rgb(${Random(0,256)}, ${Random(0,256)}, ${Random(0,256)})`;
ballArr.push(new MoveBall(e.offsetX, e.offsetY, bgColor));
console.log(ballArr);
})
// 開啟定時(shí)器
setInterval(function () {
// 清屏
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 繪制小球
for (let i = 0 ; i < ballArr.length; i++ ) {
ballArr[i].render();
ballArr[i].upDate();
}
}, 50);
總結(jié)
希望這個(gè)小demo能幫大家更熟悉ES6中class類的理解與使用,到此這篇關(guān)于如何使用ES6的class類繼承來實(shí)現(xiàn)絢麗小球效果的文章就介紹到這了,更多相關(guān)ES6 class類繼承實(shí)現(xiàn)小球內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
layui-table表復(fù)選框勾選的所有行數(shù)據(jù)獲取的例子
今天小編就為大家分享一篇layui-table表復(fù)選框勾選的所有行數(shù)據(jù)獲取的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JavaScript解決浮點(diǎn)數(shù)計(jì)算不準(zhǔn)確問題的方法分析
這篇文章主要介紹了JavaScript解決浮點(diǎn)數(shù)計(jì)算不準(zhǔn)確問題的方法,結(jié)合實(shí)例形式分析了javascript浮點(diǎn)數(shù)運(yùn)算精度誤差的原因以及相關(guān)的解決方法與具體操作技巧,需要的朋友可以參考下2018-07-07
用js判斷頁面刷新或關(guān)閉的方法(onbeforeunload與onunload事件)
Onunload,onbeforeunload都是在刷新或關(guān)閉時(shí)調(diào)用,可以在<script>腳本中通過window.onunload來指定或者在<body>里指定2012-06-06
JavaScript的DOM與BOM的區(qū)別與用法詳解
這篇文章主要為大家詳細(xì)介紹了JavaScript的DOM與BOM的區(qū)別與用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

