手把手带你使用纯CSS实现饼状图

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实现。