JavaScript实现可拖拽的进度条

让我为您介绍如何使用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日

相关文章

  • JavaScript Rxjs mergeMap 的使用场合

    JavaScript中的Rxjs库是一种响应式编程库,可以用于处理异步数据流。其中的mergeMap操作符可以将一个Observable序列转换成另一个Observable序列。 mergeMap的使用场景: 与HTTP请求结合使用 假设我们需要从服务器下载一些资源,而这些资源是在另一个请求完成之后才能获得的。我们可以使用mergeMap来解决这个问题。例如…

    JavaScript 2023年6月11日
    00
  • vbs屏蔽键盘按键

    VBScript屏蔽键盘按键攻略 VBScript屏蔽键盘按键可以通过Shell.Application对象的SendKeys方法实现。在SendKeys方法中,使用{HOLD}标记可以屏蔽掉所有的键盘按键,同时使用{UNHOLD}标记可以恢复所有的键盘按键。 步骤一:在VBScript中使用SendKeys屏蔽键盘按键 以下是一个使用VBScript屏蔽键…

    JavaScript 2023年6月11日
    00
  • window.location.hash 属性使用说明

    当浏览器地址栏中的URL中包含hash值(即以#开头的字符串),浏览器会自动将hash值存储到window.location.hash属性中。这个属性提供了一种用于操作hash值的方式,允许我们通过JavaScript动态地更改hash值,使得页面可以根据hash值的不同来展示不同的内容。 1. 获取当前页面的hash值 可以通过window.locatio…

    JavaScript 2023年6月11日
    00
  • javascript跨域的4种方法和原理详解

    请听我详细讲解“JavaScript跨域的4种方法和原理详解”的完整攻略。 什么是跨域 在Web开发中,当一个页面使用了跟本页面不同域名的资源,例如JavaScript、CSS、图片、iframe等,就会出现所谓的“跨域”问题(Cross-Origin Resource Sharing,CORS)。因为同源策略(Same-Origin Policy),默认情…

    JavaScript 2023年5月27日
    00
  • JavaScript操作DOM元素的childNodes和children区别

    当操作网页中的DOM元素时,常常需要获取元素的子元素以及对这些子元素进行操作。在JavaScript中,有两个常用的属性用于获取DOM元素的子元素,分别是childNodes和children。虽然它们的功能类似,但也有一些区别。下面我们进行一一讲解。 childNodes属性 childNodes属性返回某一元素的所有子节点,包括文本节点。这个属性返回的对…

    JavaScript 2023年6月11日
    00
  • JS获取屏幕高度的简单实现代码

    当我们需要获取浏览器窗口可视区域的高度时,可以使用JavaScript代码来实现。下面是获取屏幕高度的简单实现代码攻略: 1.通过window对象获取屏幕高度 我们可以通过window对象来获取浏览器窗口的高度。这里有一个简单的例子: var height = window.innerHeight; 其中,window.innerHeight属性用于获取浏览…

    JavaScript 2023年6月11日
    00
  • js实现各种复制到剪贴板的方法(分享)

    下面是js实现各种复制到剪贴板的方法的攻略: 一、前置知识 为了实现复制到剪贴板的功能,必须要掌握以下前置知识: Clipboard API:一种新的Web API,提供了操作剪贴板的标准接口,并且被主流浏览器所支持。 execCommand()方法:一种旧的Web API,已经被废弃,但是在Clipboard API出现之前是实现复制到剪贴板的常用方法。 …

    JavaScript 2023年6月11日
    00
  • JavaScript for in

    JavaScript中的for in语句是一种循环结构,可以用来遍历对象的属性。该语句的基本语法如下: for (variable in object){ // 循环体代码 } 其中,variable表示每次循环中的变量名称,它将依次获取对象object的每一个属性名;而object则是需遍历的对象。 在每次循环中,variable会被赋值为对象object…

    Web开发基础 2023年3月30日
    00
合作推广
合作推广
分享本页
返回顶部