<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
canvas 真是一個好東西,它給前端插上了想象的翅膀,伴隨著 h5 而來,將 web 代入了新的領域,基於canvas 技術實現的各種酷炫效果和2d、3d 遊戲,也讓瀏覽器能承載更加強大的功能。尤其是它效能還很好,搞遊戲再合適不過了,我就喜歡用 canvas 寫一些小遊戲玩。
最近無意中看到前段時間寫的這個小效果,覺得挺有意思的,就分享出來;這是蘋果ios 12 釋出會上庫克 ppt 裡展示的內容,一個帶熒光效果的環形進度條;一個接外包專案的朋友,遇到客戶指定要這個效果,實在搞不定了找到我,於是才有了下面的復刻實現。
第一步先把標籤元素寫上,後面將據此生成畫布上下文物件,canvas 標籤內的內容將在瀏覽器不支援的情況下顯示,否則會自動忽略。
<div class="container"> <canvas id="canvas" width="600" height="600"> <p>抱歉,您的瀏覽器不支援canvas</p> </canvas> </div>
let canvas = document.getElementById("canvas") let ctx = canvas.getContext("2d") // 上下文物件 let circleX = canvas.width / 2 // 中心x座標 let circleY = canvas.height / 2 // 中心y座標 let radius = 100 // 圓環半徑 let percent = 90 // 最終百分比 let lineWidth = 1 // 圓形線條的寬度 let fontSize = 42 // 字型大小
首先畫一個圓出來,主要定義畫筆顏色、位置、樣式、陰影、模糊值等, 這個是作為背景圖使用的。
// 畫圓 function circle(cx, cy, r) { ctx.beginPath() // ctx.moveTo(cx, cy-r-10) ctx.lineWidth = lineWidth ctx.strokeStyle = "#666" ctx.lineCap = "round" ctx.shadowColor = "#000" //設定陰影顏色 ctx.shadowBlur = 0 //設定模糊值 ctx.shadowOffsetX = 0 ctx.shadowOffsetY = 0 ctx.arc(cx, cy, r + 10, 0, (Math.PI / 180) * 360) ctx.moveTo(cx + r, cy) // ctx.moveTo(cx, cy-r) ctx.arc(cx, cy, r, 0, (Math.PI / 180) * 360) ctx.stroke() }
背景層之上,就需要弧線來表示主效果了
// 畫弧線 function sector(cx, cy, r, startAngle, endAngle, anti) { ctx.beginPath() ctx.moveTo(cx, cy - r - 5) // 從圓形底部開始畫 ctx.lineWidth = 12 ctx.strokeStyle = "#ffccff" // ctx.fillStyle = '#ffccff' // 圓弧兩端的樣式 ctx.lineCap = "round" ctx.shadowColor = "#ff6699" //設定陰影顏色 ctx.shadowOffsetX = 0 ctx.shadowOffsetY = 0 ctx.shadowBlur = 4 //設定模糊值 // 圓弧 ctx.arc( cx, cy, r + 5, startAngle * (Math.PI / 180.0) - Math.PI / 2, endAngle * (Math.PI / 180.0) - Math.PI / 2, anti ); ctx.moveTo(cx, cy - r) // 從圓形底部開始畫 ctx.moveTo(cx, cy - r) // 從圓形底部開始畫 ctx.stroke() }
通過定時執行重新整理動作,來實現進度條的資料更新和畫布重繪,可以使用 while 迴圈配合 async await setTimeout 非同步來實現影格率控制
// 重新整理 function loading(n) { // 清除canvas內容 ctx.clearRect(0, 0, circleX * 2, circleY * 2) // 中間的字 ctx.font = fontSize + "px April" ctx.textAlign = "center" ctx.textBaseline = "middle" ctx.fillStyle = "#ffccff" ctx.fillText(parseFloat(n).toFixed(0) + "%", circleX, circleY) // 圓形 circle(circleX, circleY, radius) // 圓弧 sector(circleX, circleY, radius, 0, (n / 100) * 360) sector2(circleX, circleY, radius, 0, (n / 100) * 360) // 遮蓋 cover(circleX, circleY, radius) } // 更新進度 function changeProcess(val, times) { return new Promise(function (resolve, reject) { setTimeout(function () { loading(val) resolve() }, times) }) } // 迴圈 async function loop(val) { while (true) { for (let i = 0; i < val; i++) { await changeProcess(i + 1, 1000); } return } } loop(percent)
通過 canvas 提供的 arc api 結合樣式設定,100 行左右的程式碼實現了蘋果釋出會上的這個效果,是不是很有意思吶。
到此這篇關於JavaScript canvas復刻蘋果釋出會環形進度條的文章就介紹到這了,更多相關JavaScript canvas進度條內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45