去年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>