ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【进阶版】如何实现一个基于 HTML+CSS+JS 的使命进度条 [打印本页]

作者: 伤心客    时间: 2024-10-9 17:48
标题: 【进阶版】如何实现一个基于 HTML+CSS+JS 的使命进度条
创建一个动态使命进度条:进阶版实现

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

这个进阶版的进度条支持以下功能:
完备代码

以下是实现该进度条的完备代码,包括 HTML、CSS 和 JavaScript。
1. HTML 布局

我们界说了一个包含进度条和输入框的基本布局:
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>动态任务进度条</title>
  7.     <style>
  8.         /* CSS 样式将在此处定义 */
  9.     </style>
  10. </head>
  11. <body>
  12.     <div class="progress-container">
  13.         <!-- 进度条背景 -->
  14.         <div class="progress-bar">
  15.             <!-- 进度条填充 -->
  16.             <div class="progress-fill"></div>
  17.         </div>
  18.         <!-- 进度条文字 -->
  19.         <div class="progress-text">
  20.             进度:<input type="text" value="0">%
  21.         </div>
  22.     </div>
  23.     <script>
  24.         // JavaScript 代码将在此处定义
  25.     </script>
  26. </body>
  27. </html>
复制代码
2. CSS 样式

接下来,我们为进度条和输入框设置样式,以确保良好的用户体验和美观的外观:
  1. body {
  2.     display: flex;
  3.     justify-content: center;
  4.     align-items: center;
  5.     height: 100vh;
  6. }
  7. .progress-container {
  8.     width: 600px;
  9. }
  10. .progress-bar {
  11.     width: 100%;
  12.     height: 25px;
  13.     background-color: grey;
  14.     border-radius: 5px;
  15. }
  16. .progress-fill {
  17.     width: 0;
  18.     height: 100%;
  19.     background-color: green;
  20.     border-radius: 5px;
  21.     /* 填充过渡动画 */
  22.     transition: width .5s ease-in-out;
  23. }
  24. .progress-text {
  25.     margin-top: 5px;
  26.     text-align: center;
  27. }
  28. .progress-text input {
  29.     width: 28px;
  30.     border: none;
  31.     outline: none;
  32.     border-bottom: 1px solid #ccc;
  33.     text-align: center;
  34.     font-weight: 800;
  35.     color: #ff8c00; /* 深橙色 */
  36. }
复制代码
3. JavaScript 实现

末了,我们使用 JavaScript 来处置处罚用户的交互,包括点击进度条和输入框的厘革:
  1.   // 进度条(背景板)
  2.         const progressBar = document.querySelector('.progress-container .progress-bar');
  3.         // 进度条填充
  4.         const progressFill = progressBar.querySelector('.progress-fill');
  5.         // 进度条文字
  6.         const progressText = document.querySelector('.progress-text');
  7.         const inputText = progressText.querySelector('input');
  8.         // 给进度条数字变化添加动画,依次升高,或者从依次降低
  9.         // input:目标表单元素
  10.         //value:表单元素目标值
  11.         function numberAni(input, value) {
  12.             // 计算差值,好计算执行时间
  13.             let diff = Math.floor(value - input.value);
  14.             // 总共0.5s,500ms进度条移动完成->数字变化完成
  15.             let interval = 500 / diff;//间隔多少毫秒,数字变化1
  16.             if (value == input.value) {
  17.                 return;
  18.             }
  19.             else if (value > input.value) {
  20.                 const timerId = setInterval(() => {
  21.                     // 表单元素的value值都是字符串,所以计算要进行转换
  22.                     input.value = Number(input.value) + 1;
  23.                     // console.log(typeof(input.value))
  24.                     // if判断中的input.value仍是字符串,虽然上面计算之后转成了number,但是内部自动转换成了
  25.                     if (input.value == value) {
  26.                         clearInterval(timerId);
  27.                     }
  28.                 }, interval)
  29.             } else {
  30.                 const timerId = setInterval(() => {
  31.                     // 表单元素的value值都是字符串,所以计算要进行转换
  32.                     input.value = Number(input.value) - 1;
  33.                     // console.log(typeof(input.value))
  34.                     // if判断中的input.value仍是字符串,虽然上面计算之后转成了number,但是内部自动转换成了
  35.                     if (input.value == value) {
  36.                         clearInterval(timerId);
  37.                     }
  38.                 }, interval)
  39.             }
  40.         }
  41.         // 给进度条添加事件监听
  42.         progressBar.addEventListener('click', (event) => {
  43.             // event.offsetX是鼠标坐标相当于父容器的偏移量
  44.             console.log(event);
  45.             const offsetX = event.offsetX;
  46.             // 这里也可以用getComputed获取 getComputed获取的都是绝对单位px,不管样式是怎么设置的,获取都会转换成绝对单位px
  47.             // const temp = getComputedStyle(progressBar).width;
  48.             // alert(temp)
  49.             // const tempNum = parseFloat(temp);//转换成整数,去掉单位px
  50.             // 获取进度条的总宽度,以计算百分比 这里用offsetWidth获取,因为.style.width获取的是元素行内样式,而且offsetWidth不会带单位,方便计算
  51.             const barWidth = progressBar.offsetWidth;
  52.             // 计算百分比
  53.             const persent = Math.round((offsetX / barWidth) * 100);//round取整 会自动四舍五入
  54.             // 设置进度条填充宽度
  55.             progressFill.style.width = persent + '%';
  56.             console.log(barWidth)
  57.             // 更新进度条文字
  58.             numberAni(inputText, persent)
  59.             // inputText.value = persent;
  60.         });
  61.         // 给input添加input事件 监听器,当值发送变化时执行对应的操作
  62.         // input事件:当输入框的内容发生变化时就会触发该事件,不需要等元素失去焦点,实时性更强
  63.         // change事件:必须有修改之后(数据前后不相同视为修改),还要失去焦点,才会触发
  64.         inputText.addEventListener('input', (event) => {
  65.             const persent = Math.round(event.target.value)
  66.             // 进度条跟着移动
  67.             progressFill.style.width = persent + '%';
  68.         });
复制代码
代码剖析

总结

通过以上步骤,你可以创建一个功能美满的动态使命进度条,用户可以通过点击和手动输入来更新进度。这种实现方式不仅美观,而且提升了用户体验,实用于各种应用场景,如下载进度、使命完成状态等。
希望本文对你有所资助!如果你有任何题目或建议,接待在品评区留言讨论。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4