欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript canvas復(fù)刻蘋果發(fā)布會環(huán)形進度條

 更新時間:2022年07月26日 16:45:53   作者:Ethan_Zhou  
canvas 真是一個好東西,它給前端插上了想象的翅膀,伴隨著 h5 而來,將 web 代入了新的領(lǐng)域。本文將利用anvas復(fù)刻蘋果發(fā)布會環(huán)形進度條,感興趣的可以嘗試一下

前言

canvas 真是一個好東西,它給前端插上了想象的翅膀,伴隨著 h5 而來,將 web 代入了新的領(lǐng)域,基于canvas 技術(shù)實現(xiàn)的各種酷炫效果和2d、3d 游戲,也讓瀏覽器能承載更加強大的功能。尤其是它性能還很好,搞游戲再合適不過了,我就喜歡用 canvas 寫一些小游戲玩。

在線地址

最近無意中看到前段時間寫的這個小效果,覺得挺有意思的,就分享出來;這是蘋果ios 12 發(fā)布會上庫克 ppt 里展示的內(nèi)容,一個帶熒光效果的環(huán)形進度條;一個接外包項目的朋友,遇到客戶指定要這個效果,實在搞不定了找到我,于是才有了下面的復(fù)刻實現(xiàn)。

基礎(chǔ) Dom 結(jié)構(gòu)

第一步先把標(biāo)簽元素寫上,后面將據(jù)此生成畫布上下文對象,canvas 標(biāo)簽內(nèi)的內(nèi)容將在瀏覽器不支持的情況下顯示,否則會自動忽略。

<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坐標(biāo)
let circleY = canvas.height / 2 // 中心y坐標(biāo)
let radius = 100 // 圓環(huán)半徑
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" //設(shè)置陰影顏色
  ctx.shadowBlur = 0 //設(shè)置模糊值
  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" //設(shè)置陰影顏色
  ctx.shadowOffsetX = 0
  ctx.shadowOffsetY = 0
  ctx.shadowBlur = 4 //設(shè)置模糊值

  // 圓弧
  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()
}

讓畫面動起來

通過定時執(zhí)行刷新動作,來實現(xiàn)進度條的數(shù)據(jù)更新和畫布重繪,可以使用 while 循環(huán)配合 async await setTimeout 異步來實現(xiàn)幀率控制

// 刷新
function loading(n) {
  // 清除canvas內(nèi)容
  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)
  })
}

// 循環(huán)
async function loop(val) {
  while (true) {
    for (let i = 0; i < val; i++) {
      await changeProcess(i + 1, 1000);
    }
    return
  }
}

loop(percent)

總結(jié)

通過 canvas 提供的 arc api 結(jié)合樣式配置,100 行左右的代碼實現(xiàn)了蘋果發(fā)布會上的這個效果,是不是很有意思吶。

到此這篇關(guān)于JavaScript canvas復(fù)刻蘋果發(fā)布會環(huán)形進度條的文章就介紹到這了,更多相關(guān)JavaScript canvas進度條內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解微信小程序開發(fā)之城市選擇器 城市切換

    詳解微信小程序開發(fā)之城市選擇器 城市切換

    這篇文章主要介紹了詳解微信小程序開發(fā)之城市選擇器 城市切換,非常具有實用價值,需要的朋友可以參考下。
    2017-01-01
  • Unicode 編碼轉(zhuǎn)換器

    Unicode 編碼轉(zhuǎn)換器

    Unicode 編碼轉(zhuǎn)換器...
    2007-01-01
  • 如何基于viewport vm適配移動端頁面

    如何基于viewport vm適配移動端頁面

    這篇文章主要介紹了如何基于viewport vm適配移動端頁面,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 微信小程序自定義導(dǎo)航欄實例代碼

    微信小程序自定義導(dǎo)航欄實例代碼

    這篇文章主要給大家介紹了關(guān)于微信小程序自定義導(dǎo)航欄的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 如何使用TypeScript實現(xiàn)一個瀏覽器事件的集中管理

    如何使用TypeScript實現(xiàn)一個瀏覽器事件的集中管理

    這篇文章主要介紹了使用TypeScript實現(xiàn)一個瀏覽器事件的集中管理,瀏覽器事件模型的主要優(yōu)點是它可以使開發(fā)人員更加靈活地處理用戶交互,并且可以通過事件委托等技術(shù)來提高性能,本文給大家講解的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 如何利用JS檢查元素是否在視口內(nèi)

    如何利用JS檢查元素是否在視口內(nèi)

    這篇文章主要給大家介紹了關(guān)于如何利用JS檢查元素是否在視口內(nèi)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Layui Table js 模擬選中checkbox的例子

    Layui Table js 模擬選中checkbox的例子

    今天小編就為大家分享一篇Layui Table js 模擬選中checkbox的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript高級程序設(shè)計閱讀筆記(五) ECMAScript中的運算符(一)

    JavaScript高級程序設(shè)計閱讀筆記(五) ECMAScript中的運算符(一)

    ECMAScript中的運算符,學(xué)習(xí)js的朋友可以看看
    2012-02-02
  • 微信小程序官方動態(tài)自定義底部tabBar的例子

    微信小程序官方動態(tài)自定義底部tabBar的例子

    這篇文章主要介紹了微信小程序官方動態(tài)自定義底部tabBar的例子,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • js中url對象化管理分析

    js中url對象化管理分析

    這篇文章主要介紹了js中url對象化管理的相關(guān)知識以及用法介紹,有需要的朋友跟著小編一起學(xué)習(xí)下。
    2017-12-12

最新評論