標題黨了一回,雖然本文主要寫的是 純CSS實現簡單進度條,可是卻和HTML5中的新標籤<progress>
有很大的關係。爲何要本身實現進度條❓這是一個直擊靈魂的拷問。由於無論是
<progress>
,仍是各類UI組件中的進度條組件,彷彿都在提示咱們不須要本身去實現,直接拿來用就能夠了,可是這裏有一些問題。css對於
<progress>
,它存在的問題將在下面👇給出;對於其餘的UI組件,業務的風格和組件的風格是不一致的,沒有必要爲了這一個簡單組件引入其它的UI框架,還要改動風格,有這時間還不如本身實現一個,畢竟業務須要的是簡單效果。html
<progress>
存在的問題首先咱們來看一下<progress>
的兼容性,能夠發現目前所有主流的瀏覽器都支持該新標籤,可是支持歸支持,效果確實另外一碼事。。。雖然測試的不徹底,可是必定程度上也能反映問題(提早說明,測試的瀏覽器都是當前時間下最新的版本)。vue
沒有測Opera,另外別問我爲何沒 Safari。。。
序號 | 瀏覽器 | 顯示效果 |
---|---|---|
1 | Google Chrome | ![]() |
2 | Microsoft Edge(chromium內核) | ![]() |
3 | Firefox | ![]() |
4 | Internet Explorer | ![]() |
一樣沒有測Opera,這裏也別問我爲何沒 IE。。。
序號 | 瀏覽器 | 顯示效果 |
---|---|---|
1 | Google Chrome | ![]() |
2 | Microsoft Edge(chromium內核) | ![]() |
3 | Firefox | ![]() |
僅測試了下面幾種瀏覽器平臺👇
序號 | 瀏覽器 | 顯示效果 |
---|---|---|
1 | Android Webview | ![]() |
2 | Chrome for Android | ![]() |
3 | Safari on iOS | ![]() |
這下大概明白問題了吧,不一樣系統、不一樣瀏覽器、甚至有的一樣的瀏覽器不一樣的系統,<progress>
標籤的顯示效果都不同。特別是在Windows10系統環境下,每一個瀏覽器都不同,至於爲何加個10,由於聽說Windows7環境下和Windows10環境下也不同。。(其實我沒測過win7)segmentfault
用CSS實現一個進度條相信你們都會,直接上代碼。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>progress</title> <style> html, body { height: 100%; font-family: "Microsoft YaHei", sans-serif; } body { margin: 0; display: flex; } .container { position: relative; width: 100%; height: 100%; } .center { position: absolute; margin: auto; top: 0; left: 0; right: 0; bottom: 0; } ._block { width: 150px; height: 200px; } .progress-item { height: 30px; display: flex; align-items: center; } .progress-item > span { line-height: 30px; font-size: 14px; margin-left: 6px; } .progress-container { position: relative; width: 100px; height: 8px; border-radius: 6px; overflow: hidden; } .progress { width: 100%; height: 8px; background-color: #e0e0e0; } .progress-complete { position: absolute; height: 8px; border-radius: 6px; background-color: #f24360; left: 0; top: 0; } </style> </head> <body> <div class="container"> <div class="center _block"> <div class="progress-item"> <div class="progress-container"> <div class="progress"></div> <div class="progress-complete" style="width: 20%;"></div> </div> <span>20%</span> </div> <div class="progress-item"> <div class="progress-container"> <div class="progress"></div> <div class="progress-complete" style="width: 99%;"></div> </div> <span>99%</span> </div> <div class="progress-item"> <div class="progress-container"> <div class="progress"></div> <div class="progress-complete" style="width: 50%;"></div> </div> <span>50%</span> </div> </div> </div> </body> </html>
作個DEMO比較簡單,可是考慮複用的話仍是不太行,作成組件好了。
// progress.vue <template> <div class="progress-item"> <div class="progress-container"> <div class="progress"></div> <div class="progress-complete" :style="{'width': num}"></div> </div> <span>{{num}}</span> </div> </template> <script> export default { props: { num: { type: String, default: '0%' } }, data () { return {} } }; </script> // 使用 <template> <i-progress :num="data"></i-progress> </template> <script> import IProgress from '../components/progress' export default { data () { return { data: '20%' } }, components: { IProgress } } </script>
這裏須要注意的是,<progress>
是HTML5中的新標籤,在Vue中做爲組件聲明的話仍是換個名字吧。瀏覽器
// 組件 class IProgress extends React.Component { render() { const num = this.props.num; return ( <div className="progress-item"> <div className="progress-container"> <div className="progress"></div> <div className="progress-complete" style={{width: num}}></div> </div> <span>{num}</span> </div> ) } } // 使用 function App() { return ( <div className="App"> <header className="App-header"> </header> <IProgress num="20%"/> </div> ); } export default App;
本系列文章:框架
1.【CSS世界】01 border-radius深刻了解
2.【CSS世界】02 HTML5 Progress標籤和純CSS實現簡單進度條組件化