一个div+CSS实现环形图

效果图

仅适合统计两个数据源,多个数据源或者复杂效果请使用ECharts

实现原理

利用CSS锥形渐变conic-gradient,以下是该属性兼容性

代码(Vue)

<template>
  <!-- data-xxx可实现CSS attr(data-xxx)获取值 -->
  <div
    class="circular"
    :style="style"
    :data-percent="percent"
  ></div>
</template>

<script>
export default {
  components: {},
  data () {
    return {
      // 进度
      percent: '30%',
      // 底色
      chartColor: '#E6A23C',
      // 进度色
      chartProgressColor: '#F56C6C',
      // 进度宽度
      progressWidth: '50px'
    }
  },
  computed: {
    style () {
      return {
        '--percent': this.percent,
        '--chartColor': this.chartColor,
        '--chartProgressColor': this.chartProgressColor,
        '--progressWidth': this.progressWidth
      }
    }
  }
}
</script>

<style lang='scss' scoped>
.circular {
  border-radius: 50%;
  width: 200px;
  height: 200px;
  position: relative;
  // 实现饼状图
  background-image: conic-gradient(
    var(--chartProgressColor) var(--percent),
    var(--chartColor) var(--percent)
  );
  // background: conic-gradient(deeppink 0 30%, yellowgreen 0 70%, red 0 80%, teal 0 100%);
  // 实现环形图
  &::after {
    // 获取template中声明的变量
    content: attr(data-percent);
    background: #fff;
    width: calc(200px - var(--progressWidth));
    height: calc(200px - var(--progressWidth));
    border-radius: 50%;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    position: absolute;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    font-size: 30px;
    color: #333;
  }
}
</style>
### 如何使用 CSS 创建环形 #### 使用 `conic-gradient` 构建基础环形结构 为了构建一个简单的环形表,可以利用 `conic-gradient` 函数来定义颜色过渡的角度范围。此函数允许创建基于角度的颜色渐变效果,非常适合用来制作圆形或扇形区域。 ```css .circle { width: 100px; height: 100px; border-radius: 50%; background: conic-gradient( red 0%, red 70%, /* 红色部分占据70% */ blue 70%, /* 蓝色从70%处开始 */ blue 100% ); } ``` 上述代码片段展示了如何设置不同比例的两种颜色填充整个圆周[^2]。 #### 添加 HTML 结构支持 为了让样式生效并能动态调整数值,通常会结合一些基本的HTML标签作为容器: ```html <div class="circle-container"> <div class="circle"></div> </div> ``` 这里 `.circle-container` 可以为后续可能加入的文字说明或其他装饰元素提供布局空间;而`.circle`则是实际显示表的部分。 #### 进一步优化与交互功能 如果希望增加更多视觉上的吸引力或是实现更复杂的业务逻辑(比如实时更新数据),还可以考虑引入JavaScript脚本去操作DOM节点属性值,改变CSS变量从而影响到具体的渲染结果。不过对于仅需静态展示的情况来说,以上方法已经足够满足需求了。 #### 完整示例代码 下面给出一段完整的HTML+CSS代码,它能够呈现出一个带有简单动画效果的环形进度条: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Circular Progress Bar Example</title> <style> .progress-circle { --percentage: 70; /* 设置初始完成度 */ position: relative; width: 150px; height: 150px; margin: auto; border-radius: 50%; box-shadow: inset 0px 0px 0px 4px #ddd; display: flex; justify-content: center; align-items: center; font-size: 2rem; color: darkslategray; } .progress-circle::before { content: ''; position: absolute; top: 10px; left: 10px; right: 10px; bottom: 10px; background-color: white; border-radius: inherit; } .progress-circle span { z-index: 2; } .track { stroke-dasharray: calc(3.14 * var(--radius) * 2); stroke-dashoffset: calc((1 - (var(--percentage, 0) / 100)) * 3.14 * var(--radius) * 2); transition: all ease-in-out 0.6s; } </style> </head> <body> <!-- 圆形进度条 --> <svg viewBox="-1 -1 2 2" style="width: 150px;"> <defs> <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="0%"> <stop offset="0%" style="stop-color:red;" /> <stop offset="100%" style="stop-color:blue;" /> </linearGradient> </defs> <circle cx="0" cy="0" r=".9" fill="none" stroke-width=".1" stroke-linecap="round" stroke="url(#grad)" class="track"/> </svg> <script> document.querySelector('.track').setAttribute('stroke', 'red'); const circle = document.querySelector(".track"); let radius = circle.r.baseVal.value; circle.setAttribute("transform", `rotate(-90)`); // 将起始位置旋转至顶部 circle.style.setProperty('--radius', `${radius}`); function updateProgress(value){ circle.style.setProperty('--percentage', value); } window.onload = () => {updateProgress(Math.random() * 100)}; </script> <p>随机生成了一个介于0%-100%之间的进度。</p> </body> </html> ``` 这段代码不仅实现环形的基础外观,还加入了SVG路径以及JavaScript来模拟动态变化的效果。注意这里的百分比是通过修改自定义属性`--percentage`间接控制的,这使得我们可以很容易地根据实际情况更改显示的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值