复刻|苹果发布会环形进度条【Vanilla + canvas】

简介: 复刻|苹果发布会环形进度条【Vanilla + canvas】

前言


canvas 真是一个好东西,它给前端插上了想象的翅膀,伴随着 h5 而来,将 web 代入了新的领域,基于canvas 技术实现的各种酷炫效果和2d、3d 游戏,也让浏览器能承载更加强大的功能。尤其是它性能还很好,搞游戏再合适不过了,我就喜欢用 canvas 写一些小游戏玩。

在线地址


1687779802590.png


最近无意中看到前段时间写的这个小效果,觉得挺有意思的,就分享出来;这是苹果ios 12 发布会上库克 ppt 里展示的内容,一个带荧光效果的环形进度条;一个接外包项目的朋友,遇到客户指定要这个效果,实在搞不定了找到我,于是才有了下面的复刻实现。


1687779794204.png


基础 Dom 结构


第一步先把标签元素写上,后面将据此生成画布上下文对象,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()
}


1687779781899.png


画弧线


背景层之上,就需要弧线来表示主效果了,我们通过两个尺寸不同,颜色不同的圆形叠加来形成 环形效果;


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


1687779772624.png


这个是荧光色的圆,我们需要一个黑色的小号圆来把遮盖住中间实心部分,只突出边框,就有了环形效果;


1687779766001.png


顶部缺口的实现


发布会上的环形图是有顶部缺口的,这个很简单,只需要通过 clearRect 清除掉这部分区域就行了;


// 画遮盖
function cover(cx, cy, r) {
    ctx.beginPath();
    ctx.moveTo(cx, cy - r);
    ctx.clearRect(cx - 8, cy - r - 18, 6, 30);
}


1687779757374.png


让画面动起来


通过定时执行刷新动作,来实现进度条的数据更新和画布重绘,可以使用 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)
  sectorCover(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)


最终效果:


1687779748761.png


总结


通过 canvas api 结合样式配置和灵魂算法,100 行左右的代码实现了苹果发布会上的这个效果,是不是很有意思呐,还支持通过修改样式配置来定制更加丰富的效果;

觉得不错的话 各位大佬可以给个赞可以吗 ??

目录
相关文章
|
存储 编解码 JavaScript
华为鸿蒙手表实现除夕夜烟花燃放效果
华为鸿蒙手表实现除夕夜烟花燃放效果
1026 0
华为鸿蒙手表实现除夕夜烟花燃放效果
|
存储 前端开发 算法
wqrfnium震撼发布
你是否曾遇到以下情况: 好不容易写个selenium自动化脚本,然后没几天,一运行,报错了。用例失败了。然后去查发现是因为元素的属性前端更改了导致定位失败。后期维护起来的成本太大了。 很多领导考虑到公司实际情况,就直接扼杀了你的selenium自动化方案。 曾几何时,面试题中问:ui自动化的使用场景是什么?答:前端不频繁变动
wqrfnium震撼发布
|
vr&ar 开发工具 图形学
谷歌发布 VR SDK,首批“白日梦”手机将在冬季前面世
谷歌 Daydream 平台可能是拯救手机 VR 盒子体验不佳的良药,不过,自从其在今年 5 月份的 Google I/O 大会上被发布后,至今普通消费者都未能真正体验到这款产品。
146 0
谷歌发布 VR SDK,首批“白日梦”手机将在冬季前面世
|
生物认证 Android开发 iOS开发
今年的红色特别版 iPhone ,除了公益,还肩负着苹果更多的期待
如你们所见,红色特别版 iPhone 8 和 iPhone 8 Plus 已经出现在苹果官网上了!
609 0
今年的红色特别版 iPhone ,除了公益,还肩负着苹果更多的期待
|
供应链 iOS开发 SoC
重磅!小米MIX 2怒怼iPhone 8!
最近科技手机圈内除了三星Note 8和iPhone 8为科技“春晚”做足准备外,连擅长怼魅族的小米也紧随其后。9月,谁会占据主导地位?
124 0
重磅!小米MIX 2怒怼iPhone 8!
|
传感器 内存技术
魅族17系列发布,拥抱全面屏
5月8日,魅族发布了魅族17系列手机,发布会称之为“梦想旗舰”。这也是进入全面屏时代后,魅族首款非上下等边框的手机。
273 0
魅族17系列发布,拥抱全面屏
|
机器学习/深度学习 Web App开发 人工智能
苹果开发者大会WWDC 2017:首次全面展示苹果的人工智能实力
当地时间 6 月 5 日,苹果开发者年度盛会 WWDC 2017 在美国加州举行。在这个舞台上,我们看到了苹果软件、硬件有哪些新的升级、推新。但在 Keynote 中,我们看到了苹果不同于谷歌、Facebook 的人工智能战略。
268 0
苹果开发者大会WWDC 2017:首次全面展示苹果的人工智能实力
|
人工智能 安全 搜索推荐
苹果 WWDC 2016 大会内容预测:Siri将成最大亮点
6 月 13 日,世界各地的苹果粉又会踏上年度旧金山朝圣之旅,因为 2016 年度苹果全球开发者大会(WWDC)即将召开。这场会议已经见证了很多颠覆性新产品的诞生,比如 iPhone 和 iPad。从严格意义上来说,WWDC是一场开发者会议,当然也会发布一些影响商业技术用户的消息。以下是对这次WWDC大会发布内容的推测。
153 0
苹果 WWDC 2016 大会内容预测:Siri将成最大亮点
|
Windows
微软可折叠双屏 Surface 诞生前的辛酸往事
传闻已久的可折叠双屏 Surface 的亮相提上了日程。
1085 0
|
监控 安全 Android开发
黑帽大会亮点预览
同往常一样,将于本周在拉斯维加斯举行的年度黑帽大会无疑是重磅事件。会上,安全专家将会粉碎人们不切实际的幻想——他们会告诉大众高科技行业制造的东西,不会有任何安全可言。 在2011年的黑帽大会上,安全研究人员将会展示50多种产品,其中最密集的是展示设备漏洞:包括USB设备,打印机,扫描仪,iPhone与安卓设备,Chrome,笔记本电脑,行业监控与数据采集系统(SCADA)。
1103 0