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

news2024/10/10 15:41:03

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

在现代网页开发中,任务进度条是用户交互中非常重要的组件,它能够直观地展示任务的进展情况。本文将向你展示如何使用 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 事件,实时更新进度条的宽度。

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三网话费折扣api怎么对接合作?如何变现?

三网优惠话费充值接口对接的操作步骤通常包括以下几个阶段&#xff1a; 注册账号&#xff1a;在API服务提供商的控制台注册账号&#xff0c;例如微客云控制台 。添加店铺&#xff1a;在控制台中添加店铺&#xff0c;并保存店铺ID或只勾选CMS 。申请API密钥&#xff1a;联系客服…

临时提高电压的常用方法电荷泵、自举升压电路

一、临时提高电压 爽死*子了&#xff0c;*子也硬玩一把临时重组器……&#xff08;雷总音&#xff09;。临时提高星级或者电压真的是一件很爽的事情&#xff0c;小钱办大事轻松拿捏。常用的临时提高电压的方式主要有两种&#xff0c;电荷泵和自举升压电路&#xff0c;你的某米手…

Nvidia在AI峰会上发布了七项重大技术公告

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

文档大师:打造一站式 Word 报告解决方案

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 在政府、医院、银行、财务以及销售等领域&#xff0c;常常需要创建各种报告文件来展开工作汇报&#xff0c;譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工…

一个月学会Java 第7天 字符串与键盘输入

Day7 字符串与键盘输入 字符串作为所有程序都很重要的东西&#xff0c;这个东西必须好好的学习&#xff0c;在Java中String会比较好学习&#xff0c;比起C和C里面会更加的简单&#xff0c; 在Java之中也是很好理解的&#xff0c;因为底层已经封装好了char数组&#xff0c;也就是…

《深入浅出LLM基础篇》(五):Propmt工程优化

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

【C++】AVL树(AVLTree)

目录 一、AVL树概念&#xff1a; 二、定义&#xff1a; 三、AVL树的插入&#xff1a; 四、AVL树的旋转&#xff1a; 1、左单旋&#xff1a; 2、右单旋&#xff1a; 3、右左双旋&#xff1a; 4、左右双旋&#xff1a; 五、AVL树的检验&#xff1a; 一、AVL树概念&#x…

重离子+数字化,肿瘤治疗的新路

大国之重器&#xff0c;当为大国之民生。 医用重离子加速器装置&#xff0c;被誉为肿瘤放疗领域的大国重器。在河西走廊东侧的甘肃省武威肿瘤医院(以下简称&#xff1a;武威肿瘤医院)&#xff0c;我国首台拥有自主知识产权的医用重离子加速器装置坐落此。自建成投入使用以来&a…

新手教学系列——爬虫异步并发注意事项

引言 爬虫是网络数据采集中不可或缺的工具,很多程序员在入门时会遇到这样的问题:为什么我的爬虫这么慢?尤其在面对大量数据时,单线程爬虫的速度可能让人捶胸顿足。随着爬虫规模的增大,异步并发成为了提高爬取效率的关键。然而,异步并发并不像表面看起来那么简单,如果没…

有哪些可靠的算力租赁平台推荐

作为一名炼丹师&#xff0c;在炼丹过程中使用过不少 GPU 算力租用平台&#xff0c;也有很多心得体会~为了让道友们少走弯路&#xff0c;我打算把近期在市场上用过的几家热门的 GPU 算力平台比较比较&#xff0c;以便其他炼丹师选择适合自己的算力平台。话不多说看&#xff01; …

Python简介与入门

如果你要用计算机做很多工作&#xff0c;最后你会发现有一些任务你更希望用自动化的方式进行处理。比如&#xff0c;你想要在大量的文本文件中执行查找/替换&#xff0c;或者以复杂的方式对大量的图片进行重命名和整理。也许你想要编写一个小型的自定义数据库、一个特殊的 GUI …

2025年人工智能行业的发展趋势预测以及中小企业的应对策略

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 ​ 进入2024年的第四季度&#xff0c;人工…

python数据分析与可视化工具介绍-numpy库

NumPy&#xff08;Numerical Python的简称&#xff09;&#xff0c;是科学计算基础的一个库&#xff0c;提供了大量关于科学计算的相关功能&#xff0c;例如&#xff0c;线性变换&#xff0c;数据统计&#xff0c;随机数生成等。其提供的最核心的类型为多维数组类型&#xff08…

Android Studio 打包混淆失效问题

项目场景&#xff1a; 通过 Python 脚本运行打包 Apk &#xff0c;实现动态配置各个版本的 Apk。 问题描述 通过 Python 脚本打包编译 Apk&#xff0c;开启混淆后&#xff0c;打包成功&#xff0c;反编译出来的 Apk 并没有被混淆。 原因分析&#xff1a; 首先确认打包混淆…

矩阵系统源码搭建,oem贴牌,技术指导

一、技术选型与整合 多种技术的融合 矩阵系统通常需要整合多种技术&#xff0c;包括前端技术、后端技术、数据库技术、服务器技术等。选择合适的技术栈并确保它们能够良好地协同工作是一个挑战。例如&#xff0c;前端可能使用 React 或 Vue.js&#xff0c;后端可能使用 Java Sp…

聚观早报 | 台积电9月份营收;联发科发布天玑9400

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 10月10日消息 台积电9月份营收 联发科发布天玑9400 vivo X200系列将全系标配原子岛 骁龙8 Gen4或改名“骁龙8至尊…

[ComfyUI]看惯AI味女神,回归现实,聊聊去AI胶皮味现实真人写真

随着人工智能技术的飞速发展&#xff0c;图像生成与反推技术已经取得了显著的进展。然而&#xff0c;有时候我们也会怀念那些真实、自然的人像照片。今天&#xff0c;我们为您带来了一篇关于[ComfyUI]如何拍摄去AI胶皮味现实真人写真的文章&#xff0c;帮助您回归现实&#xff…

Redis:分布式 - 哨兵

Redis&#xff1a;分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模…

美发店管理升级:SpringBoot技术实现

3系统分析 3.1可行性分析 通过对本美发门店管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本美发门店管理系统采用SSM框架&#xff0c;JAVA作为开发语…

产业园区数字化转型:破解传统园区发展瓶颈

在当今数字化浪潮汹涌澎湃的时代&#xff0c;传统产业园区面临着诸多发展瓶颈&#xff0c;而产业园区数字化转型成为了突破这些困境的关键路径。 传统产业园区往往存在着管理效率低下、资源配置不合理、企业间协同困难以及创新能力不足等问题。这些问题就像一道道枷锁&#xf…