JavaScript实现可拖拽的进度条

yizhihongxing

让我为您介绍如何使用JavaScript实现可拖拽的进度条。

步骤一:创建HTML结构

首先,在HTML中创建一个进度条的DOM元素,如下所示:

<div class="progress-container">
  <div class="progress-bar"></div>
</div>

其中,.progress-container代表进度条的容器,它的widthheight要适当;.progress-bar代表进度条,初始时长度为0。

步骤二:使用CSS样式美化进度条

在CSS中,对进度条进行样式美化,如下所示:

.progress-container {
  background-color: #ddd;
  width: 100%;
  height: 20px;
}

.progress-bar {
  background-color: #4CAF50;
  height: 100%;
  width: 0%;
}

.progress-container.progress-bar的样式可以根据需要进行调整。

步骤三:编写JavaScript代码

接下来就是进度条逻辑的实现了。需要使用JavaScript来实现进度条的动态改变和拖动。我们将进度条功能实现封装成一个对象 Progress:

<div class="progress-container">
  <div id="progress-bar" class="progress-bar"></div>
</div>
class Progress {
  constructor(element) {
    this.progressBar = element;
    this.dragging = false; //是否正在拖拽
    this.offsetX = 0; //当前鼠标位置距离元素左侧的距离
    this.left = 0; //元素左侧的距离
    this.init();
  }

  init() {
    // 鼠标按下的时候
    this.progressBar.addEventListener("mousedown", (e) => {
      this.dragging = true;
      this.offsetX = e.offsetX;
    });

    // 在进度条上拖动鼠标的时候
    this.progressBar.addEventListener("mousemove", (e) => {
      if (this.dragging) {
        let left = e.clientX - this.offsetX;
        this.setProgress(left);
      }
    });

    // 鼠标松开的时候
    document.body.addEventListener("mouseup", () => {
      if (this.dragging) {
        this.dragging = false;
      }
    });
  }

  // 设置进度条进度
  setProgress(leftPosition) {
    const { progressBar } = this;
    const progressContainer = progressBar.parentElement;
    const maxLeft = progressContainer.clientWidth - progressBar.clientWidth;

    if (leftPosition < 0) {
      leftPosition = 0;
    } else if (leftPosition > maxLeft) {
      leftPosition = maxLeft;
    }

    this.left = leftPosition;
    this.progressBar.style.width = (leftPosition / progressContainer.clientWidth) * 100 + "%";
  }
}

const progress = new Progress(document.getElementById("progress-bar"));

进度条对象 Progress 带有一些状态和方法:

  • progressBar:进度条DOM元素。
  • dragging:是否正在拖拽进度条。
  • offsetX:当前鼠标位置距离进度条左侧的距离。
  • left:进度条左侧的距离。
  • init():初始化进度条对象。绑定事件监听函数。
  • setProgress(leftPosition):根据当前进度条左侧的距离设置进度。

其中,init()方法中会对鼠标事件进行监听。当鼠标按下时,将dragging状态设置为 true,记录鼠标位置距离进度条左侧的距离offsetX。在进度条上拖动鼠标时,如果处于拖拽状态,设置进度条进度。当鼠标松开时,将dragging状态设置为 false。

示例一

下面是一个简单的示例,演示了如何使用Progress对象实现可拖拽的进度条:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Draggable Progress Bar</title>
    <style>
      .progress-container {
        background-color: #ddd;
        width: 100%;
        height: 20px;
      }

      .progress-bar {
        background-color: #4CAF50;
        height: 100%;
        width: 0%;
      }
    </style>
  </head>

  <body>
    <h1>Draggable Progress Bar</h1>
    <div class="progress-container">
      <div id="progress-bar" class="progress-bar"></div>
    </div>

    <script>
      class Progress {
        constructor(element) {
          this.progressBar = element;
          this.dragging = false; //是否正在拖拽
          this.offsetX = 0; //当前鼠标位置距离元素左侧的距离
          this.left = 0; //元素左侧的距离
          this.init();
        }

        init() {
          // 鼠标按下的时候
          this.progressBar.addEventListener("mousedown", (e) => {
            this.dragging = true;
            this.offsetX = e.offsetX;
          });

          // 在进度条上拖动鼠标的时候
          this.progressBar.addEventListener("mousemove", (e) => {
            if (this.dragging) {
              let left = e.clientX - this.offsetX;
              this.setProgress(left);
            }
          });

          // 鼠标松开的时候
          document.body.addEventListener("mouseup", () => {
            if (this.dragging) {
              this.dragging = false;
            }
          });
        }

        // 设置进度条进度
        setProgress(leftPosition) {
          const { progressBar } = this;
          const progressContainer = progressBar.parentElement;
          const maxLeft = progressContainer.clientWidth - progressBar.clientWidth;

          if (leftPosition < 0) {
            leftPosition = 0;
          } else if (leftPosition > maxLeft) {
            leftPosition = maxLeft;
          }

          this.left = leftPosition;
          this.progressBar.style.width =
            (leftPosition / progressContainer.clientWidth) * 100 + "%";
        }
      }

      const progress = new Progress(document.getElementById("progress-bar"));
    </script>
  </body>
</html>

示例二

下面是一个更完整的演示,进度条会自动在1秒内从0到100%:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Auto and Draggable Progress Bar</title>
    <style>
      .progress-container {
        background-color: #ddd;
        width: 100%;
        height: 20px;
      }

      .progress-bar {
        background-color: #4CAF50;
        height: 100%;
        width: 0%;
      }
    </style>
  </head>

  <body>
    <h1>Auto and Draggable Progress Bar</h1>
    <div class="progress-container">
      <div id="progress-bar" class="progress-bar"></div>
    </div>

    <script>
      class Progress {
        constructor(element, auto = false) {
          this.progressBar = element;
          this.dragging = false; //是否正在拖拽
          this.offsetX = 0; //当前鼠标位置距离元素左侧的距离
          this.left = 0; //元素左侧的距离
          this.auto = auto; //是否自动更新进度条
          this.timer = null; //定时器
          this.lastUpdate = 0; //上一次更新进度的时间
          this.init();
        }

        init() {
          // 鼠标按下的时候
          this.progressBar.addEventListener("mousedown", (e) => {
            this.dragging = true;
            this.offsetX = e.offsetX;
          });

          // 在进度条上拖动鼠标的时候
          this.progressBar.addEventListener("mousemove", (e) => {
            if (this.dragging) {
              let left = e.clientX - this.offsetX;
              this.setProgress(left);
            }
          });

          // 鼠标松开的时候
          document.body.addEventListener("mouseup", () => {
            if (this.dragging) {
              this.dragging = false;
            }
          });

          // 自动更新进度
          if (this.auto) {
            this.timer = setInterval(() => {
              const now = Date.now();
              if (now - this.lastUpdate > 1000) {
                this.lastUpdate = now;
                let leftPosition = this.left + 10;
                if (leftPosition > 100) {
                  leftPosition = 0;
                }
                this.setProgress(leftPosition);
              }
            }, 10);
          }
        }

        // 设置进度条进度
        setProgress(leftPosition) {
          const { progressBar } = this;
          const progressContainer = progressBar.parentElement;
          const maxLeft = progressContainer.clientWidth - progressBar.clientWidth;

          if (leftPosition < 0) {
            leftPosition = 0;
          } else if (leftPosition > maxLeft) {
            leftPosition = maxLeft;
          }

          this.left = leftPosition;
          this.progressBar.style.width =
            (leftPosition / progressContainer.clientWidth) * 100 + "%";
        }

        // 停止自动更新
        stopAutoUpdate() {
          clearInterval(this.timer);
        }
      }

      const progress = new Progress(document.getElementById("progress-bar"), true);
    </script>
  </body>
</html>

在这个例子中,我们新增了一个auto参数,用于控制是否自动更新进度条。如果auto参数为true,进度条将以1秒内从0%到100%的速度进行自动更新。在init()中,我们使用了定时器来不断地更新进度条的状态。同时,我们增加了一个stopAutoUpdate()方法来停止自动更新,以及lastUpdate参数来记录上一次更新进度的时间。

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

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

相关文章

  • 分享5个JS 高阶函数

    下面就是分享5个JS高阶函数的攻略。 什么是高阶函数? 在JavaScript中,高阶函数是指能够接受一个或多个函数作为参数,并返回一个新函数的函数。它们是函数式编程的核心概念之一。 1. Array.prototype.map map 是 JavaScript 中最常用的高阶函数之一。该方法接受一个函数作为参数,该函数将应用到数组的每个元素,并返回一个新数…

    JavaScript 2023年5月27日
    00
  • JavaScript页面倒计时功能完整示例

    我将为您详细讲解如何实现Javascript页面倒计时功能的完整攻略,下面是完整步骤: 步骤一:准备工作 首先,在HTML页面中创建一个空白的 元素,用于展示倒计时。我们可以通过HTML代码将其嵌入到我们的页面中。 <div id="countdown"></div> 接下来,在JavaScript脚本中,我们需要…

    JavaScript 2023年5月27日
    00
  • javascript 特性检测并非浏览器检测

    JavaScript特性检测是一种技术,用于检测一个网站或应用程序是否支持所需的特定JavaScript特性。与浏览器检测不同,它测试一个特定的功能是否可用,而浏览器检测则简单地表明用户使用的浏览器。 下面是进行JavaScript特性检测的攻略: 步骤 1.判断所需功能是否可用: 首先,确定您需要的功能是否可用。这通常涉及询问JavaScript环境的功能…

    JavaScript 2023年6月11日
    00
  • 介绍一下js垃圾回收机制

    JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间。在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作。以下是关于JavaScript垃圾回收机制的一些关键概念: 内存生命周期:JavaScript内存生命周期包括分配、使用和释放三个阶段。首先,内存会被分配给变量或对象;然后,程序会…

    JavaScript 2023年4月17日
    00
  • JavaScript动态添加列的方法

    JavaScript动态添加列是一种常见的网页开发需求,通常用于在表格或其他HTML元素中添加新列来展示数据。下面是实现该功能的完整攻略。 步骤一:选择目标表格 首先,我们需要在HTML中选择要添加列的表格元素。通常,我们可以使用document.getElementById()方法或document.querySelector()方法来获取表格元素的引用。…

    JavaScript 2023年6月11日
    00
  • 使用JavaScript制作一个简单的计数器的方法

    制作一个简单的计数器,可以使用 JavaScript 来完成。 首先,在 HTML 文件中添加一个按钮和一个用于显示计数的元素,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &lt…

    JavaScript 2023年6月11日
    00
  • 关于前端文件下载各类方式大汇总

    关于前端文件下载各类方式大汇总 在前端开发中,文件下载是一个非常常见的需求场景,常见的文件下载方式有很多种,本文旨在对这些方式进行总结、分类和详细介绍。 1. 使用浏览器下载 使用浏览器下载文件一般都是直接让用户点击链接或者按钮进行下载。这种方式非常简单,只需要在链接或按钮上添加一个download属性即可实现下载功能。例如: <a href=&quo…

    JavaScript 2023年5月27日
    00
  • JavaScript 事件参考手册

    JavaScript 事件参考手册是一份非常全面的参考资料,详细列出了所有 DOM 事件及其相关属性和方法。为了更好地使用和掌握这份参考手册,可以按照以下攻略进行。 1. 浏览事件列表 首先浏览事件列表,了解所有可用的 DOM 事件。事件按照字母顺序排列,可以用浏览器的搜索功能查找特定的事件。每个事件名称后都有一个括号,里面包含了该事件所在的接口名称,这些接…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部