Javascript HTML5画布在悬停状态下重新绘制
我有三个弧,第一个在页面加载时加载,第二个在鼠标悬停时加载,第三个在鼠标悬停时加载。我希望鼠标移动效果每次都发生,而不是像现在这样只发生一次 这是小提琴: 以下是JS代码:Javascript HTML5画布在悬停状态下重新绘制,javascript,html,css,html5-canvas,Javascript,Html,Css,Html5 Canvas,我有三个弧,第一个在页面加载时加载,第二个在鼠标悬停时加载,第三个在鼠标悬停时加载。我希望鼠标移动效果每次都发生,而不是像现在这样只发生一次 这是小提琴: 以下是JS代码: var currentEndAngle = 0; var currentStartAngle = 0; var currentEndAngle2 = 0; var currentStartAngle2 = 0; var currentEndAngle3 = -0.5; va
var currentEndAngle = 0;
var currentStartAngle = 0;
var currentEndAngle2 = 0;
var currentStartAngle2 = 0;
var currentEndAngle3 = -0.5;
var currentStartAngle3 = -0.5;
var something = setInterval(draw, 5);
$("#canvas1").hover(
function(){
var something2 = setInterval(draw2, 5);
},
function(){
var something3 = setInterval(draw3, 5);
}
);
function draw() { /***************/
var can = document.getElementById('canvas1'); // GET LE CANVAS
var canvas = document.getElementById("canvas1");
var context = canvas.getContext("2d");
var x = canvas.width / 2;
var y = canvas.height / 2;
var radius;
var width;
var currentColor = "#00b5ff";
var radius = 100;
var width = 8;
var startAngle = currentStartAngle * Math.PI;
var endAngle = (currentEndAngle) * Math.PI;
if(currentEndAngle < 0.1){
currentEndAngle = currentEndAngle - 0.01;
}
if (currentEndAngle < -0.5){
clearInterval(something);
}
context.beginPath();
context.arc(x, y, radius, startAngle, endAngle, true);
context.lineWidth = width;
// line color
context.strokeStyle = currentColor;
context.stroke();
/************************************************/
}
function draw2() { /***************/
var can = document.getElementById('canvas1'); // GET LE CANVAS
var canvas = document.getElementById("canvas1");
var context = canvas.getContext("2d");
var x = canvas.width / 2;
var y = canvas.height / 2;
var radius;
var width;
var currentColor = "#000";
var radius = 100;
var width = 7;
var startAngle = currentStartAngle2 * Math.PI;
var endAngle = (currentEndAngle2) * Math.PI;
if(currentEndAngle2 < 0.1){
currentEndAngle2 = currentEndAngle2 - 0.01;
}
if (currentEndAngle2 < -0.55){
clearInterval(something2);
}
context.beginPath();
context.arc(x, y, radius, startAngle, endAngle, true);
context.lineWidth = width;
// line color
context.strokeStyle = currentColor;
context.stroke();
/*
context.beginPath();
context.clearRect ( 0 , 0 , 400 , 400 );
context.stroke():
/************************************************/
}
function draw3() { /***************/
var can = document.getElementById('canvas1'); // GET LE CANVAS
var canvas = document.getElementById("canvas1");
var context = canvas.getContext("2d");
var x = canvas.width / 2;
var y = canvas.height / 2;
var radius;
var width;
var currentColor = "#00b5ff";
var radius = 100;
var width = 8;
var startAngle = currentStartAngle3 * Math.PI;
var endAngle = (currentEndAngle3) * Math.PI;
if(currentEndAngle3 < 0){
currentEndAngle3 = currentEndAngle3 + 0.01;
}
if (currentEndAngle3 > 0){
clearInterval(something3);
}
context.beginPath();
context.arc(x, y, radius, startAngle, endAngle, false);
context.lineWidth = width;
// line color
context.strokeStyle = currentColor;
context.stroke();
/************************************************/
}
var currentEndAngle=0;
var currentStartAngle=0;
var currentEndAngle2=0;
var currentStartAngle2=0;
var currentEndAngle3=-0.5;
var currentStartAngle3=-0.5;
var something=设定间隔(图5);
$(“#canvas1”)。悬停(
函数(){
var something2=设定间隔(图2,5);
},
函数(){
var something3=设定间隔(图3,5);
}
);
函数draw(){/***************/
var can=document.getElementById('canvas1');//获取画布
var canvas=document.getElementById(“canvas1”);
var context=canvas.getContext(“2d”);
var x=画布宽度/2;
变量y=画布高度/2;
变异半径;
var宽度;
var currentColor=“#00b5ff”;
var半径=100;
var宽度=8;
var startAngle=currentStartAngle*Math.PI;
var endAngle=(currentEndAngle)*Math.PI;
如果(currentEndAngle<0.1){
currentEndAngle=currentEndAngle-0.01;
}
如果(currentEndAngle<-0.5){
间隙(某物);
}
context.beginPath();
弧(x,y,半径,星形,端角,真);
context.lineWidth=宽度;
//线条颜色
context.strokeStyle=currentColor;
stroke();
/************************************************/
}
函数draw2(){/***************/
var can=document.getElementById('canvas1');//获取画布
var canvas=document.getElementById(“canvas1”);
var context=canvas.getContext(“2d”);
var x=画布宽度/2;
变量y=画布高度/2;
变异半径;
var宽度;
var currentColor=“#000”;
var半径=100;
var宽度=7;
var startAngle=currentStartAngle2*Math.PI;
var endAngle=(currentEndAngle2)*Math.PI;
如果(currentEndAngle2<0.1){
currentEndAngle2=currentEndAngle2-0.01;
}
如果(currentEndAngle2<-0.55){
净空间隔(某物2);
}
context.beginPath();
弧(x,y,半径,星形,端角,真);
context.lineWidth=宽度;
//线条颜色
context.strokeStyle=currentColor;
stroke();
/*
context.beginPath();
context.clearRect(0,040400);
context.stroke():
/************************************************/
}
函数draw3(){/***************/
var can=document.getElementById('canvas1');//获取画布
var canvas=document.getElementById(“canvas1”);
var context=canvas.getContext(“2d”);
var x=画布宽度/2;
变量y=画布高度/2;
变异半径;
var宽度;
var currentColor=“#00b5ff”;
var半径=100;
var宽度=8;
var startAngle=currentStartAngle3*Math.PI;
var endAngle=(currentEndAngle3)*Math.PI;
如果(currentEndAngle3<0){
currentEndAngle3=currentEndAngle3+0.01;
}
如果(currentEndAngle3>0){
净空间隔(某物3);
}
context.beginPath();
弧(x,y,半径,星形,端角,假);
context.lineWidth=宽度;
//线条颜色
context.strokeStyle=currentColor;
stroke();
/************************************************/
}
代码说明:有三个函数draw(),draw2(),draw3()-draw在页面加载时运行,它绘制一条蓝色圆弧,当鼠标悬停并绘制一条黑线时执行draw2(),当鼠标悬停时运行draw3
显示我在单个画布上绘制它们并单独清除它们,或者是否有方法完成此操作?这里有一种方法: 演示: 定义圆弧对象
var arc={
cx:canvas.width/2,
cy:canvas.height/2,
radius:100,
startRadians:0,
endRadians:-Math.PI/2,
linewidth:8,
animationPercent:0,
animationRate:10,
animationDirection:0,
};
function drawArc(arc,color){
var rStart=arc.startRadians;
var rEnd=arc.endRadians;
if(!arc.animationDirection==0){
if(arc.animationDirection>0){
rEnd=arc.animationPercent/100*(rEnd-rStart);
}else{
rEnd=(100-arc.animationPercent)/100*(rEnd-rStart);
}
}
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.beginPath();
ctx.arc(arc.cx,arc.cy,arc.radius,rStart,rEnd,true);
ctx.strokeStyle=color;
ctx.stroke();
}
基于动画点绘制一部分圆弧
var arc={
cx:canvas.width/2,
cy:canvas.height/2,
radius:100,
startRadians:0,
endRadians:-Math.PI/2,
linewidth:8,
animationPercent:0,
animationRate:10,
animationDirection:0,
};
function drawArc(arc,color){
var rStart=arc.startRadians;
var rEnd=arc.endRadians;
if(!arc.animationDirection==0){
if(arc.animationDirection>0){
rEnd=arc.animationPercent/100*(rEnd-rStart);
}else{
rEnd=(100-arc.animationPercent)/100*(rEnd-rStart);
}
}
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.beginPath();
ctx.arc(arc.cx,arc.cy,arc.radius,rStart,rEnd,true);
ctx.strokeStyle=color;
ctx.stroke();
}
设置圆弧部分的动画
function animate(time){
if(continueAnimation){RAF=requestAnimationFrame(animate);}
drawArc(arc,"blue");
arc.animationPercent+=arc.animationRate;
if(arc.animationPercent>=100){
continueAnimation=false;
}
}
$("#canvas").hover(
function(){
cancelAnimationFrame(RAF);
arc.animationPercent=0;
arc.animationDirection=1;
continueAnimation=true;
requestAnimationFrame(animate);
},
function(){
cancelAnimationFrame(RAF);
arc.animationPercent=0;
arc.animationDirection=-1;
continueAnimation=true;
requestAnimationFrame(animate);
}
);
通过绘制或取消绘制圆弧对悬停事件作出反应
function animate(time){
if(continueAnimation){RAF=requestAnimationFrame(animate);}
drawArc(arc,"blue");
arc.animationPercent+=arc.animationRate;
if(arc.animationPercent>=100){
continueAnimation=false;
}
}
$("#canvas").hover(
function(){
cancelAnimationFrame(RAF);
arc.animationPercent=0;
arc.animationDirection=1;
continueAnimation=true;
requestAnimationFrame(animate);
},
function(){
cancelAnimationFrame(RAF);
arc.animationPercent=0;
arc.animationDirection=-1;
continueAnimation=true;
requestAnimationFrame(animate);
}
);
markE,谢谢你,这是非常接近的,当悬停发生时,底部弧线消失/flickrs,我们能以某种方式消除它吗?当然,只需向弧线添加一个minRadians属性,然后添加一个if()语句,确保arc.endRadians永远不会低于arc.minRadians。祝你的项目好运!