純css實現進度條效果

  去年7月份作一個公司商城的微信頁面(微信用的chrome內核)須要寫一個提示返現進度的進度條效果。html

  一個完整的進度條效果其實能夠拆分一下:web

    一段背景;chrome

    一小段的靜態的斜紋進度條;微信

    斜紋進度條用線性漸變 linear-gradient 類實現,原理很好理解,2個參數:app

      一、角度;動畫

      二、關鍵點(包含2個參數,1是顏色,2是長度位置)ui

    

display: inline-block;
width: 100px;
height: 100px;
background-image: linear-gradient(0, #f10 0px, #ddd 50px);

    這是最基礎的漸變,構造了一個100px*100px的正方形,漸變角度爲0(從下到上),關鍵點A顏色#f10,開始長度爲0px,關鍵B顏色#ddd,開始長度爲50px,長度爲 點A到點B的長度差(50px)的這一段 就是漸變區域,點B到末尾就是純點B的顏色#ddd的區域,即上圖的漸變其實有個隱藏的關鍵點C顏色#ddd,開始長度爲100px,上圖的線性漸變完整的寫法是:spa

background-image: linear-gradient(0, #f10 0px, #ddd 50px, #ddd 100px);

    

    例如我寫的這個靜態的斜紋進度條的樣式是:3d

linear-gradient(60deg, transparent 0, transparent 0.8rem, #4dafe2 0.8rem, #4dafe2 1.6rem, transparent 1.6rem, transparent 2.4rem, #4dafe2 2.4rem);

    漸變角度爲60度;code

    0~0.8rem是第一段漸變區域,因爲2個關鍵點的顏色相同(transparent是透明的,即顏色由背景決定),因此這一段漸變區域 在忽略漸變角度的狀況下 實際上是純色的的長度爲0.8rem的長方形;

    0.8rem~0.8rem是第二段漸變區域,因爲2個關鍵點的長度位置相同,因此即使2個關鍵點的顏色不一樣,可是這一段漸變區域的長度爲 2個關鍵點的長度位置的差值 即0,等於沒有任何漸變效果;

    0.8rem~1.6rem……同理。

    那麼就構造出了這麼一段靜態的進度條,咱們只須要一個無限循環的動畫不斷控制background-position水平移動,就能夠寫出一個進度條的效果。

  

  附上源代碼:

  1 <!doctype html>
  2 <head>
  3 <meta charset="UTF-8">
  4 <title>process</title>
  5 <style>
  6     html {
  7         font-size: 62.5%;
  8     }
  9     .bg_fff {
 10         background-color: #fff;
 11     }
 12     .xui-wrapper {
 13         margin:0 auto;
 14         width:100%;
 15         max-width:750px;
 16         /*height:100vh;*/
 17         background-color:#efeff4;
 18     }
 19     .xui-myPromption-wrapper .xui-returnCommission .xui-process {
 20         position: relative;
 21         display: inline-block;
 22         vertical-align: middle;
 23         padding: 28px 0 12px;
 24         width: 76%;
 25     }
 26     .xui-myPromption-wrapper .xui-process .xui-icon-flag {
 27         position: absolute;
 28         top: 10px;
 29         left: 0;
 30         width: 12px;
 31         height: 18px;
 32         background-size: 11px;
 33     }
 34     .xui-myPromption-wrapper .xui-process .xui-process-static {
 35         width: 100%;
 36         height: 15px;
 37         border-radius: 10px;
 38         -webkit-box-shadow: 0 0 5px rgba(0, 198, 255,.6);
 39         box-shadow: 0 0 5px rgba(0, 198, 255,.6);
 40         background-color: rgba(0, 198, 255,.6);
 41     }
 42     .xui-myPromption-wrapper .xui-process .xui-process-active {
 43         position: absolute;
 44         top: 28px;
 45         left: 0;
 46         width: 0;
 47         height: 14px;
 48         border: 1px solid #4dafe2;
 49         border-radius: 10px;
 50         background-image: linear-gradient(60deg, transparent 0rem, transparent 0.8rem, #4dafe2 0.8rem, #4dafe2 1.6rem, transparent 1.6rem, transparent 2.4rem, #4dafe2 2.4rem);
 51         background-color: #008cd5;
 52         background-size: 20px 38px;
 53         -box-shadow: box-shadow: 1px 1px 5px rgba(0, 140, 213, .8);
 54         box-shadow: 1px 1px 5px rgba(0, 140, 213, .8);
 55         -webkit-animation: process 800ms infinite linear;
 56         animation: process 800ms infinite linear;
 57     }
 58     .xui-myPromption-wrapper .xui-process .xui-process-active:after {
 59         content: '';
 60         position: absolute;
 61         top: 0;
 62         left: 0;
 63         right: 0;
 64         bottom: 0;
 65         height: 100%;
 66         border-radius: 10px;
 67         background-image: linear-gradient(to bottom,rgba(0, 140, 213, .6), rgba(0, 140, 213, .6) 15%, transparent 60%, rgba(0, 140, 213, .6));
 68     } 
 69 
 70     /* 動畫 */
 71     @-webkit-keyframes process {
 72         0% { background-position: 0 0; }
 73         100% { background-position: 20px 0; }
 74     }
 75     @keyframes process {
 76         0% { background-position: 0 0; }
 77         100% { background-position: 20px 0; }
 78     }
 79 </style>
 80 </head>
 81 <body>
 82 <div class="xui-wrapper xui-myPromption-wrapper">
 83     <div class="xui-mainContain pt10 bg_fff">
 84         <div class="xui-returnCommission">
 85             <div class="xui-process">
 86                 <i id="icon-flag" class="xui-icon-flag"></i>
 87                 <div class="xui-process-static"></div>
 88                 <div id="process-bar" class="xui-process-active"></div>
 89             </div>
 90         </div>
 91     </div>
 92 </div>
 93 <script>
 94 (function (hasGet, totalGet) {
 95     var flag = document.getElementById('icon-flag'),
 96         processBar = document.getElementById('process-bar'),
 97         widthPercentage = Math.round(hasGet/totalGet*100);
 98     if (widthPercentage >= 100) {
 99         widthPercentage = 100;
100     }
101     flag.style.left = (widthPercentage-1) + '%';
102     processBar.style.width = widthPercentage + '%';
103     if (widthPercentage == 0) {
104         processBar.style.borderStyle = 'none';
105     }
106 })(10, 20);
107 </script>
108 </body>
109 </html>
相關文章
相關標籤/搜索