build semi circle progress bar with round corners and shadow in javascript and CSS

后端 未结 2 748
夕颜
夕颜 2021-01-06 06:52

I searched a lot and finding nothing on it. I want to make a progress bar with round corners.progress bar need to have shadow. All I did a

相关标签:
2条回答
  • 2021-01-06 07:33

    @jaromanda for suggestion of learning SVG.

    Yes is looks very hard to achieve from border-radius. So i looked into SVG and find it pretty handy. Here is my snippet:

    // progressbar.js@1.0.0 version is used
    // Docs: http://progressbarjs.readthedocs.org/en/1.0.0/
    
    var bar = new ProgressBar.SemiCircle(container, {
      strokeWidth: 10,
      color: 'red',
      trailColor: '#eee',
      trailWidth: 10,
      easing: 'easeInOut',
      duration: 1400,
      svgStyle: null,
      text: {
        value: '',
        alignToBottom: false
      },
      
      // Set default step function for all animate calls
      step: (state, bar) => {
        bar.path.setAttribute('stroke', state.color);
        var value = Math.round(bar.value() * 100);
        if (value === 0) {
          bar.setText('');
        } else {
          bar.setText(value+"%");
        }
    
        bar.text.style.color = state.color;
      }
    });
    bar.text.style.fontFamily = '"Raleway", Helvetica, sans-serif';
    bar.text.style.fontSize = '2rem';
    
    bar.animate(0.45);  // Number from 0.0 to 1.0
    #container {
      width: 200px;
      height: 100px;
    }
    
    svg {
      height: 120px;
      width: 200px;
      fill: none;
      stroke: red;
      stroke-width: 10;
      stroke-linecap: round;
      -webkit-filter: drop-shadow( -3px -2px 5px gray );
      filter: drop-shadow( -3px -2px 5px gray );
      }
    <script src="https://rawgit.com/kimmobrunfeldt/progressbar.js/1.0.0/dist/progressbar.js"></script>
    <link href="https://fonts.googleapis.com/css?family=Raleway:400,300,600,800,900" rel="stylesheet" type="text/css">
    <div id="container"></div>

    0 讨论(0)
  • 2021-01-06 07:48

    I want to suggest some stupid but quick solution since you're already using position: absolute. You can add background color to the circles when your animation starts.

    html:

    <div class="progress-bar">
        <div class="left"></div>
        <div class="right"><div class="back"></div></div>
        <div class="barOverflow">
            <div class="bar"></div>
        </div>
        <span>0</span>%
    </div>
    

    css:

    /** all your css here **/
    body{
        background-color:#3F63D3;  
    }
    
    .progress-bar{
        position: relative;
        margin: 4px;
        float: left;
        text-align: center;
    }
    .barOverflow{ 
        position: relative;
        overflow: hidden; 
        width: 150px; height: 70px; 
        margin-bottom: -14px;
    }
    .bar{
        position: absolute;
        top: 0; left: 0;
        width: 150px; height: 150px; 
        border-radius: 50%;
        box-sizing: border-box;
        border: 15px solid gray;       
        border-bottom-color: white; 
        border-right-color: white;
        transform: rotate(45deg);
    }
    .progress-bar > .left {
        position: absolute;
        background: white;
        width: 15px;
        height: 15px;
        border-radius: 50%;
        left: 0;
        bottom: -4px;
        overflow: hidden;
    }
    .progress-bar > .right {
        position: absolute;
        background: white;
        width: 15px;
        height: 15px;
        border-radius: 50%;
        right: 0;
        bottom: -4px;
        overflow: hidden;
    }
    .back {
        width: 15px;
        height: 15px;
        background: gray;
        position: absolute;
    }
    

    jquery:

    $(".progress-bar").each(function(){
        var bar = $(this).find(".bar");
        var val = $(this).find("span");
        var per = parseInt( val.text(), 10);
        var $right = $('.right');
        var $back = $('.back');
    
    $({p:0}).animate({p:per}, {
        duration: 3000,
        step: function(p) {
            bar.css({
                transform: "rotate("+ (45+(p*1.8)) +"deg)"
            });
        val.text(p|0);
        }
    }).delay( 200 );
    
    if (per == 100) {
        $back.delay( 2600 ).animate({'top': '18px'}, 200 );
    }
    
    if (per == 0) {
        $('.left').css('background', 'gray');
    }
    });
    

    https://jsfiddle.net/y86qs0a9/7/

    0 讨论(0)
提交回复
热议问题