让前端飞Web前端之路

css实现百分比环形图(圆环图)和一点细节

2019-10-25  本文已影响0人  虚拟J
实现的效果

实现不难,但是有一点细节,所以写一下。

css:

//最外面的一个div
.annulusBasics {
  width        : 94px;
  height       : 94px;
  position     : relative;
  overflow     : hidden;
  border-radius: 50%;
  text-align   : center;
  z-index      : 1;
}
//圆环中间的白色
.centerCircle {
  position     : absolute;
  z-index      : 10;
  border-radius: 50%;
  width        : 71px;
  height       : 71px;
  background   : #fff;
  transform    : translate(12px, 12px);
  line-height  : 71px;
}
 //圆环百分比时出现圆环边框的颜色
.annulusOuter {
  position     : absolute;
  top          : 0;
  left         : 0;
  width        : 94px;
  height       : 94px;
  border       : 12px solid #FF7F69;
  border-radius: 50%;
}
//左边遮住圆环颜色的长方形
.leftRectangle {
  position        : absolute;
  background      : #EBEEF5;
  width           : 47px;
  height          : 94px;
  transform-origin: right;
}
//右边遮住圆环颜色的长方形
.rightRectangle {
  position        : absolute;
  background      : #EBEEF5;
  transform-origin: left;
  left            : 47px;
  width           : 47px;
  height          : 94px;
  transform       : rotate(0deg);
}
//弥补hidde在移动端失效的圆环
.repairAnnulus{
  position     : absolute;
  width        : 94px;
  height       : 94px;
  z-index      : 20;
  border-radius: 50%;
  box-sizing   : content-box;
//改外边框的时候,位置也要改下
  border       : 20px solid #ffffff;
  top          : -20px;
  left         : -20px;
}

稍微提一下,我上面的代码是基于为box-sizing默为 border-box 的情况下,所以直接复制的时候要注意下。

下面是react中的JSX,根据classWrongScore不同的值呈现不同的效果

  <div className={style.annulusBasics}>
           <div className={style.centerCircle}>{(Math.floor(classWrongScore * 1000) / 10).toFixed()}%</div>
                <div className={style.annulusOuter}></div>
               {classWrongScore > 0.5 ?
                <div className={style.leftRectangle} style={{ transform: `rotate(${180 * classWrongScore}deg)` }}></div> :
                <div className={style.leftRectangle} ></div>}
                {classWrongScore < 0.5 ?
                <div className={style.rightRectangle} style={{ transform: `rotate(${360 * classWrongScore}deg)` }}></div>
              : <div className={style.rightRectangle} style={{ background: '#FF7F69' }}></div>}
               {/*加下面一个div是因为hidde在移动端失效导致样式不对*/}
                <div className={style.repairAnnulus}></div>
 </div>

下面是html,超过50%的时候,修改.leftRectangle的角度,小于50%的时候,修改.rightRectangle的角度。

<div class="annulusBasics">
        <div class="centerCircle">40%</div>
        <div class="annulusOuter"></div>
        <div class="leftRectangle" style="transform:rotate(144deg)"></div> 
        <div class="rightRectangle"></div>
        {/*加下面一个div是因为hidde在移动端失效导致样式不对*/}
        <div className={style.repairAnnulus}></div>
   </div>
上一篇下一篇

猜你喜欢

热点阅读