【CSS世界】02 HTML5 Progress標籤和純CSS實現簡單進度條

標題黨了一回,雖然本文主要寫的是 純CSS實現簡單進度條,可是卻和HTML5中的新標籤 <progress>有很大的關係。

爲何要本身實現進度條❓這是一個直擊靈魂的拷問。由於無論是<progress>,仍是各類UI組件中的進度條組件,彷彿都在提示咱們不須要本身去實現,直接拿來用就能夠了,可是這裏有一些問題。css

對於<progress>,它存在的問題將在下面👇給出;對於其餘的UI組件,業務的風格和組件的風格是不一致的,沒有必要爲了這一個簡單組件引入其它的UI框架,還要改動風格,有這時間還不如本身實現一個,畢竟業務須要的是簡單效果。html

一.<progress>存在的問題

首先咱們來看一下<progress>的兼容性,能夠發現目前所有主流的瀏覽器都支持該新標籤,可是支持歸支持,效果確實另外一碼事。。。雖然測試的不徹底,可是必定程度上也能反映問題(提早說明,測試的瀏覽器都是當前時間下最新的版本)。vue

css02-1.png

1.Windows10

沒有測Opera,另外別問我爲何沒 Safari。。。
序號 瀏覽器 顯示效果
1 Google Chrome css02-5.png
2 Microsoft Edge(chromium內核) css02-6.png
3 Firefox css02-4.png
4 Internet Explorer css02-3.png

2.macOS Catalina

一樣沒有測Opera,這裏也別問我爲何沒 IE。。。
序號 瀏覽器 顯示效果
1 Google Chrome css02-2.png
2 Microsoft Edge(chromium內核) css02-2.png
3 Firefox css02-2.png

3.移動端

僅測試了下面幾種瀏覽器平臺👇
序號 瀏覽器 顯示效果
1 Android Webview css02-8.png
2 Chrome for Android css02-8.png
3 Safari on iOS css02-7.jpg

這下大概明白問題了吧,不一樣系統、不一樣瀏覽器、甚至有的一樣的瀏覽器不一樣的系統<progress>標籤的顯示效果都不同。特別是在Windows10系統環境下,每一個瀏覽器都不同,至於爲何加個10由於聽說Windows7環境下和Windows10環境下也不同。。(其實我沒測過win7)segmentfault

2、實現一個進度條

用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>

3、組件化

作個DEMO比較簡單,可是考慮複用的話仍是不太行,作成組件好了。

1.Vue

// 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中做爲組件聲明的話仍是換個名字吧。瀏覽器

2.React

// 組件
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實現簡單進度條組件化

相關文章
相關標籤/搜索