FED

©FrontEndDev.org
2015 - 2024
web@2.23.0 api@2.21.1

如何用 javascript 做一个高逼格的进度条

可能你发现了本站顶部的进度条,它是如何实现的呢?下面一起来看。

页面进度条展示的是资源下载的进度,通常在页面上加上进度条,可以缓解用户的等待焦虑,也提升了网站的逼格。

前端进度条实现

在前端,实现网页的进度条目前还没有一个比较精确的方案,都是一些模拟进度。即页面打开的时候是 1%,然后定时器增加进度到 99%,然后 window.onload 之后,进度跑到 100%。

在前端,ajax 资源的上传和下载,html5 中都可以获取进度的,此文不谈。

实现准备

html 文件

<!DOCTYPE html>
<html>
<head lang="zh-cn">
    <meta charset="UTF-8">
    <title>进度条</title>
</head>
<body ontouchstart="">

</body>
</html>

先写一个进度条 div,放在body最前面。

<div class="progress">
    <div class="progress-inner" id="progress"></div>
</div>

在写样式:

<style>
    .progress{
        position: fixed;
        top: 0;
        right: 0;
        left: 0;
        height: 20px;
        background: #f5f5f5;
        border-bottom: 1px solid #ddd;
    }

    .progress-inner{
        width: 0;
        background: #d43f3a;
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
    }
</style>

为了显示进度,还需要添加几个 iframe:

<iframe src="http://baidu.com/" frameborder="0"></iframe>
<iframe src="http://163.com/" frameborder="0"></iframe>
<iframe src="http://qq.com/" frameborder="0"></iframe>

脚本

接下来开始写脚本,将进度条展示的脚本写在页面的最顶部,保证它是最先运行的,这样进度条才更加真实。

<script>
    (function () {
        // 获取进度条 div
        var $progress = document.getElementById('progress');

        // 初始进度,1%
        var progress = 1;

        // 生成随机数
        var random = function(min, max){
            return Math.floor(Math.random() * (max - min + 1) + min);
        };

        // 跑进度
        var onprogress = function () {
            // 随机时间
            var timeout = random(10, 30);

            setTimeout(function () {
                // 如果页面加载完毕,则直接进度到 100%
                if(window.loaded){
                    $progress.style.width = '100%';
                    return;
                }

                // 随机进度
                progress += random(1, 5);

                // 随机进度不能超过 98%,以免页面还没加载完毕,进度已经 100% 了
                if(progress > 98){
                    progress = 98;
                }

                $progress.style.width = progress + '%';
                onprogress();
            }, timeout);
        };

        // 开始跑进度
        onprogress();

        window.onload = function(){
            window.loaded = true;
        };
    })();
</script>

demo

http://jsdm.com/anon/paint/US3qS

完整的内容

<!DOCTYPE html>
<html>
<head lang="zh-cn">
    <meta charset="UTF-8">
    <title>进度条</title>
<style>
    .progress{
        position: fixed;
        top: 0;
        right: 0;
        left: 0;
        height: 20px;
        background: #f5f5f5;
        border-bottom: 1px solid #ddd;
    }

    .progress-inner{
        width: 1%;
        background: #d43f3a;
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
    }
</style>
</head>
<body ontouchstart="">

<div class="progress">
    <div class="progress-inner" id="progress"></div>
</div>

<script>
    (function () {
        // 获取进度条 div
        var $progress = document.getElementById('progress');

        // 初始进度,1%
        var progress = 1;

        // 生成随机数
        var random = function(min, max){
            return Math.floor(Math.random() * (max - min + 1) + min);
        };

        // 跑进度
        var onprogress = function () {
            // 随机时间
            var timeout = random(10, 30);

            setTimeout(function () {
                // 如果页面加载完毕,则直接进度到 100%
                if(window.loaded){
                    $progress.style.width = '100%';
                    return;
                }

                // 随机进度
                progress += random(1, 5);

                // 随机进度不能超过 98%,以免页面还没加载完毕,进度已经 100% 了
                if(progress > 98){
                    progress = 98;
                }

                $progress.style.width = progress + '%';
                onprogress();
            }, timeout);
        };

        // 开始跑进度
        onprogress();

        window.onload = function(){
            window.loaded = true;
        };
    })();
</script>

<iframe src="http://baidu.com/" frameborder="0"></iframe>
<iframe src="http://163.com/" frameborder="0"></iframe>
<iframe src="http://qq.com/" frameborder="0"></iframe>

</body>
</html>