zoukankan      html  css  js  c++  java
  • web前端js实现资源加载进度条

    进度条核心方法,通常j不考虑判断到100,根据项目中的图片数量可能有所差异所以到95就可以了

    //根据图片load进度条
    function loadingAsImgLength(){
    
            var precent= 1;
            var imglen = $('img').length;
            for(var i = 0; i < imglen; i++){
                var imgs = new Image();
                imgs.src = $('img').eq(i).attr("src");
                imgs.onload = function () {
                    precent= precent+=1;
                    var num = parseInt((precent/(imglen-1))*100);
                    var j  = num;
                    j = isNaN(j)?100:j;
                    (function (j) {
                        setTimeout(function () {
                            //开始加载
                            
                            $(".load_tips font").html(j+"%");
                            
                            if(j>=95){
                                
                                j = 100;
                                
                                $(".load_tips font").html("100%");
                                
                                setTimeout(function(){
                                    console.log("加载完成后的操作");
                                            
                                },200)
                                return;
                            }
                        },j*15)
                        
                    })(j)
    
                }
            }
            
    }

    下面是用canvas画的一个进度实现。

    创建HTML文件,CSS文件和JavaScript文件,并引入jquery。

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    		<meta name="viewport" content="width=device-width, initial-scale=1.0">
    		<meta name="full-screen" content="yes">
    		<meta name="browsermode" content="application">
        	<meta name="x5-orientation" content="portrait">
    		<title>圆形进度条加载</title>
    	</head>
    	
    		<link rel="stylesheet" href="css/circle.css">
    		
    	<body>
    		
    		
    		<div class="periphery">
    			
    			<canvas id="circleCanvas" width="200" height="200"></canvas>
    			
    			<!--请用img标签添加图片资源进行测试,越多越好,为避免看不到效果请把canvas层级调高-->
    			<img src='a.jpg'/>
    			<img src='a.jpg'/>
    			<img src='a.jpg'/>
    			<img src='a.jpg'/>
    			
    		</div>
    		
    		
    		
    		
    		<script type="text/javascript" src="js/jquery-2.1.0.js" ></script>
    		<script type="text/javascript" src="js/circle.js" ></script>
    	</body>
    	
    </html>
    

      css样式,自行调整大小或位置

    /*初始化页面*/
    *{
    	padding:0;
    	margin:0;
    	border:0;
    }
    
    body,html{
    	100%;
    	height:100%;
    	overflow: hidden;
    }
    
    
    .periphery{
    	100%;
    	height:100%;
    	position: relative;
    	background: #ccc;
    }
    
    #circleCanvas{
    	position: absolute;
    	top:50%;
    	left:50%;
    	transform: translate(-50%,-50%);
    }
    
    .periphery img{
    	opacity: 0;
    }
    

      接下来是核心功能实现,采用js绘制并渲染canvas

    function drawCircleLoading(ctx,progress){
    	ctx.clearRect(0,0,200,200);
    	ctx.beginPath();
    	ctx.lineWidth=10;
    	ctx.strokeStyle='rgba(50,207,224,1)';
    	ctx.arc(100,100,40,0,2 * Math.PI,false);
    	ctx.stroke();
    	ctx.beginPath();
    	ctx.lineWidth=4;
    	ctx.strokeStyle='rgba(50,207,224,1)';
    	ctx.arc(100,100,50,0,2 * Math.PI,false);
    	ctx.stroke();
    	ctx.beginPath();
    	ctx.lineWidth=4;
    	ctx.strokeStyle='rgba(0,0,0,0.2)';
    	ctx.arc(100,100,50,0,2 * Math.PI,false);
    	ctx.stroke();
    	ctx.beginPath();
    	ctx.save()
    	ctx.translate(0,200);
    	ctx.rotate(270 * Math.PI/180);
    	ctx.lineWidth=10;
    	ctx.strokeStyle='rgba(0,0,0,0.2)';
    	ctx.arc(100,100,40,0,1.9999 * Math.PI * (progress * 0.01),true);
    	ctx.stroke();
    	ctx.restore();
    	ctx.beginPath();
    	ctx.font="18px Arial";
    	ctx.fillStyle="#0000ff";
    	ctx.fillText(progress+"%",100 - (ctx.measureText(progress+"%").width) / 2,100 + 6);
    	ctx.fill();
    	ctx.closePath();
    }
    
    //根据图片load进度条
    function loadingAsImgLength(){
    	
    		//创建Canvas
    		var c=document.getElementById("circleCanvas");
    		var ctx=c.getContext("2d");
    	
    	    var precent= -1;
        	var imglen = $('img').length;
            for(var i = 0; i < imglen; i++){
                var imgs = new Image();
                imgs.src = $('img').eq(i).attr("src");
                imgs.onload = function () {
                	precent= precent+=1;
                	var num = parseInt((precent/(imglen-1))*100);
                	var j  = num;
    				(function (j) {
    					setTimeout(function () {
    						//开始加载
    						drawCircleLoading(ctx,j);
    						console.log(j)
    		    			if(j>=100){
    		    				j = 100;
    		    				drawCircleLoading(ctx,j);
    		    				setTimeout(function(){
    		    					
    		    					//这里放加载结束后的操作代码
    		    					
    //		    					alert("over");
    		    					
                              		
    		    				},600)
    		    				return;
    		    			}
    		    		},j*20)
    					
    				})(j)
    
                }
            }
            
    }
    
    
    
    $(function(){
    	
    	loadingAsImgLength();
    	
    	
    })
    

      注意事项:请保证图片路径正确,并尽可能添加多的img标签来确保看到效果。

      最终实现的效果图:

        

    有人住高楼,有人处深沟。 有人光万丈,有人一生绣。 时光是匆匆,回首无旧梦。 人生若几何,凡尘事非多。 深情总遗却,妄自也洒脱。
  • 相关阅读:
    word批量打印工具,c#写的
    word添加页眉脚和设置各页不同的页眉页脚.
    打印机双面打印
    ORACLE OCP认证
    基于.net程序,使用cefsharp开发的打开网页工具,如何不加载图片
    在iis上运行的服务器端程序,运行一段时间后,访问都只出现一行乱码,回收进程池后又好了,求大神回复
    ArcGis API for JavaScript 开发笔记一 加载地图
    修改现有消息类让.net core项目支持Protobuf
    结合现有分布式系统的数据一致性思考
    让现有vue前端项目快速支持多语言
  • 原文地址:https://www.cnblogs.com/nanyang520/p/10060217.html
Copyright © 2011-2022 走看看