JavaScript 实现进度条的两种常见方案

作者:像素猫时间:2026-10-23 16:55:38浏览:392

本文介绍了两种在网页中实现进度条的JavaScript方案。第一种基于CSS相对与绝对定位,通过改变容器宽度控制进度;第二种利用单张透明GIF图片,通过调整background-position属性显示不同进度状态。文章包含具体代码示例及原理分析,适用于常规前端项目中的加载状态展示。

首先展示最终实现的视觉效果。

 

基于CSS定位的进度条实现

基于CSS定位的进度条实现 第一步,基本 构建基本的代码,看效果演示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>制作进度条的两种方法</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style> *{     margin:0;     padding:0; } body{font-size:12px;}h1{font-size:15px;} .wrap{     font-size: 12px;     margin:40px auto;     width:400px; } /*进度条样式*/ .progressbar_1{     background-color:#eee;     height:16px;     width:150px;     border:1px solid #bbb;     color:#222; } .progressbar_1 .bar {     background-color:#6CAF00;     height:16px;     width:0; } </style> </head> <body> <div class="wrap">     <h1>1,构建基本的HTML结构和CSS样式</h1>          0%的状态:     <div class="progressbar_1">         <div class="bar"></div>     </div>          50%的状态:     <div class="progressbar_1">         <div class="bar" style="width: 50%;"></div>     </div>          80%的状态:     <div class="progressbar_1">         <div class="bar" style="width: 80%;"></div>     </div>               100%的状态:     <div class="progressbar_1">         <div class="bar" style="width: 100%;"></div>     </div>          这步非常简单,相信大家都能看明白。 </div> </body> </html> 

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


第二步,为进度条添加文字显示功能。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>制作进度条的两种方法</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style> *{     margin:0;     padding:0; } body{font-size:12px;}h1{font-size:15px;} .wrap{     font-size: 12px;     margin:40px auto;     width:400px; } /*进度条样式*/ .progressbar_1{     background-color:#eee;     color:#222;     height:16px;     width:150px;     border:1px solid #bbb; } .progressbar_1 .bar {     background-color:#6CAF00;     height:16px;     width:0; } /*绝对定位*/ .progressbar_2{     background-color:#eee;     color:#222;     height:16px;     width:150px;     border:1px solid #bbb;     text-align:center;     position:relative; } .progressbar_2 .bar {     background-color:#6CAF00;     height:16px;     width:0;     position:absolute;     left:0;     top:0; } .progressbar_2 .text {     height:16px;     position:absolute;     left:0;     top:0;     width:100%;     line-height:16px; } /*绝对定位 + z-index */ .progressbar_3{     background-color:#eee;     color:#222;     height:16px;     width:150px;     border:1px solid #bbb;     text-align:center;     position:relative; } .progressbar_3 .bar {     background-color:#6CAF00;     height:16px;     width:0;     position:absolute;     left:0;     top:0;     z-index:10; } .progressbar_3 .text {     height:16px;     position:absolute;     left:0;     top:0;     width:100%;     line-height:16px;          z-index:100; } </style> </head> <body> <div class="wrap">     <h1>2,给进度条增加文字显示</h1>               一个进度条需要包含对应的进度文字显示,本例中,我希望文字显示在进度条的中间。     接下来,我们在进度条元素内增加一个显示 文字的div。          很显然,直接添加div后,div会占据原先绿色进度条的位置。看下面例子:               <div class="progressbar_1">         <div >50%</div>         <div class="bar" style="width: 50%;"></div>     </div>          那么有什么办法使得文字 和 绿色进度条 同时显示在 一起呢?          估计你也想到了,那就是绝对定位。通过对父元素添加相对定位,然后给子元素添加绝对定位,设置子元素的左边距和上边距都为0。          看下面的例子:          <div class="progressbar_2">         <div class="text">50%</div>         <div class="bar" style="width: 50%;"></div>     </div>          这时你会发现文字被遮盖了,相信你第一时间就会想到用 z-index 去设置他们的层级关系。     对,我也选择的是它。通过给他们设置不同的z-index值来确定层级关系,值越大越显示在上面。看下面例子:     <div class="progressbar_3">         <div class="text">50%</div>         <div class="bar" style="width: 50%;"></div>     </div>          <div class="progressbar_3">         <div class="text">80%</div>         <div class="bar" style="width: 80%;"></div>     </div>          <div class="progressbar_3">         <div class="text">100%</div>         <div class="bar" style="width: 100%;"></div>     </div>          这是第一种方式,也是目前最为流行的 制作进度条的方式。     他的原理就是采用 相对定位和绝对定位,然后通过背景不同来控制进度。     接下来我们看第二种方式制作进度条。           </div> </body> </html> 

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


其核心原理是利用相对定位和绝对定位,并通过背景差异来控制进度显示。接下来介绍第二种制作进度条的方式。


基于背景图片位置的进度条实现

第三步,制作进度条的第二种方式——直接使用图片结合背景图片。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style> *{     margin:0;     padding:0; } body{font-size:12px;}h1{font-size:15px;} .wrap{     font-size: 12px;     margin:40px auto;     width:400px; } /*不带文字*/ .progress{     border:0;     width: 152px;     height: 18px;     background:url(img/progress.gif) no-repeat -100px 50%; } /*带文字显示*/ .progressbar_3{     width:152px;     position:relative;     height:18px;     text-align:center;     position:relative;     color:#222; } .progressbar_3 .text{     width:152px;     position:absolute;     left:0;     top:0;     height:18px;     line-height:18px;     z-index:100; } .progressbar_3 .progress{     width:152px;     position:absolute;     left:0;     top:0;     height:18px;     z-index:10; } </style> </head> <body> <div class="wrap">     <h1>3,制作进度条的第二种方式---直接使用图片+背景图片</h1>               <img src="img/bg.gif" />                   <img src="img/bg.gif" />               <img src="img/bg.gif" />               <img src="img/bg.gif" />          <img src="img/bg.gif" />               如果你想在上面进度条上添加进度显示的文字,你应该知道怎么办了(如果你仔细阅读过前面的例子的话)。     对,就是使用绝对定位+相对定位来控制。          <div class="progressbar_3">         <div class="text">0%</div>         <img src="img/bg.gif" />     </div>          <div class="progressbar_3">         <div class="text">20%</div>         <img src="img/bg.gif" />     </div>          <div class="progressbar_3">         <div class="text">50%</div>         <img src="img/bg.gif" />     </div>          <div class="progressbar_3">         <div class="text">80%</div>         <img src="img/bg.gif" />     </div>          <div class="progressbar_3">         <div class="text">100%</div>         <img src="img/bg.gif" />     </div>          这种方式的原理就是 利用 一张img图片,然后给img图片又设置背景图,通过背景图的background position 属性 来显示不同的部分。     当然这种方式 对图片有点要求 。你仔细一点就会发现,宽度是img的2倍。     另外图片必须是gif透明的,也就是说空心的。呵呵。看不到进度条。     总的来说,这应该算一个技巧,在实际项目中,也是能使用的。          <p style="float:right;">Dev By jb51.net</p>           </div> </body> </html> 

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


该方式的原理是使用一张img图片,并为该img设置背景图,通过调整background-position属性来显示不同的进度部分。


当然,这种方式对图片有一定要求。仔细观察会发现,图片的宽度通常是img容器宽度的2倍。


此外,图片必须是透明的GIF格式,即中间镂空。如果图片不透明,则无法看到进度条效果。示例中background-position使用的是px值,实际应用中可以采用百分比(如background-position:80% 50%)来控制,以实现更精确的进度显示。


总体而言,这算是一种实用技巧,在实际项目中是可以应用的。



第四步,应用示例。


实际应用示例

最后看一个简单的应用场景:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style> *{     margin:0;     padding:0; } body{font-size:12px;}h1{font-size:15px;} .wrap{     font-size: 12px;     margin:40px auto;     width:400px; } /*不带文字*/ .progress{     border:0;     width: 152px;     height: 18px;     background:url(img/progress.gif) no-repeat -100px 50%; } /*带文字显示*/ .progressbar_3{     width:152px;     position:relative;     height:18px;     text-align:center;     position:relative;     color:#222; } .progressbar_3 .text{     width:152px;     position:absolute;     left:0;     top:0;     height:18px;     line-height:18px;     z-index:100; } .progressbar_3 .progress{     width:152px;     position:absolute;     left:0;     top:0;     height:18px;     z-index:10; } </style>   </head> <body> <div class="wrap">     <h1>4,应用</h1>               <div class="progressbar_3">         <div class="text">0%</div>         <img src="img/bg.gif" />     </div>          <button id="addTo" >增加至50%</button>     <button id="cutdown" >减少至20%</button>          我使用的是第二种方式来做控制,通过animate来控制图片的background-position来达到进度条效果。     当然你也可以使用第一种方式做,第一种方式需要改变的是进度条的 width 属性。          <p style="float:right;">Dev By jb51.net</p>      </div> </body> </html> 

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


通过animate函数控制图片的background-position,从而达到进度条的效果。


当然,也可以使用第一种方式实现,第一种方式需要改变的是进度条的width属性。


文件打包下载

作者最新文章