h5实现等级进度条

需求如下: 实现一个动画进度条,页面一打开实现一个进度条动画,因为App这个页面会经常改,所以没有使用原审Android或者IOS来实现,希望通过H5来做;

服务器端返回如下数据:

var Config = {
// 等级大图片url地址
courierRankBigUrl: 'images/grade2-icon.png', // 配送员等级名称
courierRankName: '3级鲜锋官', // 同时可接单数
courierCanPackgeCountDoing: '10', // 积分数组1,2,3,4,5;50,100,150,200,250
integrationRankString: '1,2,3,4,5;0,100,150,200,250', // 经验豆数组1,2,3,4,5;50,100,150,200,250
experienceBeanRankString: '', // 本月累计积分
monthCompletedWaybills: '150'
};

需要我们前端把各个数据渲染出来及 实现进度条效果;

实现进度条基本原理如下:

因为页面分了5个等级,所以为了兼容各个手机端浏览器,因此把进度条总宽度设置为100%;那么每段就是20%的宽度了。

假如第一段50分 第二段100分 第三段300分 第四段500分,第五段积分就是第四段的2倍;那么假如服务器返回的是375分,那么在浏览器下占比如下
由于页面分了5段,每段显示20%的宽度; 遍历数组[50,100,300,500],定义一个遍历count = 0;
如果数组任何一段小于服务器返回375的话,那么count自加1,因此count=3
因此算法比例如下:(375 - 300) / (500 - 300) + 3 = 3/8 + 3 = 3.375; 最后 3.375 / 5 * 100%= 67.5%;
 记住 因为数组arrs去掉了第一项了 所以curNum要减去1 即:curNum - 1;

JS实现代码如下

/*
* @todo 计算进度条的百分比
* @param {score,arrs} 服务器返回的总分 服务器返回的数组
*/
var count = 0;
function percent(score,arrs) {
var tempCount = 0;
var percent;
// 如果积分大于数组最后一个总积分的话, 那么进度条就是最大的
if(score*1 > arrs[arrs.length -1] * 1) {
score = arrs[arrs.length -1];
}
for(var i = 0; i < arrs.length; i+=1) {
if(score*1 > arrs[i]*1) {
tempCount++;
}
}
count = tempCount;
if(tempCount*1 < 1) {
percent = (score / arrs[0]) / 5 * 100;
}else {
percent = ((score - arrs[tempCount - 1]) / (arrs[tempCount] - arrs[tempCount - 1]) + tempCount) / 5 * 100;
} return percent + "%";
}

实现动画效果还是使用CSS3哦!

JS实现进度条代码如下:

<script>
/* 服务器返回的数据如下 */
var Config = {
// 等级大图片url地址
courierRankBigUrl: 'images/grade2-icon.png', // 配送员等级名称
courierRankName: '3级鲜锋官', // 同时可接单数
courierCanPackgeCountDoing: '10', // 积分数组1,2,3,4,5;50,100,150,200,250
integrationRankString: '1,2,3,4,5;0,100,150,200,250', // 经验豆数组1,2,3,4,5;50,100,150,200,250
experienceBeanRankString: '', // 本月累计积分
monthCompletedWaybills: '150'
};
</script>
/* 切记:实现进度条的JS代码一定要放在头部,如果放在尾部的话,在手机端浏览器下是没有进度条的动画效果的,因为页面先加载完后,就已经设置了宽度 */
<script>
function setStyle(obj,css){
for(var i in css){
obj.style[i] = css[i];
}
}
var scores = Config.integrationRankString.split(";")[1].split(',');
// 后台返回的积分
var score = Config.monthCompletedWaybills;
/*
* 进度条的宽度百分比的计算方式设计如下:
* 假如第一段50分 第二段100分 第三段300分 第四段500分 那么假如服务器返回的是375分,那么在浏览器下占比如下
* 由于页面分了5段,每段显示20%的宽度; 遍历数组[50,100,300,500],定义一个遍历count = 0;
* 如果数组任何一段小于服务器返回375的话,那么count自加1,因此count=3
* 比例如下:(375 - 300) / (500 - 300) + 3 = 3/8 + 3 = 3.375; 最后 3.375 / 5 * 100%= 67.5%;
* 记住 因为数组arrs去掉了第一项了 所以curNum要减去1 即:curNum - 1
*/
/*
* @todo 计算进度条的百分比
* @param {score,arrs} 服务器返回的总分 服务器返回的数组
*/
var count = 0;
function percent(score,arrs) {
var tempCount = 0;
var percent;
// 如果积分大于数组最后一个总积分的话, 那么进度条就是最大的
if(score*1 > arrs[arrs.length -1] * 1) {
score = arrs[arrs.length -1];
}
for(var i = 0; i < arrs.length; i+=1) {
if(score*1 > arrs[i]*1) {
tempCount++;
}
}
count = tempCount;
if(tempCount*1 < 1) {
percent = (score / arrs[0]) / 5 * 100;
}else {
percent = ((score - arrs[tempCount - 1]) / (arrs[tempCount] - arrs[tempCount - 1]) + tempCount) / 5 * 100;
} return percent + "%";
}
if(scores[0] == 0) {
scores.shift();
}
// 返回第五段的值 计算方法 val fiveVal = arrs[arrs.length - 1] * 2
var fiveVal = scores[scores.length - 1] * 2 + "";
scores.push(fiveVal); var width = percent(score,scores); var dynamic = document.getElementById("dynamic");
dynamic.innerHTML = '@-webkit-keyframes load {0% {width: 0%;}100% {width: '+width+';}}'; window.onload = function(){
var bar = document.getElementById("progress-bar");
setStyle(bar,{width:width});
}
</script>

其他实现页面的JS如下:

<script>
function $Id(id){
return document.getElementById(id);
};
function hasClass(obj, cls) {
return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
} function addClass(obj, cls) {
if (!hasClass(obj, cls)) obj.className += " " + cls;
}
var bar = $Id("progress-bar"), // 进度条id
gradeImg = $Id("grade-img"), // 等级图片icon
courierRankName = $Id("courierRankName"), // 配送员等级名称
gradeAmount = $Id("grade-amount"), // 可同时接单数
monthScore = $Id("monthScore"), // 本月累计积分
scoreGrade = $Id("progree-nums"), // 等级id
progressScore = $Id("progress-score"), // 积分id
divisionBar = $Id("division-bar"); // 进度条分隔条 // 服务器返回的等级图片
gradeImg.style.backgroundImage="url("+Config.courierRankBigUrl+")"; // 服务器返回的等级名称
courierRankName.innerHTML = Config.courierRankName; // 可同时接单数
gradeAmount.innerHTML = Config.courierCanPackgeCountDoing; // 本月累计积分
monthScore.innerHTML = "(" + Config.monthCompletedWaybills + "分" + ")";
if(Config.monthCompletedWaybills *1 < 0) {
var minMonthScore = $Id("minMonthScore");
if(!hasClass(minMonthScore,'current')) {
addClass(minMonthScore,'current');
}
}
// 服务器返回的等级和积分数组
var grades = Config.integrationRankString.split(";")[0].split(','),
scores = Config.integrationRankString.split(";")[1].split(','),
gradesHTML = '';
scoresHTML = '';
for(var i = 0; i < grades.length; i++) {
gradesHTML += '<span>'+grades[i]+'级</span>';
}
scoreGrade.innerHTML = gradesHTML;
for(var j = 0; j < scores.length; j++) {
if(j == 0) {
scoresHTML += '<i>'+scores[j]+'</i>';
}else {
scoresHTML += '<span>'+scores[j]+'分</span>';
}
}
progressScore.innerHTML = scoresHTML;
var divisionBarSpans = divisionBar.getElementsByTagName("span");
// 后台返回的积分
var score2 = Config.monthCompletedWaybills; var curIndex = scores.indexOf(score2);
if(count*1 > 0) {
for(var i = 0; i < count; i++) {
if(!hasClass(divisionBarSpans[i],'current')) {
// 比如返回积分是200 正好数组也有200这个积分 正好相等的话 ,那么就不添加current类名
if(i !== curIndex) {
(function(i){
setTimeout(function(){
addClass(divisionBarSpans[i],'current');
},2500);
})(i)
}
}
}
}
</script>

demo如下可以下载

h5实现手机端等级进度条的更多相关文章

  1. H5 可堆叠的圆环进度条,支持任意数量子进度条

    by Conmajia SN: S22-W1M 由来 看到一篇帖子<vue实用组件--圆环百分比进度条>,让我想起了很多年前我在WinForm下仿制过的Chrome进度条. ▲ 原版进度条 ...

  2. 给H5页面添加百分比的进度条,精确度高

    进度条样式地址:http://sandbox.runjs.cn/show/6vxbxjrf SVG圆环样式地址:http://sandbox.runjs.cn/show/3ho1qpe9 原理:由于H ...

  3. H5页面手机端禁止缩放的正确方式

    H5页面禁止手机端缩放是个常见问题了 首先说meta方式 <meta content="width=device-width, initial-scale=1.0, maximum-s ...

  4. H5+Ajax+WebApi实现文件下载(进度条,多文件)

    前言 踩过的坑 1.WebAPI跨域 2.Jquery ajax低版本不支持XHR 2功能 3.Jquery ajax不支持Deferred的process事件 4.IE下文件名乱码问题 功能实现 & ...

  5. js---手机端滑动进度条

    最近做项目,有一个滑动音乐播放进度条的效果,但是使用input的 range 来做会出现一些问题,想了想还是用JS来写.直接上代码: <!doctype html> <html la ...

  6. H5上传图片,并且显示进度条

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 移动端适配,h5网页,手机端适配兼容方案.可以显示真实的1px边框和12px字体大小,dpr浅析

    以前写移动端都是用这段JS解决. (function (doc, win) { // 分辨率Resolution适配 var docEl = doc.documentElement, resizeEv ...

  8. vue H5页面手机端 利用canvas 签名

    签名首先用一个canvas标签,上面加三个代码,分别是点击,移动,离开.这里点击是开始画笔的地方,如果不加@touchstart 笔头会发生偏移,可以试试. @toucheend也是如此.尾巴也会出现 ...

  9. 【极品代码】一般人我不告诉他,手机端h5播放时不自动全屏代码

    已测适用于ios,某些安卓手机微信下播放视频会出现播放器控件(这个实在是无力吐槽噢,因为之前还遇到过微信播放完视频后竟然无法退出全屏出现广告的情况,只有播放完后刷新页面并且要放到框架页里才能屏蔽微信视 ...

随机推荐

  1. .net防止SQL注入的一种方式

    首先也要明白一点,什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将 ...

  2. Mybatis中的缓存

    Mybatis提供缓存查询功能,用于减轻数据库压力,提升数据查询能力. Mybatis中定义了两级缓存:包括一级缓存与二级缓存.示意图如下所示: 一.一级缓存 一级缓存的特点: 每一个SqlSessi ...

  3. php扩展php-redis安装与使用

    一.redis的安装 1,安装redis版本 下载页面:https://redis.io/download 安装一个老版本3.2.11:http://download.redis.io/release ...

  4. js-jQuery性能优化(二)

    5.数组方式使用jQuery对象 使用jQuery选择器获取结果是一个jQuery对象.然而,jQuery类库会让你感觉正在使用一个定义了索引和长度的数组.在性能方面,建议使用简单的for或者whil ...

  5. SD从零开始21-24

    [原创]SD从零开始21 输出(Output) 销售的输出类型Output types in SD Output是用于和商业伙伴及系统交换信息的通信方式:你可以为不同的销售凭证如报价单,订单,交货单, ...

  6. 自定义适用于手机和平板电脑的 Dynamics 365(三):显示的实体

    您可以启用 适用于手机的 Dynamics 365 和 适用于平板电脑的 Dynamics 365 的有限实体集. 若要查看是否启用了实体,或者要启用实体,请单击“设置”>“自定义”>“自 ...

  7. hadoop重启后,hdfs目录权限问题

    今天重启了下Hadoop集群,使用Eclipse调试hdfs api的时候报错: [WARNING] java.lang.NullPointerException at org.conan.kafka ...

  8. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  9. AsyncTask GET请求

    布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  10. 绝对良心提供百度网盘的jdk1.8源码下载包含sun包的

    但是openjdk网站有提供的: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/6bfaecb8ff77/src/share/classes/ 或者直 ...