使用CSS实现的几种进度条

使用CSS实现的几种进度条

(学习视频分享:css视频教程)

进度条是一个非常常见的功能,实现起来也不难,一般我们都会用 div 来实现。

作为一个这么常见的需求, whatwg 肯定是不会没有原生组件提供(虽然有我们也不一定会用),那么就让我们来康康有哪些有意思的进度条实现方式。

常规版 — div 一波流

这是比较常规的实现方式,先看效果:

立即学习“前端免费学习笔记(深入)”;

1.gif

源码如下:

  .progress1 {    height: 20px;    width: 300px;    background-color: #f5f5f5;    border-bottom-right-radius: 10px;    border-top-right-radius: 10px;  }  .progress1::before {    counter-reset: progress var(--percent, 0);    content: counter(progress) '%�2';    display: block;    height: 20px;    line-height: 20px;    width: calc(300px * var(--percent, 0) / 100);    font-size: 12px;    color: #fff;    background-color: #2486ff;    text-align: right;    white-space: nowrap;    overflow: hidden;    border-bottom-right-radius: 10px;    border-top-right-radius: 10px;  }  .btn {    margin-top: 30px;  }
'use strict'; let startTimestamp = (new Date()).getTime(); let currentPercentage = 0; let maxPercentage = 100; let countDelay = 100; let timer = null; let start = false; const percentageChange = () => { const currentTimestamp = (new Date()).getTime(); if (currentTimestamp - startTimestamp >= countDelay) { currentPercentage++; startTimestamp = (new Date()).getTime(); progress1.style = `--percent: ${currentPercentage}`; }; if (currentPercentage { if (!start) { start = true; percentageChange(); }; }; btn.addEventListener('click', clickHander);

登录后复制

这种方法的核心就是以当前盒子为容器,以 ::before 为内容填充。用

的好处就是实现简单,兼容性强,拓展性高,但是美中不足的是标签语义化不强。

进阶版 — input type=”range”

是一个非常实用的替换元素,不同的 type 可以做不同的事情。第二种就是用 来实现的。首先我们来看看效果:

2.gif

源码如下:

  .progress2[type='range'] {    display: block;        font: inherit;    height: 20px;    width: 300px;    pointer-events: none;    background-color: linear-gradient(to right, #2376b7 100%, #FFF 0%);  }  .progress2[type='range'],  .progress2[type='range']::-webkit-slider-thumb {     -webkit-appearance: none;  };  .progress2[type='range']::-webkit-slider-runnable-track {    border: none;    border-bottom-right-radius: 10px;    border-top-right-radius: 10px;    height: 20px;    width: 300px;  }  .btn {    margin-top: 30px;  }  'use strict';  let startTimestamp = (new Date()).getTime();  let currentPercentage = 0;  let maxPercentage = 100;  let countDelay = 100;  let timer = null;  let start = false;  let percentageGap = 10;  const percentageChange = () => {    const currentTimestamp = (new Date()).getTime();    if (currentTimestamp - startTimestamp >= countDelay) {      currentPercentage++;      startTimestamp = (new Date()).getTime();      progress2.value = currentPercentage;      progress2.style.background = `linear-gradient(to right, #2376b7 ${currentPercentage}%, #FFF 0%`;    };    if (currentPercentage  {    if (!start) {      start = true;      percentageChange();    };  };  btn.addEventListener('click', clickHander);

登录后复制

写完这个 demo 才发现, 并不适合做这个功能。。一个是实现困难,这个 type 组件的每个元件都可以单独修改样式,但是效果并不是很好。

另一个是因为 range 有专属语意 —— 范围,所以它更适合做下面这种事:

3.png

以上demo来自:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range

高级版 — progress 鸭

当然,上述两种方式都是模拟进度条,实际上我们并不需要模拟,因为 whatwg 有为我们提供原生的进度条标签 —— 。

我们先看效果:

4.gif

实现如下:

  .progress3 {    height: 20px;    width: 300px;    -webkit-appearance: none;    display: block;  }  .progress3::-webkit-progress-value {    background: linear-gradient(      -45deg,       transparent 33%,       rgba(0, 0, 0, .1) 33%,       rgba(0,0, 0, .1) 66%,       transparent 66%    ),      linear-gradient(        to top,         rgba(255, 255, 255, .25),         rgba(0, 0, 0, .25)      ),      linear-gradient(        to left,        #09c,        #f44);    border-radius: 2px;     background-size: 35px 20px, 100% 100%, 100% 100%;  }  .btn {    margin-top: 30px;  }  'use strict';  let startTimestamp = (new Date()).getTime();  let currentPercentage = 0;  let maxPercentage = 100;  let countDelay = 100;  let timer = null;  let start = false;  const percentageChange = () => {    const currentTimestamp = (new Date()).getTime();    if (currentTimestamp - startTimestamp >= countDelay) {      currentPercentage++;      startTimestamp = (new Date()).getTime();      progress3.setAttribute('value', currentPercentage);    };    if (currentPercentage  {    if (!start) {      start = true;      percentageChange();    };  };  btn.addEventListener('click', clickHander);

登录后复制

虽然有原生的进度条标签,但是规范里并没有规定它的具体表现,所以各个浏览器厂商完全可以按照自己的喜好去定制,样式完全不可控,所以标签虽好。。可用性却不强,有点可惜。

终极版 — meter 赛高

当然,能够实现进度条功能的标签,除了上面所说的,还有 标签。先看效果:

5.gif

代码如下:

  .progress4 {    display: block;        font: inherit;    height: 50px;    width: 300px;    pointer-events: none;  }  .btn {    margin-top: 30px;  }  'use strict';  let startTimestamp = (new Date()).getTime();  let currentPercentage = 0;  let maxPercentage = 100;  let countDelay = 100;  let timer = null;  let start = false;  const percentageChange = () => {    const currentTimestamp = (new Date()).getTime();    if (currentTimestamp - startTimestamp >= countDelay) {      currentPercentage++;      startTimestamp = (new Date()).getTime();      progress4.value = currentPercentage;    };    if (currentPercentage  {    if (!start) {      start = true;      percentageChange();    };  };  btn.addEventListener('click', clickHander);

登录后复制

这个标签可能比较陌生,实际上它跟 的语义是一样的,用来显示已知范围的标量值或者分数值。不一样的就是。。。它样式改起来更麻烦。

总结

本文测评了4种实现进度条的方式,得出的结论就是 ——

赛高。。。虽然有的时候想优雅一点追求标签语义化,但是资源不支持,也很尴尬。

嗯,万能的

以上 demo 都可以我的 codepen 上查看:https://codepen.io/krischan77/pen/QPezjB

更多编程相关知识,请访问:css视频教程!!

以上就是使用CSS实现的几种进度条的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2880873.html

(0)
上一篇 2025年3月10日 19:57:53
下一篇 2025年2月23日 04:02:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何用css把图片弄成背景

    用css把图片弄成背景的方法:首先创建一个HTML示例文件;然后在body中添加一些p标签;最后使用css中的background属性将图片设置为背景即可。 本教程操作环境:Windows7系统、css3版,DELL G3电脑。 推荐:cs…

    2025年3月10日
    200
  • css里面怎么让body内容居中

    css里面让body内容居中的方法:1、使用margin设置边距“0 auto”让HTML页面中所有的元素水平居中;2、将div距离页面窗口左边框和上边框的距离设置为“50%”;3、通过jQuery实现水平和垂直居中。 本教程操作环境:Wi…

    2025年3月10日
    200
  • css中font属性能不按顺序吗

    css中font属性不能不按顺序,即font属性的书写必须按照顺序;css font指定在一个声明的所有字体属性;其按顺序可设置的属性是“font-style font-variant font-weight font-size&#8230…

    2025年3月10日
    200
  • css居中代码是什么

    css居中代码有:1、“vertical-align:middle”;2、“display:flex”;3、给父元素设置“display:table”,子元素设置“display:table-cell”可实现CSS垂直居中等等。 本教程操作…

    2025年3月10日 编程技术
    200
  • css背景超出宽度怎么办

    css背景超出宽度是因为背景图片过大,其解决办法:首先打开相应的css文件;然后添加“background-size:100% 100%”或者“background-size:contain”样式,让背景图片宽度和高度完全适应内容区域即可。…

    2025年3月10日
    200
  • css 如何设置带有正方形项目的列表

    css设置带有正方形项目的列表的方法:首先创建一个HTML示例文件;然后使用ul无序列表标签,并指定“list-style-type”为“square”即可设置带有正方形项目的列表。 本教程操作环境:Windows7系统、HTML5&amp…

    2025年3月10日
    200
  • css怎么设置文字加粗

    在css中,可以使用font-weight属性来加粗文本,该属性可以设置文本文字的粗细;只需要将font-weight属性的值设置为“bold”、“bolder”或“600”、“700”、“800”、“900”即可。 本文操作环境:宏基s4…

    2025年3月10日 编程技术
    200
  • 为什么css放上面js放下面

    css放上面js放下面的原因:1、在加载html生成DOM tree的时候,可以同时对DOM tree进行渲染,这样可以防止闪跳,白屏或者布局混乱;2、javascript加载后会立即执行,同时会阻塞后面的资源加载。 本文操作环境:Wind…

    2025年3月10日
    200
  • css怎么让字体变细

    css让字体变细的方法:可以利用font-weight属性来实现,如【font-weight: lighter;】。font-weight属性是用来设置字体的粗细效果的,属性值lighter表示更细的字符。 本文操作环境:windows10…

    2025年3月10日
    200
  • css怎么设置字体大小

    在css中,可以通过font-size属性来设置字体大小,语法格式为“font-size:值;”。该属性的值可以是“small”、“large”、“smaller”、“larger”等关键字;也可是加px、em、rem、%单位的数值。 本文…

    2025年3月10日 编程技术
    200

发表回复

登录后才能评论