摘要:整理下思路,要獲取異步加載文件的進(jìn)度要怎么做答將需要異步載入的文件放進(jìn)一個(gè)數(shù)組中。通過(guò)獲取是否加載完畢怎么繪制一個(gè)動(dòng)態(tài)的環(huán)形加載圖答需要用到的核心有。
1.整理下思路,要獲取異步加載JS文件的進(jìn)度要怎么做?
答:將需要異步載入的文件放進(jìn)一個(gè)數(shù)組中。如下。
const scriptArr = ["./test_1.js", "./test_3.js", "./test_4.js", "./test_5.js"];
然后動(dòng)態(tài)創(chuàng)建script標(biāo)簽插入到body標(biāo)簽中。通過(guò)script.onload獲取JS是否加載完畢
2.怎么繪制一個(gè)動(dòng)態(tài)的canvas環(huán)形loading加載圖?答:需要用到的canvas 核心Api有:ctx.arc()。這是繪制園環(huán)的必須api.
3.既然能獲取到加載完畢的回調(diào)函數(shù),也能夠創(chuàng)建一個(gè)canvas loading實(shí)例,如何把它們關(guān)聯(lián)到一起整合到一塊?
編寫(xiě)一個(gè)circleProgress類,用來(lái)創(chuàng)建環(huán)形loading實(shí)例
class CircleProgress { constructor(ctxs, width, height, arc) { this.ctx = ctxs this.width = width this.height = height this.arc = arc this.setArea(width, height) } //設(shè)置canvas的寬高 setArea(width, height) { this.ctx.canvas.width = width this.ctx.canvas.height = height } //清除畫(huà)布 clearFill() { this.ctx.clearRect(0, 0, this.width, this.width); } //繪制環(huán)形進(jìn)度圖的背景 顏色是可配置的 fillBg() { this.ctx.beginPath(); this.ctx.lineWidth = this.arc; this.ctx.strokeStyle = "#ccc"; this.ctx.arc(this.width / 2, this.width / 2, 45, 0, 2 * Math.PI); this.ctx.stroke(); } //繪制進(jìn)度條 fillArc(x) { this.ctx.beginPath(); this.ctx.lineWidth = this.arc; this.ctx.strokeStyle = "yellow"; this.ctx.arc(this.width / 2, this.width / 2, 45, -90 * Math.PI / 180, (x * 3.6 - 90) * Math.PI / 180); this.ctx.stroke(); } //繪制中心數(shù)字展示 fillText(x) { this.ctx.font = "14px" + " Arial"; this.ctx.fillStyle = "red"; this.ctx.textBaseline = "middle"; this.ctx.textAlign = "center"; this.ctx.fillText(x.toFixed(1) + "%", this.width / 2, this.width / 2); } //總繪制方法 fill(x) { this.fillBg(); this.fillArc(x); this.fillText(x); } }
大概就是這個(gè)樣子
獲取當(dāng)前JS,加載進(jìn)度
function jsProgress(circle, eachs, max, scriptArr) { let currentIndex = 0; //遍歷所有文件名 for (let i = 0; i < scriptArr.length; i++) { let scriptNode = document.createElement("script"); scriptNode.src = scriptArr[i]; //插入創(chuàng)建好的script引用節(jié)點(diǎn) document.getElementById("bodys").appendChild(scriptNode); //創(chuàng)建分布值 每個(gè)文件占據(jù)的進(jìn)度值 比如4個(gè)文件 每個(gè)文件占據(jù)100/4=25 let steps = 0; //插入的文件加載完畢后的回調(diào) scriptNode.onload = function() { //按照每20毫秒一幀渲染canvas畫(huà)布 以展示出動(dòng)態(tài)的加載效果 let ani = setInterval(function() { //此處可以優(yōu)化,有好的建議可以告訴我 if (steps <= max || steps == 100) { circle.clearFill(); if (steps > 100) { steps = 100 } circle.fill(steps) steps++ } else { clearInterval(ani) if (max <= 100) { max = max + eachs currentIndex++; } if (currentIndex == scriptArr.length) { console.log(`全部JS加載完成`) } console.log(`sciprtNode${i}已加載完成`) } }, 20) } } }最終效果 附錄:全部代碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94630.html
摘要:前提有時(shí)候在項(xiàng)目中會(huì)有用到進(jìn)度條的情況,使用也可以實(shí)現(xiàn),但是對(duì)于性能不好的設(shè)備,或者網(wǎng)絡(luò)不好的情況下,卡頓現(xiàn)象非常明顯,避免出現(xiàn)不流暢的尷尬情況,所以記錄一下,使用來(lái)實(shí)現(xiàn)的方法。 前提:有時(shí)候在項(xiàng)目中會(huì)有用到進(jìn)度條的情況,使用css3也可以實(shí)現(xiàn),但是對(duì)于性能不好的設(shè)備,或者網(wǎng)絡(luò)不好的情況下,卡頓現(xiàn)象非常明顯,避免出現(xiàn)不流暢的尷尬情況,所以記錄一下,使用canvas來(lái)實(shí)現(xiàn)的方法。 效果圖...
摘要:前提有時(shí)候在項(xiàng)目中會(huì)有用到進(jìn)度條的情況,使用也可以實(shí)現(xiàn),但是對(duì)于性能不好的設(shè)備,或者網(wǎng)絡(luò)不好的情況下,卡頓現(xiàn)象非常明顯,避免出現(xiàn)不流暢的尷尬情況,所以記錄一下,使用來(lái)實(shí)現(xiàn)的方法。 前提:有時(shí)候在項(xiàng)目中會(huì)有用到進(jìn)度條的情況,使用css3也可以實(shí)現(xiàn),但是對(duì)于性能不好的設(shè)備,或者網(wǎng)絡(luò)不好的情況下,卡頓現(xiàn)象非常明顯,避免出現(xiàn)不流暢的尷尬情況,所以記錄一下,使用canvas來(lái)實(shí)現(xiàn)的方法。 效果圖...
閱讀 1209·2021-11-22 12:05
閱讀 1336·2021-09-29 09:35
閱讀 630·2019-08-30 15:55
閱讀 3122·2019-08-30 14:12
閱讀 954·2019-08-30 14:11
閱讀 2875·2019-08-30 13:10
閱讀 2400·2019-08-29 16:33
閱讀 3327·2019-08-29 11:02