如何作出满意的进度条?

1,748 阅读3分钟

前言

进度条的场景非常多,比如游戏进入界面前的加载动画、显示完成进度、答题正确率等等,处理比较好的进度条能够让人眼前一亮。

进度条的基本组成

进度条包括外边框、内边框、进度条和百分比框。以及它需要实现的动效,比如进度条需要从0开始增长,百分比框要随着进度条联动。

普通进度条结构

linear-gradient语法

(1) 使用方向:
background:linear-gradient(direction, color-stop1, color-stop2...)
direction如to left top(不常用)
(2) 使用角度:
background:linear-gradient(angle, color-stop1, color-stop2...) 
angle角度是指水平线和渐变线之间的角度

角度与指南针比较类似,0deg指向正北,90deg指向正东,顺时针方向,当然270deg也可以看成是-90deg,可能这张图不够形象,为了方便理解,请看下图。

线性渐变由一个轴 (梯度线) 定义,其上的每个点具有两种或多种的颜色,且轴上的每个点都具有独立的颜色。为了构建出平滑的渐变,linear-gradient() 函数构建一系列垂直于渐变线的着色线,每一条着色线的颜色则取决于与之垂直相交的渐变线上的色点。
但是这和我们想要的效果还是相差较远啊,别着急,继续往下看: 渐变线由包含渐变图形的容器的中心点和一个角度来定义的。渐变线上的颜色值是由不同的点来定义,包括起始点,终点,以及两者之间的可选的中间点(中间点可以有多个)。
理解了中间点的概念,感觉和效果相差不远了。 如角度外,再给颜色定义固定的百分比,这种类似斜栅格的进度条就很顺利的完成了,yeah!

继续思考:普通进度条条纹疏松,但是当需求需要密集的条纹时,你是不是就会有密集恐惧症了呢?但是很明显,密集的进度条相比普通进度条来说更好一点。

如果想做出这种密集的进度条,就需要先做出这种奇怪的图片

这种图片做起来非常复杂,想想代码就很可怕,需要太多的计算,而且需要拼接的非常好,不然很容易被打断。 既然linear-gradient拼接条纹太复杂,有没有能够替代并且满足需求的呢? 这时候repeating-linear-gradient映入我的眼帘

我是参考以下文章找到答案的,大家有兴趣可以仔细看看,写的非常好!

www.w3cplus.com/css3/why-do…

做一个简单的进度条吧

html

// 外边框
<div class="progress"> 
    // 内边框
    <div class="progress-shadow">  
    	// progress-bar(进度条基本样式)
    	// progress-bar-striped(进度条条纹样式):
    	// progress-bar.active(进度条动画):
      	<div class="progress-bar progress-bar-striped active" style="width: 0%;">
          <div class="progress-value">0%</div>
      	</div>        
    </div>
</div>

less

@getRem : 16rem ; 

.progress {
    margin-top: 100/@getRem;
    width: 255/@getRem;
    height: 30/@getRem;
    background: rgba(0, 0, 0, 0.1);
    border-radius: 20/@getRem;
    padding-top: 5/@getRem;
    .progress-shadow {
        width: 240/@getRem;
        height: 20/@getRem;
        border: 3px solid #a5a39d;
        border-radius: 30/@getRem;
        background: #d9eebe;
        .progress-bar {
            position: relative;
            margin-left: 0; //进度条靠左
            height: 20/@getRem;
            border-radius: 30/@getRem;                
            -webkit-box-shadow: inset -2.121/@getRem -2.121/@getRem 2/@getRem rgba(0, 0, 0, .2);
            box-shadow: inset -2.121/@getRem -2.121/@getRem 2/@getRem rgba(0, 0, 0, .2);
            &.active {
                animation: progress-bar-stripes 0.8s linear infinite reverse;
            }
        }
        .progress-bar-striped {
//          普通进度条写法
//          background: linear-gradient(45deg, #f0c105 25%, #ffcd05 25%, #ffcd05 50%, #f0c105 50%, #f0c105 75%, #ffcd05 75%, #ffcd05);
//          -webkit-background-size: 40px 40px;
//          background-size: 40px 40px;
//          密集进度条写法
            background: repeating-linear-gradient(135deg,#f0c105,#f0c105 3.2/@getRem,
            #ffcd05 0,#ffcd05 6.4/@getRem);
            background-size: 118.4/@getRem 20/@getRem;
        }
        .progress-value {
            width: 53/@getRem;
            height: 32/@getRem;
            line-height: 26/@getRem;
            font-size: 12/@getRem;
            font-weight: bold;
            color: #cc792f;
            background-position: -157/@getRem -1374/@getRem;
            position: absolute;
            top: -39/@getRem;
            right: -16/@getRem;
            text-align: center;
        }
    }
}
@keyframes progress-bar-stripes {
    from {
        background-position: 60/@getRem 0;
    }
    to {
        background-position: 0 0;
    }
}

效果展示

最后,附上项目github链接
github.com/VagrantDani…