首页 > 其他分享 >环形表示进度 css+js+svg

环形表示进度 css+js+svg

时间:2024-07-30 20:55:09浏览次数:8  
标签:angle svg percent js let css parseInt return Math

先看看我做出来的效果

人狠话不多 直接上代码
html部分

<div id="box"></div>

css部分

  #box{
        width: 400px;
        height: 400px;
        background-color: #00E8D7;
        display: flex;
  }

  .circleBox{
    width: 33.333%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
  }
  .circleContent{
    height: 58px;
    position: relative;
    width: 58px;
  }
  .circleContent + div{
    font-size: 14px;
    color: #333333;
    font-weight: 600;
    margin-top: 10px;
  }
  .smallCircle{
    font-size: 17px;
    color: #333333;
    font-weight: 600;
    text-align: center;
    width: 50px;
    height: 50px;
    line-height: 50px;
    background-color: #ffffff;
    position: absolute;
    top: 4px;
    left: 4px;
    border-radius: 50%;
    z-index: 3;
  }
  .bigCircle{
    width: 58px;
    height: 58px;
    background-color: #dbdbdb;
    position: absolute;
    border-radius: 50%;
    z-index: 1;
  }

js部分

getLatePercentageNewByJsCss(['40%','70%','0%','100%'],'#2C67E2',58,58,29)
  function getLatePercentageNewByJsCss(percentage,color,width,height,r) {
    let len = percentage.length
    let appendDom = document.getElementById('box')
    appendDom.innerHTML = ''
    let domList = []
    for (let i = 0; i < len; i++) {
        domList.push('<div class="circleBox">')
        domList.push('<div class="circleContent">')
        domList.push('<div class="bigCircle"></div>')
        domList.push(generatePieSvg(width,height,r,color,percentage[i]))
        domList.push('<div class="smallCircle">'+percentage[i]+'</div>')
        domList.push('</div>')
        domList.push('</div>')
    }
    appendDom.innerHTML = domList.join('')
}
   //画svg的方法
  function generatePieSvg(width,height,R, color,percent){
    if(percent == '0%') return '';//0%
    if(percent == '100%'){//100%
      return `<svg width="${width}" height="${height}" style="position: absolute;z-index: 2">
            <circle cx="${R}" cy="${R}" r="${R}" stroke="${color}" stroke-width="1" fill="${color}" />
        </svg>`
    }
    //0% - 100% 扇形用svg来画
    let svg = ''
    svg += '<svg style="position: absolute;z-index: 2" width=' + width + ' height=' +height+ '  viewBox="0 0 '+ width  + " " + height + '"' +'>'
    let M = 'M '+ R +',' + R + ' '
    let L = 'L ' + R + ',' + 0  + ' '
    let Astart = 'A ' + R + ' ' + R + ' '+ 0 + ' '+ (parseInt(percent) >= 50 ? 1:0) + ' '+ 1 + ' ';//x-axis-rotation large-arc-flag sweep-flag
    // large-arc-flag 大于180时 为1  表示大圆环   sweep-flag 1 顺时针 0 逆时针
    let x = caculateX(R,percent)
    let y = caculateY(R,percent)
    let Aend = x  + ',' + y  + ' '
    let Z = 'Z'
    svg +='<path d="' + M + L + Astart + Aend + Z + '"' + ' fill=' + color +'>'+'</path>'
    svg +='</svg>'
    return svg
  }

  function caculateX(r,percent){
    if(parseInt(percent) >= 75){
      let angle = 360 - parseInt(percent) * 360 / 100
      return r - r * Math.sin(angle * Math.PI / 180)
    }else if(parseInt(percent) >= 50){
      let angle = 270 - parseInt(percent) * 360 / 100
      return r - r * Math.cos(angle * Math.PI / 180)
    }else if(parseInt(percent) >= 25){
      let angle = 180 - parseInt(percent) * 360 / 100
      return r + r * Math.sin(angle * Math.PI / 180)
    }else{
      let angle = 90 - parseInt(percent) * 360 / 100
      return r + r * Math.cos(angle * Math.PI / 180)
    }
  }
  function caculateY(r,percent){
    if(parseInt(percent) >= 75){
      let angle = 360 - parseInt(percent) * 360 / 100
      return r - r * Math.cos(angle * Math.PI / 180)
    }else if(parseInt(percent) >= 50){
      let angle = 270 - parseInt(percent) * 360 / 100
      return r + r * Math.sin(angle * Math.PI / 180)
    }else if(parseInt(percent) >= 25){
      let angle = 180 - parseInt(percent) * 360 / 100
      return r + r * Math.cos(angle * Math.PI / 180)
    }else{
      let angle = 90 - parseInt(percent) * 360 / 100
      return r * Math.sin(angle * Math.PI / 180)
    }
  }

标签:angle,svg,percent,js,let,css,parseInt,return,Math
From: https://www.cnblogs.com/ly5926/p/18333337

相关文章

  • golang面试题:json包变量不加tag会怎么样?
    问题json包里使用的时候,结构体里的变量不加tag能不能正常转成json里的字段?怎么答如果变量首字母小写,则为private。无论如何不能转,因为取不到反射信息。如果变量首字母大写,则为public。不加tag,可以正常转为json里的字段,json内字段名跟结构体内字段原名一致。加了tag,从str......
  • html+css 实现3D分层悬停按钮
    前言:哈喽,大家好,今天给大家分享html+css绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 实现基于Vue.js的前后端分离在淘客返利系统中的实践
    实现基于Vue.js的前后端分离在淘客返利系统中的实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨在淘客返利系统中如何实现基于Vue.js的前后端分离。这种架构能够提高开发效率、增强系统的可维护性和扩展性。下面我们将详细介绍实......
  • 在 html 上添加 json 数据(数据包含多种特殊字符),使用 JSON.stringify 读取 error
    letjsonObj=[{ "Name":"test" "Attach":"www!@#$%^&*(){}|:\"<>?,./;'[]\\"}]lethtml=jsonObj.map((i,v)=>{ letjsonStr=JSON.stringify(jsonObj) return`<trdata='${json......
  • js逆向之补环境-proxy
    目录【1】补环境介绍【2】proxy代理监控器【1】补环境介绍浏览器环境:是指JS代码在浏览器中的运行时环境,它包括V8自动构建的对象(即ECMAScript的内容,如Date、Array),浏览器(内置)传递给V8的操作DOM和BOM的对象(如document、navigator);Node环境:是基于V8引擎的Js运行时环境,它包括V8与......
  • 将字符串转换为json格式
    我有一个Excel电子表格,当我直接在python中读取它时,它失败了。所以我先在PowerQuery中读,然后在python中读,但是在PowerQuery中读时丢失了json双引号。我尝试了demjson3,但无法成功。我尝试用Python逐行阅读,这不是一个好主意。我希望能够在python中将其呈现为json。......
  • 超级好用的JSON可视化工具
    理想的在线JSON工具,应该支持快速格式化、可压缩、快捷复制、可下载导出,对存在语法错误的地方能明确显示。提供搜索定位功能,可视区足够大,最好支持全屏。经过多方面对比,以下工具能满足这个需求: 工具地址直达:在线JSON可视化工具工具支持全屏模式操作,通过搜索框可以快速进行查找,双......
  • 招募[星巴克项目]- Node.js开发
    职位职责:负责公司Node.js和TypeScript技术栈相关项目的开发和维护工作。参与系统架构设计,编写高性能、高可用的Node.js应用程序。优化并提升现有系统的性能和可靠性。制定有效的监控方案,及时响应和解决线上问题。持续跟进新技术动向,积极学习和实践新技术。职位要求:1......
  • vue-cli使用postcss-plugin-px2rem,自动px转rem
    const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({transpileDependencies:true,productionSourceMap:false,css:{loaderOptions:{postcss:{postcssOptions:{plugins:[......
  • 使用 json 列规范化 Dataframe
    您好,我正在寻找一种有效的方法来标准化包含json数据列的数据框。我从保存为数据帧的网站获取json响应。结构如下所示在此处输入图像描述我有3个标准列,第4列包含我想要规范化的json数据,并创建使用前3列中的值复制每行的行以及拆分的行第四列。如下......