当前位置: 首页 > news >正文

【CSS案例】下载进度条

【CSS案例】下载进度条示例图

在这里插入图片描述

HTML代码

<div class="loader" onclick="render()"><div class="per">0</div>
</div>

CSS代码

body {background: #292929;--val: 360deg;--bcolor1: #17a2ff;--bcolor2: #343434;
}
.loader {margin: 150px auto;height: 400px;width: 400px;/* 两个角度设为一样,渐变才会有割裂感 */background: conic-gradient(var(--bcolor1) var(--val), var(--bcolor2) var(--val));position: relative;border-radius: 50%;
}
.loader::before {  /* 半透明蒙版 */content: '';height: 84%;width: 84%;border-radius: 50%;background: rgba(41, 41, 41, .85);position: absolute;inset: 8%;
}
.loader::after {content: '';height: 400px;width: 400px;background: var(--bcolor1);position: absolute;clip-path: polygon(45% 25%, 55% 25%, 55% 55%, 65% 55%, 50% 75%, 35% 55%, 45% 55%);  /* 下箭头 */
}
.loader.tick::after {clip-path: polygon(42% 63%, 79% 36%, 42% 70%, 25% 53%);  /* 对号 */
}
.per {width: 100%;opacity: 0;overflow: hidden;color: var(--bcolor1);text-align: center;top: 60%;position: absolute;font-size: 4rem;font-weight: bolder;
}
.per::after {content: '%';
}
.min::after {animation: flash 1s;transform: scale(0.6) translate(0, -20%);
}
/* 下箭头缩放并上移 */
@keyframes flash {from {transform: scale(1) translate(0, 0);}to {transform: scale(0.6) translate(0, -20%);}
}
.per-show {animation: per .5s;opacity: 1;
}
/* 显示百分比 */
@keyframes per {from {opacity: 0;}to {opacity: 1;}
}

JS代码

let deg = 0, i = 0;
let loader = document.querySelector('.loader');  // 进度条
let per = document.querySelector('.per');  // 百分比
let colorLib = {  // 颜色库wineRed: 'f8094b',darkGray: '343434',green: '00ff2b'
};
let middleColor = [];  // 中间色
function render() {if (deg === 0) {loader.classList.add('min');  // 【下箭头】缩小per.classList.add('per-show');  // 显示【百分比】// 修改【圆锥渐变】颜色loader.style.setProperty('--bcolor1', '#' + colorLib.wineRed);loader.style.setProperty('--bcolor2', '#' + colorLib.darkGray);}// 计算百分比per.innerHTML = Math.floor(100 / 360 * deg);loader.style.setProperty('--val', deg + 'deg');if (deg > 360) {  // 进度条加载完成loader.classList.add('tick');  // 【下箭头】改为【对号】// 计算渐变残差// middleColor = gradient(colorLib.wineRed, colorLib.green, 100);// changeColor();  // 渐变改色} else {deg++window.requestAnimationFrame(render)}
}

优化

由于在进度条加载完,突然由红变绿,感觉颜色很突兀,所以加了渐变

/* 修改颜色(渐变) */
function changeColor() {if (middleColor.length > i) {loader.style.setProperty('--bcolor1', '#' + middleColor[i])i++window.requestAnimationFrame(changeColor)}
}
/* 十六进制 转 [128, 128, 128] */
function hexToRgb(hex) {var rgb = [];for (var i = 1; i < 7; i += 2) {rgb.push(parseInt("0x" + hex.slice(i, i + 2)));}return rgb;
}
/* [128, 128, 128] 转 十六进制 */
function rgbToHex(r, g, b) {var hex = ((r << 16) | (g << 8) | b).toString(16);return new Array(Math.abs(hex.length - 7)).join("0") + hex;
}
/* 计算两个颜色的差值,用于实现渐变 */
function gradient(startColor, endColor, step) {//将hex转换为rgbvar sColor = hexToRgb(startColor),eColor = hexToRgb(endColor);//计算R\G\B每一步的差值var rStep = (eColor[0] - sColor[0]) / step;gStep = (eColor[1] - sColor[1]) / step;bStep = (eColor[2] - sColor[2]) / step;var gradientColorArr = [];for (var i = 0; i < step; i++) {//计算每一步的hex值gradientColorArr.push(rgbToHex(parseInt(rStep * i + sColor[0]), parseInt(gStep * i + sColor[1]), parseInt(bStep * i + sColor[2])));}return gradientColorArr;
}

JavaScript计算渐变方法来源

思考

加载完成的渐变效果我思考了两种方法,可惜都碰了壁。
想法①:使用CSS动画修改颜色变量。
结果:CSS动画只能使用变量,不能修改变量。
想法②:【clip-path】样式,如果能反选抠图,就能下面那样使用CSS动画修改颜色。

.loader.tick {animation: coll .5s;
}
@keyframes coll {from {background: #f8094b;}to {background: #00ff2b;}
}

结果:【clip-path】样式没法反选抠图
这个效果我是优化的别人的方案。
B站:带进度动画的动画下载按钮
不知道还有没有优化的空间,希望大佬多多指教。(ΦωΦ)

优化 2024-06-14

使用Houdini自定义CSS样式优化

/* 自定义样式 */
@property --bcolor {syntax: '<color>';  /* 选填<color>、<angle> */initial-value: #00ff2b;inherits: false;
}
/* 修改颜色 */
.loader.tick {color: var(--bcolor);background: var(--bcolor);animation: coll .5s;
}
@keyframes coll {from {--bcolor: #f8094b;}to {--bcolor: #00ff2b;}
}
.tick .per {color: var(--bcolor);
}
.loader.tick::after {background: var(--bcolor);
}
http://www.xdnf.cn/news/815725.html

相关文章:

  • C#中ManualResetEvent的Reset,Set,WaitOne
  • 电脑锁屏密码怎么设置?3个步骤快速上锁,打造安全防线
  • AndroidO(8.0) 和 Android P(9.0)
  • Aptana使用入门一:Code Assist
  • element $alert实现字符串换行
  • 6个技巧 全方位解决Windows Defender无法启用问题
  • 盗版WINDOWS今天下载安装了windows genuine Advantage后系统提示让购买正版许可证我该...
  • 0402封装尺寸_PCB常用封装库命名规范及注意事项
  • 键盘HOOK解析
  • 世界著名反垃圾邮件组织的介绍
  • java3D 简介
  • 图解网络:36张图详解网络基础知识
  • HDMI接口基础知识与指南
  • 元心科技加入,龙蜥社区迎来国内领先的智能移动OS厂商
  • chmod命令详细用法
  • [计算机提升] 还原系统:Ghost备份
  • 软件优化理论基础以及方法论小结.
  • 读取QQ ClientKey失败分析
  • datetime与smalldatetime之间的区别小结
  • 为了下载文件不得不发布一篇文章,写一个winccadvance 使用vb脚本直接写入excel的方法
  • android机器人纪念品,MiniQ 桌面机器人底盘
  • 电子技术网站大全[转]
  • Wireshark 提示和技巧 | 显示过滤之 a 不等于 b
  • 网线水晶头接法和线序(图文详解)
  • Linux系统中UI库curse.h不存在问题——贪吃蛇为例
  • android studio 腾讯,android studio接入腾讯TBS
  • uni真机调试页面空白_模拟器最强BIOS篇,如何使用uni-bios
  • 分享134个ASP整站程序源码,总有一款适合您
  • C#开源系统大汇总
  • 学生成绩管理系统(java简单课设)