博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
圆环百分比三种实现方式汇总
阅读量:5749 次
发布时间:2019-06-18

本文共 4840 字,大约阅读时间需要 16 分钟。

前言

如下图所示,圆环百分比的效果在平常业务中还是有时候需要用到的(比如抢优惠券),借此总结一个几种实现圆环百分比的做法

实现方式

1. canvas实现

  • html部分代码
复制代码
  • js部分代码
// 1.canvas实现  circle()  function circle() {      var canvas = document.getElementById('circle');      var ctx = canvas.getContext("2d");      /*填充文字*/      ctx.font = "12px Microsoft YaHei";      /*文字颜色*/      ctx.fillStyle = '#FF4437';      /*文字内容*/      var insertContent = '已抢';      var text = ctx.measureText(insertContent);      /*插入文字,后面两个参数为文字的位置*/      /*此处注意:text.width获得文字的宽度,然后就能计算出文字居中需要的x值*/      ctx.fillText(insertContent, (132 - text.width) / 2, 68);      /*填充百分比*/      var ratioStr = percent + '%';      var text = ctx.measureText(ratioStr);      ctx.fillText(ratioStr, (132 - text.width) / 2, 85);      /*开始圆环*/      var circleObj = {          ctx: ctx,          /*圆心*/          x: 66,          y: 66,          /*半径*/          radius: 55,          /*环的宽度*/          lineWidth: 10      }      /*有色的圆环*/      /*从-90度的地方开始画*/      circleObj.startAngle = - Math.PI * 2 * 90 / 360;      /*从当前度数减去-90度*/      circleObj.endAngle = Math.PI * 2 * (percent / 100 - 0.25);      circleObj.color = '#FF4437';      drawCircle(circleObj);      /*灰色的圆环*/      /*开始的度数-从上一个结束的位置开始*/      circleObj.startAngle = circleObj.endAngle;      /*结束的度数*/      circleObj.endAngle = Math.PI * 2;      circleObj.color = '#ff453833';      drawCircle(circleObj);  }  /*画曲线*/  function drawCircle(circleObj) {      var ctx = circleObj.ctx;      ctx.beginPath();      ctx.arc(circleObj.x, circleObj.y, circleObj.radius, circleObj.startAngle, circleObj.endAngle, false);      //设定曲线粗细度      ctx.lineWidth = circleObj.lineWidth;      //给曲线着色      ctx.strokeStyle = circleObj.color;      //连接处样式      ctx.lineCap = 'round';      //给环着色      ctx.stroke();      ctx.closePath();  }复制代码

2.svg实现

  • HTML部分代码

已抢 45%

复制代码
  • css部分代码
.circle-wrapper {      display: inline-block;      position: relative;      width: 132px;      height: 132px;      margin-bottom: 8px;} .circle-wrapper .coupon-num {    width: 36px;    position: absolute;    top: 50%;    left: 50%;    margin-left: -18px;    color: #FF4437;    font-size: 12px;    margin-top: -15px;   }   .circle-full {    opacity: .2;   }   .circle-detail {    -webkit-transform-origin: 66px 66px;    transform-origin: 66px 66px;    -webkit-transform: rotate(-90deg);    transform: rotate(-90deg);    stroke: #FF4437;  }复制代码
  • js部分代码
//2.svg实现  var cricleEl = document.querySelector('.circle-detail')  var percentEl = document.querySelector('.percent')  var circleLength = Math.floor(2 * Math.PI * 55);  rotateCircle(cricleEl,percent)  percentEl.innerHTML =percent + '%'  function rotateCircle (el,percent) {    var val = parseFloat(percent).toFixed(0);    val = Math.max(0,val);    val = Math.min(100,val);    el.setAttribute("stroke-dasharray","" + circleLength * val / 100 + ",10000");  }复制代码

3.css-clip实现

  • html部分代码
复制代码
  • css部分代码
.box{      display: inline-block;      width: 132px;      height: 132px;      position: relative;      background-color: #ffdad7;      border-radius: 50%;  }  .num{      position: absolute;      top: 50%;      left: 50%;      background: #fff;      border-radius: 50%;      width: 112px;       height: 112px;      transform: translate(-50%, -50%);      text-align: center;      line-height: 112px;      font-size: 12px;  }  .clip{      width: 132px;      height: 132px;      position: absolute;      border: 10px solid #ffdad7;      border-radius: 50%;      clip: rect(0, 132px, 132px, 66px);  }  .left{      width: 132px;      height: 132px;      position: absolute;      border: 10px solid #FF4437;      border-radius: 50%;      clip: rect(0 66px 132px 0);      top: -10px;      left: -10px;  }  .right{      width: 132px;      height: 132px;      position: absolute;      border: 10px solid #FF4437;      border-radius: 50%;      clip: rect(0 132px 132px 66px);      top: -10px;      left: -10px;  }  .width-none{      width: 0;  }  .auto{      clip: auto;  }复制代码
  • js部分代码
// 3.css-clip实现方式  let clip = document.querySelector('.clip'),  left = document.querySelector('.left'),  right = document.querySelector('.right'),  num = document.querySelector('.num');//   let loop = setTimeout(() => {      if(percent >= 100){          percent = 0;          right.classList.add('width-none');          clip.classList.remove('auto');      } else if(percent > 50){          right.classList.remove('width-none');          clip.classList.add('auto');      }      // rotate++;      left.style.transform = 'rotate('+ 3.6*percent + 'deg)';      num.innerHTML = `${percent}%`  },100)  复制代码

小结

结合兼容性,代码简洁性,三种方式各有优势。结合兼容性,我青睐使用svg实现

不如自己动手试试

See the Pen by lumoumou () on .


REFERENCE

转载于:https://juejin.im/post/5cefdfcd6fb9a07ec56e5d4c

你可能感兴趣的文章
Linux使用Shell脚本实现ftp的自动上传下载(转)
查看>>
卷轴式游戏地图实现
查看>>
[IOI1999]花店橱窗布置(DP路径记录)
查看>>
oracle 导入数据
查看>>
js 闭包 原型
查看>>
首个5G智慧机场落地广州 速度是4G的50倍
查看>>
持续集成是什么
查看>>
JavaScript设计模式之面向对象编程
查看>>
Android 最简单的自定义Dialog之一
查看>>
磨刀不误砍柴 - 配置适合工作学习的桌面环境
查看>>
自己动手写docker-3
查看>>
Java笔记-反射机制(一)
查看>>
OpenCV在Android中的集成与简单使用
查看>>
redux v3.7.2源码解读与学习之 applyMiddleware
查看>>
【React】为什么我不再使用setState?
查看>>
Git原理与高级使用(3)
查看>>
你了解SEO中的时效性吗?
查看>>
从JDK源码看Writer
查看>>
[iOS]0 行代码集成 UILabel 字符串匹配
查看>>
Express 结合 Webpack 实现HMRwi
查看>>