html - 使用 CSS 创建静态饼图

标签 html css charts

我正在尝试使用 css 和 html 创建饼图。我只会显示一些静态数字,因此我试图保持它相对简单并且不使用任何动画。
我目前在如何创建我想要的外观方面遇到了障碍。下面的代码片段完全按照我的意愿工作,问题在于 conic-gradient Firefox 和 Internet Explorer 不支持,这将是该元素的一个问题。

.progress-circle {
  --d: 50px;
  --color: #002F65;
  --progress: 40;
  border-radius: var(--d);
  height: var(--d);
  width: var(--d);
  background: conic-gradient( var(--color) calc(calc(var(--progress) / 100) * 360deg), transparent calc(calc(var(--progress) / 100) * 360deg));
}
<div class="progress-circle"></div>


我一直在寻找类似于上述示例的替代方法,这使我找到了这篇文章:designing simple pie charts with css
我的问题是计算饼图百分比增长的方法似乎与我想要完成的事情不兼容。因为它是由 transform: rotate(.1turn); 决定的
我的主要问题是可以制作 conic-gradient与其他浏览器兼容吗?如果不是,那么使用 css 制作饼图以与第一个示例非常相似的最佳方法是什么?
对于上下文,我将从数组中传递数据以确定饼图的百分比。

.pie {
  width: 100px; height: 100px;
  border-radius: 50%;
  background: yellowgreen;
  background-image:
  linear-gradient(to right, transparent 50%, #655 0);
}

.pie::before {
  content: "";
  display: block;
  margin-left: 50%;
  height: 100%;
  border-radius: 0 100% 100% 0 / 50%;
  background: #655;
  transform-origin: left;
  transform: rotate(.1turn);
}
<div class="pie"></div>

最佳答案

这是一个基于 this previous answer 的想法

.box {
  /* percentage to degree
    --s:0 for [0% 50%]
    --s:1 for [50% 100%]
   */
  --v:calc( ((18/5) * var(--p) - 90)*1deg);

  width:100px;
  height:100px;
  display:inline-block;
  border-radius:50%;
  background:
    linear-gradient(var(--v), yellowgreen 50%,transparent 0) 0 /calc((1 - var(--s))*100%),
    linear-gradient(var(--v), transparent 50%,#655        0) 0 /calc(var(--s)*100%),
    linear-gradient(to right, yellowgreen 50%,#655 0);
}
<div class="box" style="--p:5;--s:0"></div>
<div class="box" style="--p:20;--s:0"></div>
<div class="box" style="--p:50;--s:0"></div>
<div class="box" style="--p:70;--s:1"></div>
<div class="box" style="--p:95;--s:1"></div>

我们可以使用 min() 优化代码并保持只使用一个变量但需要注意支持:https://caniuse.com/#feat=css-math-functions

.box {
  /* percentage to degree  */
  --v:calc( ((18/5) * var(--p) - 90)*1deg);

  width:100px;
  height:100px;
  display:inline-block;
  border-radius:50%;
  background:
    linear-gradient(var(--v), yellowgreen 50%,transparent 0) 0 /min(100%,(50 - var(--p))*100%),
    linear-gradient(var(--v), transparent 50%,#655        0) 0 /min(100%,(var(--p) - 50)*100%),
    linear-gradient(to right, yellowgreen 50%,#655 0);
}
<div class="box" style="--p:5;"></div>
<div class="box" style="--p:20;"></div>
<div class="box" style="--p:50;"></div>
<div class="box" style="--p:70;"></div>
<div class="box" style="--p:95;"></div>

使用具有更多支持的伪元素的另一个想法:

.box {
  /* percentage to degree  */
  --v: calc( ((18/5) * var(--p) - 180)*1deg);
  
  width: 100px;
  display: inline-flex;
  border-radius: 50%;
  overflow: hidden;
  background: linear-gradient(to right, yellowgreen 50%, #655 0);
}

.box::before,
.box::after {
  content: "";
  width: 50%;
  padding-top:100%;
  transform: rotate(var(--v));
}

.box::before {
  background: 
    linear-gradient(yellowgreen 0 0) 
    0 / calc((50 - var(--p))*1%);
  transform-origin: right;
}

.box::after {
  background: 
    linear-gradient(#655 0 0)       
    0 / calc((var(--p) - 50)*1%);
  transform-origin: left;
}
<div class="box" style="--p:5;"></div>
<div class="box" style="--p:20;width:150px;"></div>
<div class="box" style="--p:50;width:120px;"></div>
<div class="box" style="--p:70;"></div>
<div class="box" style="--p:95;width:80px;"></div>

CSS pie chart

关于html - 使用 CSS 创建静态饼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62924550/

相关文章:

javascript - 如何根据标签内部HTML选择表单输入?

html - 用图像替换按钮

javascript - 滚动到底部并返回后页面底部出现空白(移动)

javascript - 将点添加到 D3 图表

reactjs - 在 ReactJS 中的图表内添加数据标签不起作用?

jquery - 如果 JQuery 在属性中找到正斜杠 "/>",为什么 JQuery 会关闭该元素?

javascript - 没有提交表单的bootstrap html点击按钮

javascript - 由于更改页面宽度,指向 anchor 的链接移动到错误的位置

css - 如何居中定位?

excel - 如何使用 AddOLEObject 将 Excel 图表插入 Word