进度条

预加载器 之外,Framework7 还带有精心制作的动画进度条和可确定/不可确定的无限进度条,以指示活动。

可设定进度进度条

当可设定进度时,进度条可指示操作将要耗费多长时间,因为此时可以检测到进度百分比。

我们来看一下可设定进度条的布局

<div class="progressbar" data-progress="20">
  <span></span>
</div>

其中 data-progress="20" - 当前进度(以百分比表示)。请注意,此数据属性仅在页面加载时设置进度。如果你需要稍后对其进行更改,则应通过 API 完成。

无限进度条

当进度条为无限/不确定时,它会要求用户在完成某件事时等待,而不需要指示要花费多长时间。

我们来看一下无限进度条的布局

<div class="progressbar-infinite"></div>

进度条颜色

进度条支持所有 默认颜色。因此,要更改其颜色,只需将 color-[color] 类添加到进度条元素中即可。

<!-- Red progressbar -->
<div class="progressbar color-red" data-progress="20">
  <span></span>
</div>

<!-- Green progressbar -->
<div class="progressbar color-green" data-progress="50">
  <span></span>
</div>

<!-- Yellow infinite progressbar -->
<div class="progressbar-infinite color-yellow"></div>

<!-- Multicolor infinite progressbar -->
<div class="progressbar-infinite color-multi"></div>

进度条 API

进度条附带了 API,可让你控制进度条的进度,显示和隐藏它。我们来看看适当的 App 属性和方法

app.progressbar.set(el, progress, duration) - 设置可设定进度进度条的进度。

  • el - 字符串HTMLElement。进度条元素或包含进度条元素的元素。如果是字符串,则为该元素的 CSS 选择器。
  • progress - 数字。进度(以百分比表示,介于 0 到 100 之间)
  • duration - 数字。进度更改动画的过渡持续时间(以毫秒表示)
  • 此方法返回进度条 HTMLElement

app.progressbar.set(progress, duration) - 设置 app 根元素下的可设定进度进度条的进度。

  • progress - 数字。进度(以百分比表示,介于 0 到 100 之间)
  • duration - 数字。进度更改动画的过渡持续时间(以毫秒表示)
  • 此方法返回进度条 HTMLElement

app.progressbar.show(el, progress, color) - 创建并显示进度条,或者仅显示(如果已经显示)。

  • el - 字符串HTMLElement。进度条元素容器或包含进度条元素的元素。如果是字符串,则为该元素的 CSS 选择器。可选
  • progress - 数字。进度(以百分比表示,介于 0 到 100 之间)。可选
  • color - 字符串。进度条的颜色,例如“白色”、“红色”等,取自可用的 颜色主题可选
  • 此方法返回进度条 HTMLElement

此处的所有参数都是可选的

  • 如果你省略 el 参数,它将在 app 根下查找(或创建)进度条元素
  • 如果你省略 progress,它将显示/创建无限进度条
  • 如果你省略所有参数,它将在 app 根下使用默认颜色显示/创建无限进度条

app.progressbar.hide(el) - 隐藏进度条。

  • el - 字符串HTMLElement。进度条元素容器或包含进度条元素的元素。如果是字符串,则为该元素的 CSS 选择器。如果未指定,它将在 app 根元素下查找该元素。

CSS 变量

以下是相关的 CSS 变量 列表(CSS 自定义属性)。

注意具有注释的变量默认未指定,并且其值是它们在这种情况下回退到什么。

:root {
  /*
  --f7-progressbar-progress-color: var(--f7-theme-color);
  */
}
.ios {
  --f7-progressbar-height: 4px;
  --f7-progressbar-border-radius: 4px;
  --f7-progressbar-bg-color: rgba(0, 0, 0, 0.3);
}
.ios .dark,
.ios.dark {
  --f7-progressbar-bg-color: rgba(255, 255, 255, 0.3);
}
.md {
  --f7-progressbar-height: 4px;
  --f7-progressbar-border-radius: 0px;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-progressbar-bg-color: rgba(var(--f7-theme-color-rgb), 0.5);
}

示例

progressbar.html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Progress Bar</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block">
        <p>In addition to <a href="/preloader/">Preloader</a>, Framework7 also comes with fancy animated determinate and
          infinite/indeterminate progress bars to indicate some activity.</p>
      </div>
      <div class="block-title">Determinate Progress Bar</div>
      <div class="block block-strong-ios block-outline-ios">
        <p>When progress bar is determinate it indicates how long an operation will take when the percentage complete is
          detectable.</p>
        <p>Inline determinate progress bar:</p>
        <div>
          <p><span data-progress="10" class="progressbar" id="demo-inline-progressbar"></span></p>
          <p class="segmented segmented-raised">
            <a class="button" @click=${()=> setInlineProgress(10)}>10%</a>
            <a class="button" @click=${()=> setInlineProgress(30)}>30%</a>
            <a class="button" @click=${()=> setInlineProgress(50)}>50%</a>
            <a class="button" @click=${()=> setInlineProgress(100)}>100%</a>
          </p>
        </div>
        <div>
          <p>Inline determinate load & hide:</p>
          <p id="demo-determinate-container"></p>
          <p>
            <a href="" class="button button-fill" @click=${()=> showDeterminate(true)}>Start Loading</a>
          </p>
        </div>
        <div>
          <p>Overlay with determinate progress bar on top of the app:</p>
          <p>
            <a href="" class="button button-fill" @click=${()=> showDeterminate(false)}>Start Loading</a>
          </p>
        </div>
      </div>
      <div class="block-title">Infinite Progress Bar</div>
      <div class="block block-strong-ios block-outline-ios">
        <p>When progress bar is infinite/indeterminate it requests that the user wait while something finishes when it’s
          not necessary to indicate how long it will take.</p>
        <p>Inline infinite progress bar</p>
        <p>
          <span class="progressbar-infinite"></span>
        </p>
        <p>Multi-color infinite progress bar</p>
        <p>
          <span class="progressbar-infinite color-multi"></span>
        </p>
        <div>
          <p>Overlay with infinite progress bar on top of the app</p>
          <p id="demo-infinite-container"></p>
          <p>
            <a href="" class="button button-fill" @click=${()=> showInfinite(false)}>Start Loading</a>
          </p>
        </div>
        <div>
          <p>Overlay with infinite multi-color progress bar on top of the app</p>
          <p>
            <a href="" class="button button-fill" @click=${()=> showInfinite(true)}>Start Loading</a>
          </p>
        </div>
      </div>
      <div class="block-title">Colors</div>
      <div class="list list-strong-ios list-outline-ios list-dividers-ios simple-list">
        <ul>
          <li>
            <div class="progressbar color-blue" data-progress="10"></div>
          </li>
          <li>
            <div class="progressbar color-red" data-progress="20"></div>
          </li>
          <li>
            <div class="progressbar color-pink" data-progress="30"></div>
          </li>
          <li>
            <div class="progressbar color-green" data-progress="80"></div>
          </li>
          <li>
            <div class="progressbar color-yellow" data-progress="90"></div>
          </li>
          <li>
            <div class="progressbar color-orange" data-progress="100"></div>
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $f7, $el, $onMounted, $onBeforeUnmount }) => {
    let determinateLoading = false;
    let infiniteLoading = false;
    const setInlineProgress = (value) => {
      $f7.progressbar.set('#demo-inline-progressbar', value);
    }
    const showDeterminate = (inline) => {
      if (determinateLoading) return;
      determinateLoading = true;
      var progressBarEl;
      if (inline) {
        progressBarEl = $f7.progressbar.show('#demo-determinate-container', 0);
      } else {
        progressBarEl = $f7.progressbar.show(0);
      }
      var progress = 0;
      function simulateLoading() {
        setTimeout(function () {
          var progressBefore = progress;
          progress += Math.random() * 20;
          $f7.progressbar.set(progressBarEl, progress);
          if (progressBefore < 100) {
            simulateLoading(); //keep "loading"
          }
          else {
            determinateLoading = false;
            $f7.progressbar.hide(progressBarEl); //hide
          }
        }, Math.random() * 200 + 200);
      }
      simulateLoading();
    }
    const showInfinite = (multiColor) => {
      if (infiniteLoading) return;
      infiniteLoading = true;
      if (multiColor) {
        $f7.progressbar.show('multi');
      } else {
        $f7.progressbar.show();
      }
      setTimeout(function () {
        infiniteLoading = false;
        $f7.progressbar.hide();
      }, 3000);
    }

    return $render;
  };
</script>