美文网首页
记环形进度条(静态,非动态从0变到100%,css3实现)

记环形进度条(静态,非动态从0变到100%,css3实现)

作者: 宝妞儿 | 来源:发表于2021-05-27 15:39 被阅读0次

    使用html + css3 + js实现(项目中实现的):

    html:

    <div class="circle_wrapper" >
      <div class="wrapper left">
        <div class="circleProgress leftcircle" ></div>
      </div>
      <div class="wrapper right">
        <div class="circleProgress rightcircle"></div>
      </div>
      <div class="text-wrap">
        <div>70</div>
      </div>
    </div>
    

    css :

    <style>
        .circle_wrapper {
            width: 80px;
            height: 80px;
            background: linear-gradient(to bottom, #00C3DB, #0C7DEB);
            border-radius: 50%;
            position: relative;
            display: flex;
            justify-content: center;
            flex-direction: column;
            align-items: center;
        }
    
        .wrapper {
            width: 40px;
            height: 80px;
            position: absolute;
            top: 0;
            overflow: hidden;
        }
    
    
        .circleProgress {
            width: 40px;
            height: 80px;
            background: rgba(255,255,255, 0.8);
            position: absolute;
            top: 0;
        }
    
    
        .rightcircle {
            border-radius: 0 40px 40px 0;
            right: 0;
           transform-origin: left center;
        }
    
    
        .leftcircle {
            border-radius: 40px 0 0 40px;
            left: 0;
           transform-origin: right center;
        }
    
    
        .right {
            right: 0
        }
    
    
        .left {
            left: 0
        }
    
    
        .text-wrap {
            width: 70px;
            height: 70px;
            border-radius: 50%;
            background: #fff;
            font-size: 12px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
    </style>
    

    上述css代码的作用分别介绍一下,

    1、 .circle_wrapper的作用是 实现一个宽高都为80px 带渐变背景色的圆:

    image.png

    2、类名wrapper left , 和 wrapper right的作用是 设置左右两个宽度为40px, 高度为80px 的长方形,

    image.png image.png

    overflow: hidden 作用里,里面的div会进行旋转会超出,父级将超出部分盖住

    3、类名 circleProgress rightcircle 和 类名 circleProgress leftcircle的作用是,在上述对应的半个左右div容器里,弄个半圆出来, 这个半圆就是实际用来 旋转的

    注意: border-radius 的值里,四个值分别代表上、右、下、左 的圆角值

    所以,对于 rightcircle 是右边和下边圆角值为40px, 即右边和下边弄成半圆形,其他位置值为0,
    对于 leftcircle 是左边和上边圆角值为40px, 即左边和上边弄成半圆形,其他位置值为0,

    4、上述设置样式后,还没有出现个环形,那如何出现环形呢,就是类名 text-wrap起作用了,即它是一个比最外层80*80 要小得一个正方形,设置border-radius = 50%后,就可以构成环形了,如下图所示:

    (这里text-wrap设置的宽高都是70px, 则此时环形的width就是 80- 70 = 10px咯)

    image.png

    现在环形是出来了,如何让其根据不同的值,显示不同的进度(后面的进度条不是全满的状态,而是值多少,就是多少),这就涉及到css3 的旋转计算了

    Js 代码实现思路:
    1、 圆周角是360度,分成100份(因为进度满了是100%),每一份是3.6度
    2、 计算要转的角度,这里采用顺时针,从右向左旋转,
    比如现在 通过计算出来百分比是 70%, 则需要转动的角度是 70 * 3.6 = 252度,
    如果算出来的角度大于180度,则右边是转满180度,还剩下252 -180 = 72度,由左边的圆形旋转这个角度即可
    3、代码整体是用vue实现的,这里使用组件的局部指令实现功能, 如下的v-left-circle-progress,v-right-circle-progress,:

    <div class="wrapper left">
      <div class="circleProgress leftcircle" v-left-circle-progress=“{already: 70, all: 100}"></div>
    </div>
    <div class="wrapper right">
      <div class="circleProgress rightcircle" v-right-circle-progress=“{already: 70, all: 100}"></div>
    </div>
    

    js:

     <script src="[https://cdn.jsdelivr.net/npm/vue/dist/vue.js](https://cdn.jsdelivr.net/npm/vue/dist/vue.js)"></script>
    <script>
      new Vue({
          el: document.getElementById('app'),
          directives: { // 自定义指令,环形进度条动态计算进度,从右往左顺时针旋转
              'left-circle-progress': {
                  inserted(el, binding, vnode) {
                      let that = vnode.context;
                      const resultAngle = that.getResultAngle(binding.value);
                      if(resultAngle >= 180) { // 左边旋转
                          el.style.transform = `rotate(${resultAngle - 180}deg)`
                      }
                  },
              },
              'right-circle-progress': {
                  inserted(el, binding, vnode) {
                      let that = vnode.context;
                      const resultAngle = that.getResultAngle(binding.value);
                      // 右边旋转,超过180度,旋转180度,反之旋转对应的度数
                      el.style.transform = (resultAngle < 180) ? `rotate(${resultAngle}deg)` : `rotate(180deg)`;
                  },
              }
          },
          methods: {
              getResultAngle(obj) {
                  const { already, all } = obj
                  let everyAngle = 3.6 // 分成100份,360度,一份3.6度
                  const ratio = (already / all) * 100
                  const result = everyAngle * ratio // 最终要转的角度
                  return result;
              },
          }
      })
    </script>
    

    最终就实现了该效果:

    image.png

    相关文章

      网友评论

          本文标题:记环形进度条(静态,非动态从0变到100%,css3实现)

          本文链接:https://www.haomeiwen.com/subject/ucqdsltx.html