基于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{
	width:100%;
	height:100%;
	overflow: hidden;
}


.periphery{
	width: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标签来确保看到效果。

  最终实现的效果图:

    

猜你喜欢

转载自www.cnblogs.com/nanyang520/p/10060217.html