原生JavaScript实现进度条

yizhihongxing

下面是“原生JavaScript实现进度条”的完整攻略,包括实现过程、代码示例和具体讲解。

1. 实现过程

1.1 顶部进度条

实现顶部进度条的关键是获取当前页面的加载进度,并将其转化为进度条的宽度并实时更新,下面是代码示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>原生JavaScript实现进度条 - 顶部进度条</title>
  <style>
    .progressbar {
      position: fixed;
      top: 0;
      left: 0;
      width: 0;
      height: 3px;
      background-color: #29d;
      transition: width .3s ease;
    }
  </style>
</head>
<body>
  <div class="progressbar"></div>
  <script>
    window.addEventListener('load', function() {
      var progressbar = document.querySelector('.progressbar');
      progressbar.style.width = '100%';
      setTimeout(function() {
        progressbar.style.opacity = '0';
        setTimeout(function() {
          progressbar.style.display = 'none';
        }, 300);
      }, 1000);
    });
  </script>
</body>
</html>

在页面加载完成后,我们使用window.addEventListener('load', callback)的方式监听页面加载事件。在callback函数中,首先获取到进度条的DOM元素,然后将其宽度设置为100%,使其充满屏幕。

接下来,我们使用setTimeout方法给进度条添加一个淡出效果,并在淡出完成后隐藏进度条。

1.2 页面中的进度条

实现页面中的进度条比较麻烦,需要通过监听XHR请求的状态来实现进度条的更新和控制。下面是代码示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>原生JavaScript实现进度条 - 页面中的进度条</title>
  <style>
    .progressbar {
      position: fixed;
      top: 0;
      left: 0;
      width: 0;
      height: 3px;
      background-color: #29d;
      transition: width .3s ease;
    }
    .loading {
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
  </style>
</head>
<body>
  <div class="progressbar"></div>
  <div class="loading">加载中...</div>
  <script>
    var progressbar = document.querySelector('.progressbar');
    var loading = document.querySelector('.loading');
    var totalTime = 0;
    var startTime = 0;

    function startLoading() {
      loading.style.display = 'block';
      startTime = Date.now();
    }

    function finishLoading() {
      loading.style.opacity = '0';
      setTimeout(function() {
        loading.style.display = 'none';
      }, 300);
    }

    function updateProgress() {
      var currentTime = Date.now();
      var progress = Math.min((currentTime - startTime) / totalTime, 1);
      progressbar.style.width = progress * 100 + '%';
      if (progress < 1) {
        requestAnimationFrame(updateProgress);
      }
    }

    function hookXHR() {
      var open = XMLHttpRequest.prototype.open;
      var send = XMLHttpRequest.prototype.send;
      var isXHRInitializing = true;

      XMLHttpRequest.prototype.open = function() {
        this.startTime = Date.now();
        open.apply(this, arguments);
      }

      XMLHttpRequest.prototype.send = function() {
        totalTime = this.timeout || 5000;
        if (isXHRInitializing) {
          isXHRInitializing = false;
          hookXHR();
          startLoading();
          requestAnimationFrame(updateProgress);
        }
        send.apply(this, arguments);
        var self = this;
        this.addEventListener('loadend', function() {
          finishLoading();
          isXHRInitializing = true;
        })
      }
    }

    hookXHR();
  </script>
</body>
</html>

首先,我们通过XMLHttpRequest的原型方法opensend来监听XHR请求的状态。在open方法中,我们获取到请求开始的时间戳,并在send方法中计算请求的总耗时,并将其保存到全局变量totalTime中。

在第一次XHR请求时,我们开始显示加载中的提示,并使用requestAnimationFrame方法来不断更新进度条的宽度。在每次更新时,我们计算当前进度的百分比,然后根据百分比设置进度条的宽度。

在XHR请求完成时,我们将加载中的提示淡出,并在淡出完成时隐藏。

2. 总结

通过以上代码示例和实现过程的讲解,我们可以知道实现进度条的关键在于监听XHR请求的状态,并将请求的耗时转化为进度条的宽度并进行实时更新。此外,我们还需要注意淡入淡出效果的实现,以及在进度条更新时如何避免浏览器卡顿的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JavaScript实现进度条 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • css3 利用transform打造走动的2D时钟

    下面是“CSS3 利用 Transform 打造走动的 2D 时钟”的完整攻略: 1. 开始之前 在开始之前,请确保你具备以下知识: HTML 和 CSS 的基础知识 CSS3 Transform 属性的理解 2. 准备工作 首先,编写 HTML 代码: <div class="clock"> <div class=&q…

    css 2023年6月11日
    00
  • 解决子容器全部浮动时父容器高度不能自动撑开的方法

    当在一个父容器中包含多个子元素时,这些子元素被设置了浮动属性后,会脱离文档流,导致父容器高度不能自适应其内容高度的变化。解决这个问题的方法有以下两种: 1. 使用Clearfix Clearfix是一种CSS技巧,它可以在浮动元素的父元素上使用来清除浮动对父容器高度的影响。在父容器上添加一个clear样式可以让其自动撑开。 示例代码: .parent-con…

    css 2023年6月9日
    00
  • 在React中写一个Animation组件为组件进入和离开加上动画/过度效果

    在React中实现动画效果,通常可以使用React动画库实现,其中比较流行的动画库有React Transition Group和React Spring等。其中React Transition Group提供了两种基本的过渡动画,分别是淡入淡出以及挂载和卸载时的滑动效果。下面我将介绍如何在React中使用React Transition Group实现组件…

    css 2023年6月10日
    00
  • css样式div或li在ie6下背景平铺及border边框断线解决技巧

    对于CSS样式中的div或li,在IE6下的背景平铺及border边框断线问题是很常见的。解决这个问题需要具备以下技巧: 利用触发IE6布局的hack技巧 在IE6中,当元素的宽度或高度值为0时,这个元素的边框就会出现断线的问题。因此,可以利用hack技巧,在样式表中添加以下代码: * html .className { height: 1%; } 这个ha…

    css 2023年6月9日
    00
  • css实现的漂亮的分页效果代码(橘黄色与蓝色)

    下面是CSS实现漂亮的分页效果的代码攻略。 准备工作 在开始之前,需要准备以下素材: 分页的HTML结构代码如下: <div class="paging"> <ul class="page-list"> <li class="page-item"><a hr…

    css 2023年6月9日
    00
  • CSS 实现侧滑显示留言面板的网页组件功能

    要实现侧滑显示留言面板的网页组件功能,需要考虑以下几个步骤: 1. 界面设计 首先需要设计留言面板的界面,一般情况下需要在主界面的一侧添加一个按钮或者图标来触发侧滑显示留言面板。 代码示例1: <div class="wrapper"> <div class="main"> <button…

    css 2023年6月10日
    00
  • less简单入门(CSS 预处理语言)

    Less简单入门攻略 什么是Less Less是CSS预处理语言,具备一些CSS不具备的特性,如:变量定义,函数定义,嵌套规则,混合等。使用Less可以快速地编写CSS,同时可以提升CSS代码的可维护性和可读性。 安装Less 使用Less前需要先进行安装。Less的安装可以通过npm进行全局安装。 npm install -g less 安装完毕后,在命令…

    css 2023年6月9日
    00
  • bootstrap-table实现表头固定以及列固定的方法示例

    要实现bootstrap-table表头固定和列固定,主要需要以下几个步骤: 一、引入jQuery库和bootstrap-table插件库。 在文档的head中引入jQuery库和bootstrap-table插件库,如下: <head> <script src="https://cdn.bootcss.com/jquery/3.…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部