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,250integrationRankString:  '1,2,3,4,5;0,100,150,200,250',// 经验豆数组1,2,3,4,5;50,100,150,200,250experienceBeanRankString: '',// 本月累计积分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,250integrationRankString:  '1,2,3,4,5;0,100,150,200,250',// 经验豆数组1,2,3,4,5;50,100,150,200,250experienceBeanRankString: '',// 本月累计积分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] * 2var 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"),               // 等级图片iconcourierRankName = $Id("courierRankName"),  // 配送员等级名称gradeAmount = $Id("grade-amount"),         // 可同时接单数monthScore = $Id("monthScore"),            // 本月累计积分scoreGrade = $Id("progree-nums"),          // 等级idprogressScore = $Id("progress-score"),     // 积分iddivisionBar = $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如下可以下载

转载于:https://www.cnblogs.com/tugenhua0707/p/4433502.html

h5实现手机端等级进度条相关推荐

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

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

  2. 大佬H5网页手机端怎么应用微信快捷登陆?

    现在碰到这样一个问题,我PC端微信快捷登录已经实现,是扫码授权登陆,但是我们网站有手机端访问地址,类似于京东手机访问版本,是H5的形式,不是 APP,现在登陆这块也想弄一个微信快捷登陆,目前我在微信开 ...

  3. android会员等级进度条,利用jQuery实现会员等级消费进度条代码

    特效描述:利用jQuery实现 会员等级 消费进度条代码.利用jQuery实现会员等级消费进度条代码 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 $(function(){ var ...

  4. 自定义View之王者荣耀等级进度条

    Demo效果 这里用王者荣耀的等级做了一个demo 实现思路 由进度条想到ProgressBar,继承自ProgressBar,可以在onDraw()中通过getProgress()和getMax() ...

  5. h5 /web 手机端 实现保存图片 到本地相册 uni-app

    文章目录 首先,必须得知道的事情是: uni-app中是有保存图片到本地相册的api的:但是h5并不适用 手机浏览器长按图片会出现保存图片的按钮直接进行保存图片,甚至在微信中还可以进行扫一扫 H5Pl ...

  6. 220多款H5的手机端小游戏源码下载 - html+javascript 开发网页小游戏开源源码大合集

    演示端:http://game.tutou.wang/  (手机访问) 需要做二次开发或者游戏开发的自行下载. 链接:https://pan.baidu.com/s/1kOOagUC1N6KnKBRK ...

  7. h5+实现手机端的录音,拍照,录像

    使用h5+即h5plus可以实现调用手机的功能实现语音的录制播放,图片上传下载,拍照,录像的功能,并提供上传下载的功能.开发工具使用hbuilder,该开发工具有模板和demo可以参考实现快速的开发a ...

  8. android会员等级进度条,jQuery会员等级进度条显示代码

    js代码 $(function(){ var geshu = $(".djwai").children(".dengji").length; // alert( ...

  9. h5页面手机端适配头

    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1, ...

最新文章

  1. 自定义requestAnimationFrame帧频
  2. System Center 2012 Process Automatic
  3. 计算机研发部门职责,计算机研发岗位职责
  4. Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))...
  5. python3的xpath_python3爬虫之xpath
  6. 拓端tecdat|R语言使用ARIMA模型预测股票收益时间序列
  7. 安装完成后打开CAXACAD时出现的找不到mfc100u.dll等无法执行的问题
  8. UVA1391/LA3713 Astronauts
  9. 用java编写台球小游戏项目
  10. Ubuntu20.04的一些功能设置记录(持续更新)
  11. 读取文件云服务器bcc,云服务器bcc如何用
  12. android 高性能框架,高性能架构
  13. ChromeBook安装GalliumOS:准备部分
  14. 微信H5、移动端自定义弹窗事件穿透、底层页面滑动解决方案
  15. Merriam-Webster's Vocabulary Builder 学习笔记 Unit 24
  16. 在虚拟机中使用摄像头
  17. 图像旋转中点的公式推导
  18. 阿里云ECS服务器华南2广东河源地域好不好/速度如何?
  19. CSS第三章:13.布局:如何进行网页的经典布局,使用何种标签?让块元素从左到右自然排列如何设置?
  20. Unity3D学习日记3

热门文章

  1. JBoss vs. Tomcat
  2. 2014Esri国际用户大会ArcGIS Online
  3. 使用JAVA数组实现顺序表
  4. Golang unsafe.Pointer指针
  5. k8s集群搭建教程(centos k8s搭建)
  6. Docker网络模型(八)
  7. java标签多行_利用Arcade表达式显示多行标签
  8. Windows CE 程序设计 (3rd 版)
  9. 阻止默认行为是配合passive使用
  10. “突破•重塑”2017年数据中心设施讨论