首页 > 其他分享 >【进阶版】如何实现一个基于 HTML+CSS+JS 的任务进度条

【进阶版】如何实现一个基于 HTML+CSS+JS 的任务进度条

时间:2024-10-11 23:19:27浏览次数:3  
标签:const 进阶 进度条 value JS 输入框 progress input

创建一个动态任务进度条:进阶版实现

在现代网页开发中,任务进度条是用户交互中非常重要的组件,它能够直观地展示任务的进展情况。本文将向你展示如何使用 HTML、CSS 和 JavaScript 创建一个动态的任务进度条。在这个进阶版本中,用户不仅可以通过点击进度条来更新进度,还可以手动输入百分比值,进度条会相应地调整。

效果演示

这个进阶版的进度条支持以下功能:

  1. 点击进度条的任意位置,进度条会更新到相应的百分比。
  2. 在进度条下方的输入框中输入百分比值,进度条会实时更新。
  3. 输入框的数字变化具有动画效果,提供更好的用户体验。
    在这里插入图片描述

完整代码

以下是实现该进度条的完整代码,包括 HTML、CSS 和 JavaScript。

1. HTML 结构

我们定义了一个包含进度条和输入框的基本结构:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>动态任务进度条</title>
    <style>
        /* CSS 样式将在此处定义 */
    </style>
</head>
<body>
    <div class="progress-container">
        <!-- 进度条背景 -->
        <div class="progress-bar">
            <!-- 进度条填充 -->
            <div class="progress-fill"></div>
        </div>
        <!-- 进度条文字 -->
        <div class="progress-text">
            进度:<input type="text" value="0">%
        </div>
    </div>

    <script>
        // JavaScript 代码将在此处定义
    </script>
</body>
</html>

2. CSS 样式

接下来,我们为进度条和输入框设置样式,以确保良好的用户体验和美观的外观:

body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}

.progress-container {
    width: 600px;
}

.progress-bar {
    width: 100%;
    height: 25px;
    background-color: grey;
    border-radius: 5px;
}

.progress-fill {
    width: 0;
    height: 100%;
    background-color: green;
    border-radius: 5px;
    /* 填充过渡动画 */
    transition: width .5s ease-in-out;
}

.progress-text {
    margin-top: 5px;
    text-align: center;
}

.progress-text input {
    width: 28px;
    border: none;
    outline: none;
    border-bottom: 1px solid #ccc;
    text-align: center;
    font-weight: 800;
    color: #ff8c00; /* 深橙色 */
}

3. JavaScript 实现

最后,我们使用 JavaScript 来处理用户的交互,包括点击进度条和输入框的变化:

  // 进度条(背景板)
        const progressBar = document.querySelector('.progress-container .progress-bar');
        // 进度条填充
        const progressFill = progressBar.querySelector('.progress-fill');
        // 进度条文字
        const progressText = document.querySelector('.progress-text');
        const inputText = progressText.querySelector('input');

        // 给进度条数字变化添加动画,依次升高,或者从依次降低
        // input:目标表单元素
        //value:表单元素目标值
        function numberAni(input, value) {
            // 计算差值,好计算执行时间
            let diff = Math.floor(value - input.value);
            // 总共0.5s,500ms进度条移动完成->数字变化完成
            let interval = 500 / diff;//间隔多少毫秒,数字变化1
            if (value == input.value) {
                return;
            }
            else if (value > input.value) {
                const timerId = setInterval(() => {
                    // 表单元素的value值都是字符串,所以计算要进行转换
                    input.value = Number(input.value) + 1;
                    // console.log(typeof(input.value))
                    // if判断中的input.value仍是字符串,虽然上面计算之后转成了number,但是内部自动转换成了
                    if (input.value == value) {
                        clearInterval(timerId);
                    }
                }, interval)
            } else {
                const timerId = setInterval(() => {
                    // 表单元素的value值都是字符串,所以计算要进行转换
                    input.value = Number(input.value) - 1;
                    // console.log(typeof(input.value))
                    // if判断中的input.value仍是字符串,虽然上面计算之后转成了number,但是内部自动转换成了
                    if (input.value == value) {
                        clearInterval(timerId);
                    }
                }, interval)
            }
        }
        // 给进度条添加事件监听
        progressBar.addEventListener('click', (event) => {
            // event.offsetX是鼠标坐标相当于父容器的偏移量
            console.log(event);
            const offsetX = event.offsetX;
            // 这里也可以用getComputed获取 getComputed获取的都是绝对单位px,不管样式是怎么设置的,获取都会转换成绝对单位px
            // const temp = getComputedStyle(progressBar).width;
            // alert(temp)
            // const tempNum = parseFloat(temp);//转换成整数,去掉单位px

            // 获取进度条的总宽度,以计算百分比 这里用offsetWidth获取,因为.style.width获取的是元素行内样式,而且offsetWidth不会带单位,方便计算
            const barWidth = progressBar.offsetWidth;
            // 计算百分比
            const persent = Math.round((offsetX / barWidth) * 100);//round取整 会自动四舍五入
            // 设置进度条填充宽度
            progressFill.style.width = persent + '%';
            console.log(barWidth)
            // 更新进度条文字
            numberAni(inputText, persent)
            // inputText.value = persent;

        });
        // 给input添加input事件 监听器,当值发送变化时执行对应的操作
        // input事件:当输入框的内容发生变化时就会触发该事件,不需要等元素失去焦点,实时性更强
        // change事件:必须有修改之后(数据前后不相同视为修改),还要失去焦点,才会触发
        inputText.addEventListener('input', (event) => {
            const persent = Math.round(event.target.value)
            // 进度条跟着移动
            progressFill.style.width = persent + '%';

        });

代码解析

  1. HTML 结构

    • 进度条的容器 .progress-container 中包含了 .progress-bar.progress-fill
    • 下方的 .progress-text 中包含一个输入框,用于显示当前的进度百分比。
  2. CSS 样式

    • 进度条的外观由 .progress-bar.progress-fill 控制。
    • .progress-fill 通过 CSS 的 transition 属性实现了动态过渡效果。
  3. JavaScript 交互

    • numberAni 函数用于平滑地改变输入框中的数字,从当前值逐渐变化到目标值。
    • 监听进度条的点击事件,根据点击位置计算百分比,并更新进度条和输入框。
    • 监听输入框的 input 事件,实时更新进度条的宽度。

总结

通过以上步骤,你可以创建一个功能完善的动态任务进度条,用户可以通过点击和手动输入来更新进度。这种实现方式不仅美观,而且提升了用户体验,适用于各种应用场景,如下载进度、任务完成状态等。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。

标签:const,进阶,进度条,value,JS,输入框,progress,input
From: https://blog.csdn.net/2301_79858914/article/details/142792383

相关文章

  • 【进阶OpenCV】 (8)--摄像头操作--->识别文档内容
    文章目录摄像头操作1.打开摄像头2.识别画面预处理3.轮廓检测4.轮廓近似5.透视变换5.1定义order_point(pts)方法:5.2定义four_point_transform(image,pts)方法:5.3代码应用6.关闭图像窗口7.完整代码展示总结摄像头操作本篇我们来介绍,如何打开摄像头来识别文......
  • 【C++】模板进阶
    【C++】模板进阶一.非类型模板参数二.模板的特化函数模板特化函数模板的特化步骤:类模板特化1.全特化2.偏特化(1)部分特化(2)参数更进一步的限制三.模板分离编译1.什么是分离编译2.模板的分离编译3.解决方法四.模板总结一.非类型模板参数模板参数分为:类类......
  • 代码随想录算法训练营 | 完全背包,518. 零钱兑换 II,377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)
    完全背包题目链接:完全背包文档讲解︰代码随想录(programmercarl.com)视频讲解︰完全背包日期:2024-10-11想法:dp数组设置思路跟01背包一样,不同在遍历上,完全背包遍历背包大小是从weight[i]开始的(背包空间小于weight[i]就没有意义,不用考虑,直接用之前的对应数值就行了),从前往后遍历就能......
  • AI 提示词(Prompt)进阶一:Token 是什么?
    一、引言在我们开始探索ChatGPT的世界之前,让我们先来了解一下什么是“token”。这个概念对于理解ChatGPT至关重要。二、什么是Token?想象一下,你正在阅读一本书,但是这本书的每个字都是单独剪切出来的。在ChatGPT的世界里,这些单独的字就像是“token”。简单来说,token......
  • JWT(JSON Web Token)、Token、Session和Cookie
    JWT(JSONWebToken)、Token、Session和Cookie都是Web开发中常用的概念,它们各自在不同的场景下发挥着重要的作用。以下是对这四个概念的详细解释和比较:一、JWT(JSONWebToken)定义:JWT是一个紧凑的、自包含的用于双方之间安全传输信息的JSON对象。它通过将Token划分为头部(Header......
  • JSP内置对象(常用)
    request获取客户端传递的参数request.getParameter("name");在request对象中存储一个变量和数值request.setAttribute("Stringname","Objobj");获取request对象中存储的值request.getAttribute("Stringname");response设置响应内容及编码方式response.serConten......
  • 初始爬虫13(js逆向)
    为了解决网页端的动态加载,加密设置等,所以需要js逆向操作。JavaScript逆向可以分为三大部分:寻找入口,调试分析和模拟执行。 1.chrome在爬虫中的作用        1.1preservelog的使用默认情况下,页面发生跳转之后,之前的请求url地址等信息都会消失,勾选perservelog后之......
  • 生成系统签名.jsk
    生成系统签名1、在服务器内创建文件夹key用于放置签名文件2、生成platform.pemopensslpkcs8-informDER-nocrypt-inplatform.pk8-outplatform.pem3、生成pkcs12opensslpkcs12-export-inplatform.x509.pem-outplatform.p12-inkeyplatform.pem-passwordpas......
  • Flutter基础组件(7):进度条
    在Flutter应用开发中,无论是处理网络请求,执行耗时任务,或是等待用户响应,我们总是需要在界面上显示进度条或者等待指示器。在这篇博客中,我们将介绍Flutter中两种常用的进度指示器:LinearProgressIndicator和CircularProgressIndicator。我们将比较它们的异同点,以及如何使用和自......
  • jsp大学生比赛赛事信息管理8jmqc程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,公告类型,公告信息,赛事信息,报名信息,赛事队伍,加入队伍,赛事成绩开题报告内容一、开题报告名称大学生比赛赛事信息管理系统二、研究的目的、意义随着......