进度条

本示例展示如何实现一个平滑滚动的进度条。

我们从一个初始状态开始,包含一个按钮,该按钮向/start发送POST请求以开始任务:

<div hx-target="this" hx-swap="outerHTML">
  <h3>开始进度</h3>
  <button class="btn primary" hx-post="/start">
            开始任务
  </button>
</div>

然后这个div被替换为一个包含状态和进度条的新div,每600毫秒自动刷新一次:

<div hx-trigger="done" hx-get="/job" hx-swap="outerHTML" hx-target="this">
  <h3 role="status" id="pblabel" tabindex="-1" autofocus>运行中</h3>

  <div
    hx-get="/job/progress"
    hx-trigger="every 600ms"
    hx-target="this"
    hx-swap="innerHTML">
    <div class="progress" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" aria-labelledby="pblabel">
      <div id="pb" class="progress-bar" style="width:0%">
    </div>
  </div>
</div>

这个进度条每600毫秒更新一次,"width"样式属性和aria-valuenow属性设置为当前进度值。 因为进度条div上有id,htmx将通过将样式属性平滑过渡到新值来实现请求间的平滑过渡。 当与CSS过渡结合时,这使得视觉过渡连续而不是跳跃式的。

最后,当进程完成时,服务器返回HX-Trigger: done头,触发UI更新为"完成"状态, 并在UI中添加一个重新开始按钮(我们在本例中使用class-tools扩展为按钮添加淡入效果):

<div hx-trigger="done" hx-get="/job" hx-swap="outerHTML" hx-target="this">
  <h3 role="status" id="pblabel" tabindex="-1" autofocus>完成</h3>

  <div
    hx-get="/job/progress"
    hx-trigger="none"
    hx-target="this"
    hx-swap="innerHTML">
      <div class="progress" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="122" aria-labelledby="pblabel">
        <div id="pb" class="progress-bar" style="width:122%">
      </div>
    </div>
  </div>

  <button id="restart-btn" class="btn primary" hx-post="/start" classes="add show:600ms">
    重新开始任务
  </button>
</div>

本示例使用了从bootstrap进度条借鉴的样式:

.progress {
    height: 20px;
    margin-bottom: 20px;
    overflow: hidden;
    background-color: #f5f5f5;
    border-radius: 4px;
    box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
}
.progress-bar {
    float: left;
    width: 0%;
    height: 100%;
    font-size: 12px;
    line-height: 20px;
    color: #fff;
    text-align: center;
    background-color: #337ab7;
    -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
    box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
    -webkit-transition: width .6s ease;
    -o-transition: width .6s ease;
    transition: width .6s ease;
}
服务器请求 ↑ 显示

🔗演示