1. 前言
作为Web开发者,在日常开发中经常会需要用到图表,如饼状图、柱形图、折线图等等。在市面上有很多图表库可供选择,但其中大多数都依赖于JavaScript实现,如果我们的项目不需要一些复杂的交互操作,那是否有一种更简单的方法实现呢?答案是肯定的,那就是使用纯CSS实现。
2. 实现思路
实现饼状图的主要思路是通过CSS的圆形、半圆形等形状实现一个可分割的圆,并给每个分割块设置不同的颜色,从而实现饼状图效果。为了实现这个效果,我们需要掌握以下几个技术点:
盒模型
盒子的定位
盒子的旋转
CSS3动画
3. HTML结构
首先我们需要先确定饼状图的结构,我们考虑使用无序列表(ul)实现:
<ul class="pie">
<li class="slice1"></li>
<li class="slice2"></li>
<li class="slice3"></li>
<li class="slice4"></li>
<li class="slice5"></li>
</ul>
我们通过li元素来表示饼状图的每个分割块,并且通过classList属性设置每个分割块的类名(class),用以设置不同的颜色和旋转度数。
4. CSS样式
4.1 盒模型与盒子的定位
首先我们需要设置每个分割块的大小和位置,这里我们需要使用CSS的盒模型来实现。
我们将ul元素设置为position:relative解决分割块的定位问题,ul元素的宽度需要与分割块的高度相同,方便后续的旋转操作,代码如下:
ul.pie {
position: relative;
width: 200px;
height: 200px;
border-radius: 50%;
list-style: none;
overflow: hidden;
}
这里我们设置了盒子的圆形边框,通过调整圆的半径(即高度的一半)可以实现不同大小的饼状图。 我们还将list-style设为none以去除每个li元素的默认“点号”。
下面我们需要设置每个分割块的大小和位置,我们可以将每个li设置为固定宽高,并设置绝对定位来达到分布在一个整圆上的效果,代码如下:
ul.pie li {
position: absolute;
top: 0;
left: 50%;
width: 100px;
height: 200px;
border-radius: 0 100px 100px 0;
transform-origin: 0 100px;
}
我们先将每个li都设置为绝对定位,并将左上角的坐标设为(0,0),然后将left设为50%。这里的宽度相当于分割块的长度,通过不同的宽度可以控制分割块的大小,高度设置为整个ul元素的高度,即每个分割块的高度为200px。为了实现半圆形,我们需要设置border-radius的四个值,具体数值可以根据需求自行设置。transform-origin:0 100px;表示要以每个分割块的左下角为旋转中心,这里的0表示left的值,100px表示height/2的高度。
4.2 盒子的旋转
接下来,我们需要通过旋转盒子来实现不同角度的分割块。CSS提供了transform属性来帮助我们实现盒子的旋转,我们可以通过设置transform:rotate(deg)的方式来旋转盒子。
为了使每个分割块能够平分360度,即每个li元素都是72度,我们需要给每个li元素设置不同的旋转角度,代码如下:
li.slice1 {
transform: rotate(72deg);
background-color: #ECF0F1;
}
li.slice2 {
transform: rotate(144deg);
background-color: #3498DB;
}
li.slice3 {
transform: rotate(216deg);
background-color: #2ECC71;
}
li.slice4 {
transform: rotate(288deg);
background-color: #F1C40F;
}
li.slice5 {
transform: rotate(360deg);
background-color: #E74C3C;
}
4.3 CSS3动画
接下来,我们需要实现鼠标悬停时每个分割块的旋转效果。我们可以使用CSS3中的transition属性实现过渡动画,当鼠标悬停在每个分割块上时,我们可以设置其transform属性的值,让其旋转一定角度。
为了保持分割块的对称性,我们需要将分割块旋转相应的角度才能实现期望的动画效果:
li.slice1:hover {
transform: rotate(42deg);
transition: transform .3s ease-in-out;
}
li.slice2:hover {
transform: rotate(114deg);
transition: transform .3s ease-in-out;
}
li.slice3:hover {
transform: rotate(186deg);
transition: transform .3s ease-in-out;
}
li.slice4:hover {
transform: rotate(258deg);
transition: transform .3s ease-in-out;
}
li.slice5:hover {
transform: rotate(330deg);
transition: transform .3s ease-in-out;
}
4.4 最终效果
最终效果如下所示:
![饼状图](https://i.loli.net/2021/07/22/ayHPXIZGwVY1x8U.png)
5. 总结
本文主要讲解了使用纯CSS实现饼状图的方法,通过了解盒模型、盒子的定位和旋转以及CSS3动画,我们可以轻松地实现一个漂亮的饼状图效果。当然,由于CSS的局限性,我们只能实现比较简单的图形,如果需要实现一些复杂的效果,建议使用专业的图表库或者JavaScript实现。