はい、そのためにキャンバスを使用しています。出発点は次のとおりです。
var c = document.getElementById('c').getContext('2d');
var duration = 700; // duration of animation
var delay = 10; // interval
var stepT = duration/delay; // steps needed
var cT = 0; // step counter
c.fillStyle = 'white'
var end = 58; // endpoint in percent
var int = setInterval(function(){
c.fillRect(0,0,100,100);
c.strokeStyle = 'orange';
c.beginPath();
c.arc(50, 50, 40, -.5*Math.PI, (-.5*Math.PI + 2*Math.PI / 100 * end * cT / stepT));
c.lineWidth = 10;
c.stroke();
if(++cT>stepT){
clearInterval(int);
}
},delay);
デモ: http://jsfiddle.net/SCk6B/
複数の円を含むバージョン 2:
<canvas class="circle" data-duration="700" data-end="75" width="100" height="100"></canvas>
<canvas class="circle" data-duration="200" data-end="50" width="100" height="100"></canvas>
<canvas class="circle" data-duration="500" data-end="20" width="100" height="100"></canvas>
$('.circle').each(function(){
var duration = $(this).data('duration') || 700; // duration of animation
var delay = 10; // interval
var stepT = duration/delay; // steps needed
var cT = 0; // step countervar
var end = $(this).data('end') || 58; // endpoint in percent
var int = null;
var c = this.getContext('2d');
c.fillStyle = 'white';
c.lineWidth = 10;
c.strokeStyle = 'orange';
$(this).bind('mouseenter',function(){
int = setInterval(function(){
c.fillRect(0,0,100,100);
c.beginPath();
c.arc(50, 50, 40, -.5*Math.PI, (-.5*Math.PI + 2*Math.PI / 100 * end * cT / stepT));
c.stroke();
if(++cT>stepT){
clearInterval(int);
}
},delay);
}).bind('mouseleave',function(){
clearInterval(int);
c.fillRect(0,0,100,100);
cT=0;
});
});
http://jsfiddle.net/t3BPP/