如何用CSS3来做环形图
最近做练习,有人问到了我这个问题:“圆环图怎么做?”;之前一直没写过,正好这次有机会自己写个demo试着看下。 用到的样式技术全是基于Css3,所以低端浏览器可以无视了。
首先说下思路:
- 采用边框及圆角实现环形
- 用变换角度来控制进度
- 用裁切及遮罩控制显示
那我们开始吧。
先写结构:
<div class="chart">
<div class="chart-progress"></div>
<div class="chart-text">
<strong>50</strong>
<span>%</span>
</div>
</div>
整体图我们放在一个chart容器内。progress我们主要做进度使用,text放文本。
CSS:
.chart {
width:100px;
height:100px;
float:left;
position:relative;
line-height:100px;
text-align:center;
margin:0 20px;
}
.chart::before {
content:"";
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
border:10px solid #ccc;
border-radius:50%;
z-index:1;
}
.chart::after {
content:"";
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
border:10px solid #999;
border-radius:50%;
clip:rect(0,auto,auto,50px);
z-index:2;
}
.chart .chart-progress {
position: absolute;
top:0;
right:0;
bottom:0;
left:0;
border:10px solid #999;
border-radius:50%;
clip:rect(0,auto,auto,50px);
z-index:3;
}
我们在chart内插入两个伪元素,一个做背景使用,就是浅色的圆环,一个做进度使用即深色背景。然后将深色背景裁切成半圆,那么 也就是50%进度的效果就出来了。这个是最容易的。
在这里将圆分成360,那么1%就是需要旋转3.6°,30%的话就是108°,然后通过设置变换旋转角度控制进度。
问题的关键在于判断是否大于50%,大于50的话,将progress的背景设为深色作为补足超出50%的进度。然后设置旋转角度,以(进度-50)* 3.6
为值。
如果小于的话,就需要将浅色背景增大来遮罩50%多余当前的进度。这里就需要把prosress的背景设置为浅色背景,然后设置旋转角度,以进度 * 3.6
为值。
下面是预览效果:
50
%
30
%
80
%