【H5】 svg画扇形饼图

2023-11-20

【H5】 svg画扇形饼图

效果图如下:

在这里插入图片描述

封装代码如下:

代码内有详细注解哦!

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {margin: 0;padding: 0;}
    #wrap {
      width: 300px;
      height: 300px;
      /* border:1px solid #000; */
      margin: 50px auto 0;
    }
  </style>
</head>

<body>
  <div id="wrap">
    <svg id='svg' xmlns="http://www.w3.org/2000/svg" width='100%' height='100%'>
    </svg>
  </div>

  <script>
    let svg = document.getElementById('svg');

    //creatTagEle是定义的一个生成path标签的方法
    //6.传值:tag为path标签  tagAttr:标签的样式属性(fill填充颜色,d线路样式)
    function creatTagEle(tag, tagAttr) {
      
      let svgNS = "http://www.w3.org/2000/svg";   //svg的规则
      //createElementNS()方法创建带有指定命名空间的元素节点
      //                  svgNS是规定svg的规则    tag为path标签
      let oTag = document.createElementNS(svgNS, tag)
      //for...in...遍历到里面的标签属性
      for (let attr in tagAttr) {
        //在path标签里设定样式:attr键 与 tagAttr[attr]键的值
        oTag.setAttribute(attr, tagAttr[attr])
      }
      return oTag;
    }
    //oTag就是一个path标签 <path fill="#24acf2" d="M270 150A120 120 0 0 1 224 243 L193 204 70 0 0 0 220 150"></path>

    //2.主执行方法  (扇形百分百数组,伞形颜色数组,运动时间ms)
    function move(num, color, time) {
      let nowTime = new Date(); //获取初始时间
      //外边的半径
      let outR = 120;
      //内边的半径
      let inneR = 70;
      //中心点( centerX,centerY )
      let centerX = 150;
      let centerY = 150;
      let n = 0;  //定时器计入执行的次数

      //下面的3→4→5→6→7一直循环执行 直到prop=1才结束
      let timer = setInterval(function () {
        let prop = (new Date() - nowTime) / time;  //  (当前时间-初始时间)/1000ms
        if (prop >= 1) {  //设置一秒钟后动画完成
          prop = 1
          clearInterval(timer)  //清除定时器 清除定时器后下面任然会执行一遍
        }
        //一共运动的角度
        let angleNum = 0;
        //动画的起始坐标,需要用数组来进行取值;
        let outXY = [{ x: 270, y: 150 }];
        let inneXY = [{ x: 220, y: 150 }];

        //3.计算外圆与内圆运动到的坐标;存储到 outXY 与 inneXY数组内
        for (let i = 0; i < num.length; i++) {
          //需要得出每一部分所占的比例值;
          let aNum = num[i] / 100 * 360;  //计算多少度
          angleNum += aNum; // 每一份加起来的最后总的结果 等于360
          if (i == num.length - 1) {angleNum = 360;}  //最后保证圆为360度
          //外圆的坐标   当prop等于1,每个扇形区块才能达到100%的显示 从而形成一个饼图
          let outX = Math.cos(angleNum * prop * Math.PI / 180) * outR + centerX;
          let outY = Math.sin(angleNum * prop * Math.PI / 180) * outR + centerY;
          outXY.push({ x: outX, y: outY })  //把每一个点都放到数组里边去;

          //内圆的坐标
          let inneX = Math.cos(angleNum * prop * Math.PI / 180) * inneR + centerX;
          let inneY = Math.sin(angleNum * prop * Math.PI / 180) * inneR + centerY;
          inneXY.push({ x: inneX, y: inneY })  //把每一个点都放到数组里边去;
        }
        // console.log(outXY);  由这里打印可以看出移动点(x,y)都是慢慢变"大", 所以每个扇形区面积都是慢慢变大的
        
        //4.画上去 通过每个扇形区运动的(x,y)点 填充对应区域的颜色
        for (let i = 0; i < outXY.length - 1; i++) {  //每一次for循环填充一个扇形区
          //5.生成path标签
          let oPath = creatTagEle('path', {
            fill: color[i],//渲染颜色值;
            //填充一个扇形区的外弧与内弧
            d: `M${outXY[i].x} ${outXY[i].y}A${outR} ${outR} 0 0 1 ${outXY[i + 1].x} ${outXY[i + 1].y}L${inneXY[i + 1].x} ${inneXY[i + 1].y}A${inneR} ${inneR} 0 0 0 ${inneXY[i].x} ${inneXY[i].y}`
          });
          //7.将创建的oPath标签添加到画布上
          svg.appendChild(oPath)  //一轮for完毕后填充了所有的扇形区 但每个扇形区面积并未达到100% 最后一次填充才为100%
        }

        //将前面绘画的path删除
        if(n++){
          for(let i=0; i<num.length; i++){
            console.log(1)
            svg.removeChild(svg.childNodes[1]) //删除
          }
        }

      }, 1000 / 60);  //一秒钟60帧为流畅
    }

    //1.程序入口 参数一为饼图每一部分的百分百  参数二为颜色 (两个数组长度必须对应相等) 参数3为动画执行的时间
    move(
      [15.5, 32.11, 22.22, 10, 13.14, 7.03],
      ["#24acf2", "#dd5044",  "yellow", "orange", "#a83d34","purple"],
      2000
    )

  </script>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【H5】 svg画扇形饼图 的相关文章

  • React - 能够通过 props 控制 SVG 的填充颜色

    我有一个 SVG 这里称为 example svg 它作为组件被调用和创建 如下所示 import ReactComponent as Example from example svg import styles from index mo
  • SVG feColorMatrix 在 safari 中不起作用

    我有一个相当简单的设置 我想通过使用 svg 过滤器来改变 svg 图像的颜色
  • 使用路径id获取SVG路径d属性

    我有单独的 json 包含 SVG 路径 Id 有没有办法使用路径 id 获取 SVG 路径 d 属性 或者有没有办法只使用路径 ID 来填充 SVG 路径 您可以通过调用 document getElementById 来获取路径元素 然
  • Jest/Enzyme SVG Sprites 意外令牌 <

    我在使用 SVG 精灵在组件上使用 Jest 和 Enzyme 创建快照测试时遇到问题 我正在使用 svg sprite loader 包 https github com kisenka svg sprite loader https g
  • 转换 SVG 过滤器

    我正在尝试创建一个像 SVG 圆圈上的阴影这样的材质设计 我希望当您单击圆圈时 这个阴影能够以良好的过渡来增长 但目前我正在努力弄清楚是否可以为这种过渡设置动画 所以我希望有人能够提供帮助 我添加了一个到目前为止所得到的小例子 一个带有阴影
  • 在 SVG 中设置悬停语句样式

    我正在计划一个基于这个 SVG 插图的网络 菜单 我的想法的原则 一个样式为活动的圆圈 一个样式为悬停的圆圈以及一个也需要设置样式的伴随笔画 https i stack imgur com H397o png 当我阅读 SVG 文件的规范时
  • 使用 inkscape 命令行将 svg 转换为 png 失败

    我觉得我一定做了一些愚蠢的错误 但我就是无法让它发挥作用 这是我从 cmd 运行的命令 inkscape com C path ship svg e export png C Path ship png without gui 作为回报 我
  • React - 在单个文件中导入多个 svgs

    我有多个 svg 文件 我想将所有这些文件导入和导出到一个文件中 icons js import IconVideoOn from assets img icons video on svg import IconVideoOff from
  • 悬停时的 SVG 过滤器标签

    我正在尝试通过此过滤器对 SVG 进行动画处理
  • 如何在 d3.js 中填充 svg 圆圈内的图像

    这是我在 svg 中填充圆圈的代码 var svgContainer d3 select body append svg attr width 1000 attr height 1000 var circles svgContainer s
  • 使用 classed("active",true) 鼠标悬停时 D3 颜色变化

    我是 js 和 D3 的新手 我已经生成了某种热图 并且想使用 D3 的 on mouseover 更改图块的颜色 我可以显式更改颜色 但想使用 CSS 活动规则 可能是一些简单的东西可以修复 任何帮助将不胜感激 完整代码如下 Thanks
  • 如何在 blaze-html 中渲染 blaze-svg 标记

    我想将使用 blaze svg 生成的 svg 图直接包含在使用 blaze html 生成的 html 中 两者都基于 blaze markup 所以我希望它很容易 diagram1 Svg diagram1 try1 Html try1
  • 动画 SVG 在页面加载之前不会显示动画

    我的网站包含大量广告 加载需要一段时间 确切地说 这并不是一个问题 但我注意到任何 SVG 动画都会立即绘制第一帧 但动画只有在页面上的所有加载完成后才会出现 SVG 动画通常指示旋转器 加载图标 有没有办法立即启动SVG动画 或者如果我将
  • Android和播放SVG动画

    我正在编写一个 Android 应用程序 我想播放一个简单的 SVG 动画 我知道 Android 不提供 SVG 支持 我在这里有什么选择 从 Android Lollipop API 级别 21 开始 可以使用动画矢量Drawable
  • 直接从 Javascript 代码访问 SVG 文件

    我有这个 HTML 代码 它调用我的 javascript 代码 该代码用于仪表 在 javascript 代码中 我尝试访问 SVG 文件 并修改 仪表的 指针以显示所需的值 该代码运行良好 但是 我不想在 HTML 中调用 对象 id
  • SVG 文本在 IE 中消失,直到我单击它

    我在 Internet Explorer Edge 以 Win7 上的为准 中遇到与 SVG 创建和操作相关的问题 在我正在开发的应用程序中 我们使用 d3 生成 SVG 形式的图形 在 Chrome 和 Firefox 中 它们工作得很好
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 有没有办法将 SVG 字符串渲染到 Web Worker 中的 OffscreenCanvas?

    我正在开发一个网页 对 SVG 字符串数据进行一些相当繁重的处理 因为这些字符串的大小可能达到 m bs 所以我想将 SVG 的渲染 取决于浏览器 移至工作人员 以避免阻塞 UI 我的问题是 worker 中无法访问 DOM 元素 有没有办

随机推荐