canvas实现点击指定切换元素的圆形弧线进度条动画效果
这是一个使用画布canvas做的通过点击元素实现弧线运动到指定位置的动画效果。实现原理和前面分享的《Canvas百分比动画进度条》教程一样,区别是增加了一个点击事件来传递参数使弧线动画运动到指定位置。思路很简单,代码也很简单。
HTML代码:
<div class="canvas"> <canvas id="circle" width="644" height="640"></canvas> </div> <div id="add">前进</div> <div id="del">后退</div>
JS代码:
var circle = document.getElementById('circle'), //获取canvas对象 context = circle.getContext('2d'), ////获取2d上下文 centerX = (circle.width-4)/2, //圆的X轴中心点 centerY = (circle.width-4)/2, //圆的Y轴中心点 lineWidth = '12', //圆框线的大小 radius=centerX-lineWidth/2, //圆的半径 rad = Math.PI*2/100, //圆周为360度,Math.PI是半弧180度,乘以2为一周360度,拆成100分,360度的百分之一 n=0, //从百分之n开始计算 dir=true, //判断方向 result = 26;//开起位置 var gradient = context.createLinearGradient(0, 0, circle.width-4, circle.height); //渐变 gradient.addColorStop(0, "#fff"); //渐变 gradient.addColorStop(0.45, "#c40c22"); //渐变 function whiteLine(){ //画一个底圆 context.save(); context.beginPath(); context.strokeStyle='#293742'; context.lineWidth=lineWidth; context.lineCap = 'round'; context.arc(centerX, centerY, radius, -Math.PI*0.67, Math.PI*0.62, false); //arc() 方法创建弧/曲线(用于创建圆或部分圆),参数自行去了解 context.stroke(); context.closePath(); context.restore(); } function redLine(n){ //画一个进度圆 context.save(); context.strokeStyle=gradient; context.lineWidth=lineWidth; context.lineCap = 'round'; context.beginPath(); context.arc(centerX, centerY, radius, -Math.PI*0.67, -Math.PI*0.67+rad*n, false); context.stroke(); context.closePath(); context.restore(); } function smallCircle(){ //圆边上的小圆 const circleX = centerX + Math.floor(Math.cos(rad*n-Math.PI*0.67) * radius);//圆的参数方程:x = a + cosθ * r(θ为参数) const circleY = centerY + Math.floor(Math.sin(rad*n-Math.PI*0.67) * radius);//圆的参数方程:y = b + sinθ * r (θ为参数) context.save(); context.beginPath(); context.strokeStyle='#49a1f4'; context.lineWidth='9'; context.lineCap = 'round'; context.fillStyle = '#fff'; context.fill(); context.arc(circleX, circleY, 7, 0, -Math.PI*2, false); context.stroke(); context.closePath(); context.restore(); } ;(function drawLine(){ var req; context.clearRect(0,0,circle.width,circle.height); whiteLine(); redLine(n); smallCircle(); if(dir){ if(n<result){ n = n + 1; req = requestAnimationFrame(drawLine); }else{ n=result; cancelAnimationFrame(req); } }else{ if(n>result){ n = n - 1; req = requestAnimationFrame(drawLine); }else{ n=result; cancelAnimationFrame(req); } } document.getElementById('add').onclick=function(){ result = result < 66 ? result + 10 : result; dir = true; drawLine(); } document.getElementById('del').onclick=function(){ result = result > 16 ? result - 10 : result; dir = false; drawLine(); } })();
Canvas arc() 方法
中心:arc(100,75,50,0*Math.PI,1.5*Math.PI)
起始角:arc(100,75,50,0,1.5*Math.PI)
结束角:arc(100,75,50,0*Math.PI,1.5*Math.PI)
示例:比如 2*Math.PI
结束点就是开始点。如果开始角想在结束角的位置,可以用 -Math.PI * 0.5