要使用conic-gradient制作环形统计图表,1. 首先创建一个正方形元素并设置border-radius: 50%使其变为圆形;2. 利用conic-gradient的色标(color stops)按百分比或角度定义每个数据段的起止范围,实现扇形分区;3. 通过累加百分比确保扇区连续,可结合css变量提升灵活性;4. 添加中心孔洞的方法包括:使用border属性形成实色孔洞、通过伪元素覆盖中心区域(推荐,灵活且兼容性好)、或使用mask-image配合radial-gradient实现透明孔洞;5. 动态数据可通过javascript计算各段百分比并更新css变量或直接设置background值;6. 可访问性方面需提供role="img"、aria-labelledby、aria-describedby等属性,并辅以隐藏的表格或文本描述数据内容,同时确保图例为可读文本。该方案实现了纯css驱动的环形图,兼具视觉效果与功能完整性。

conic-gradient
要用
conic-gradient
一个基础的环形图,比如一个饼图,通常需要一个正方形的容器,并将其
border-radius
background
立即学习“前端免费学习笔记(深入)”;
.pie-chart {
width: 200px;
height: 200px;
border-radius: 50%;
/* 假设数据:A占30%,B占50%,C占20% */
background: conic-gradient(
#ff6347 0% 30%, /* A: 从0%到30%(即0度到108度)是红色 */
#4682b4 30% 80%, /* B: 从30%到80%(即108度到288度)是蓝色 */
#3cb371 80% 100% /* C: 从80%到100%(即288度到360度)是绿色 */
);
}这里,
conic-gradient
#ff6347 30%
默认情况下,
conic-gradient
from <angle>
from 90deg
at <x> <y>
conic-gradient
精确控制扇区比例和颜色,是制作可信统计图的关键。我个人觉得,理解百分比和角度的换算,是玩转
conic-gradient
X% * 3.6deg
在
conic-gradient
/* 假设我们有以下数据:
- 产品A: 25%
- 产品B: 40%
- 产品C: 15%
- 产品D: 20%
*/
.data-chart {
width: 250px;
height: 250px;
border-radius: 50%;
/* 可以使用CSS变量来动态控制,更灵活 */
--pA: 25%;
--pB: 40%;
--pC: 15%;
--pD: 20%;
background: conic-gradient(
#a8e6cf 0% var(--pA), /* A: 从0%到25% */
#dcedc1 var(--pA) calc(var(--pA) + var(--pB)), /* B: 从25%到25%+40%=65% */
#ffd3b6 calc(var(--pA) + var(--pB)) calc(var(--pA) + var(--pB) + var(--pC)), /* C: 从65%到65%+15%=80% */
#ffaaa5 calc(var(--pA) + var(--pB) + var(--pC)) 100% /* D: 从80%到100% */
);
}这里我用了CSS自定义属性(变量),这在处理动态数据时尤其有用。通过JavaScript改变这些变量的值,图表就能立即更新,无需重新渲染整个DOM。注意看,每个扇区的起始点都是前一个扇区的结束点。这种累加的方式确保了扇区之间紧密连接,不会出现缝隙。
颜色选择上,除了常见的十六进制或RGB值,你也可以使用
hsl()
hsla()
conic-gradient
制作一个甜甜圈(donut)图,也就是在饼图中间挖个洞,有几种常见的CSS技巧。我个人比较喜欢用伪元素或
mask-image
border
利用border
border
border-color
conic-gradient
border
.donut-chart-border {
width: 200px;
height: 200px;
border-radius: 50%;
border: 40px solid #fff; /* 孔洞的颜色和大小 */
background: conic-gradient(#ff6347 0% 30%, #4682b4 30% 80%, #3cb371 80% 100%);
/* background-clip: padding-box; /* 确保渐变只在内容区域显示,但这里不加也行 */
}缺点是孔洞的颜色必须是实色,且不能是透明的,因为它是边框色。
利用伪元素(常用且灵活): 这是我比较推荐的方法。在饼图容器内部创建一个伪元素(
::before
::after
.donut-chart-pseudo {
position: relative; /* 为伪元素定位提供参考 */
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#ff6347 0% 30%, #4682b4 30% 80%, #3cb371 80% 100%);
}
.donut-chart-pseudo::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%); /* 居中 */
width: 100px; /* 孔洞大小 */
height: 100px; /* 孔洞大小 */
border-radius: 50%;
background-color: #fff; /* 孔洞的颜色 */
z-index: 1; /* 确保在渐变之上 */
}这种方法的好处是孔洞颜色可以独立控制,甚至可以是透明的(如果背景是其他元素)。
利用mask-image
mask-image
radial-gradient
.donut-chart-mask {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#ff6347 0% 30%, #4682b4 30% 80%, #3cb371 80% 100%);
/* 遮罩:中心透明,外部不透明 */
mask-image: radial-gradient(circle at center, transparent 0 30%, black 30% 100%);
-webkit-mask-image: radial-gradient(circle at center, transparent 0 30%, black 30% 100%); /* 兼容性 */
}这里的
transparent 0 30%
black 30% 100%
综合来看,伪元素的方法在灵活性和兼容性之间找到了一个很好的平衡点。
conic-gradient
用CSS制作的图表,最大的挑战之一就是如何处理动态数据和确保可访问性。毕竟,CSS只是负责渲染,数据逻辑和语义化需要额外处理。
动态数据处理:
对于动态数据,我通常会倾向于使用JavaScript来计算和更新CSS自定义属性。这样,我们就能在不直接操作样式表规则的情况下,灵活地改变图表的呈现。
数据计算: 假设你从后端获取了一组数据,比如
[{ label: '销售', value: 30 }, { label: '市场', value: 50 }, { label: '研发', value: 20 }]const data = [
{ label: '销售', value: 30, color: '#ff6347' },
{ label: '市场', value: 50, color: '#4682b4' },
{ label: '研发', value: 20, color: '#3cb371' }
];
const total = data.reduce((sum, item) => sum + item.value, 0);
let currentPercentage = 0;
const gradientSegments = data.map(item => {
const percentage = (item.value / total) * 100;
const start = currentPercentage;
const end = currentPercentage + percentage;
currentPercentage = end;
return `${item.color} ${start}% ${end}%`;
}).join(', ');
const chartElement = document.querySelector('.dynamic-chart');
chartElement.style.background = `conic-gradient(${gradientSegments})`;更新CSS自定义属性: 如果你的图表结构比较固定,只是数据比例变化,用CSS变量会更优雅。
// HTML: <div class="dynamic-chart" style="--p1:0; --p2:0; --p3:0;"></div>
// CSS: background: conic-gradient(var(--c1) 0% var(--p1), var(--c2) var(--p1) var(--p2), var(--c3) var(--p2) var(--p3));
const data = [ /* 同上 */ ];
const total = data.reduce((sum, item) => sum + item.value, 0);
let accumulatedPercentage = 0;
const chartElement = document.querySelector('.dynamic-chart');
let gradientString = '';
data.forEach((item, index) => {
const percentage = (item.value / total) * 100;
const start = accumulatedPercentage;
const end = accumulatedPercentage + percentage;
gradientString += `${item.color} ${start}% ${end}%${index < data.length - 1 ? ',' : ''}`;
accumulatedPercentage = end;
});
chartElement.style.background = `conic-gradient(${gradientString})`;这种方式避免了直接操作复杂的
conic-gradient
可访问性处理:
纯CSS的图表对屏幕阅读器来说是“不可见”的。它只是视觉上的呈现。为了确保所有用户都能理解图表传达的信息,可访问性是不可或缺的。
提供文本替代方案: 最基本也最重要的是,为图表提供清晰的文本描述或数据表格。屏幕阅读器用户可以通过这些文本内容来理解图表的含义和具体数据。
<div class="donut-chart" role="img" aria-labelledby="chart-title" aria-describedby="chart-data">
<!-- CSS conic-gradient 绘制的图表 -->
</div>
<h3 id="chart-title">2023年销售额构成</h3>
<table id="chart-data" style="clip: rect(1px, 1px, 1px, 1px); overflow: hidden; position: absolute; height: 1px; width: 1px;">
<caption>销售额数据详情</caption>
<thead>
<tr>
<th scope="col">类别</th>
<th scope="col">占比</th>
</tr>
</thead>
<tbody>
<tr>
<td>产品A</td>
<td>30%</td>
</tr>
<tr>
<td>产品B</td>
<td>50%</td>
</tr>
<tr>
<td>产品C</td>
<td>20%</td>
</tr>
</tbody>
</table>这里,我使用了
role="img"
aria-labelledby
aria-describedby
table
使用aria-label
aria-valuetext
aria-label
conic-gradient
图例和标签: 无论如何,图例(legend)是必不可少的。它将颜色与数据类别关联起来。这些图例本身应该是可访问的文本。
<div class="chart-container">
<div class="pie-chart"></div>
<ul class="chart-legend">
<li><span style="background-color: #ff6347;"></span> 产品A: 30%</li>
<li><span style="background-color: #4682b4;"></span> 产品B: 50%</li>
<li><span style="background-color: #3cb371;"></span> 产品C: 20%</li>
</ul>
</div>确保图例中的文本是实际可读的,而不是图片。
总的来说,
conic-gradient
以上就是CSS如何制作环形统计图表?conic-gradient渐变应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号