$('.canvas').each(function(){// 퍼센트를 표시할 요소 선택
constspanpercent=$(this).siblings('.percent');// 원의 테두리 너비(px) 및 애니메이션 지속 시간(ms) 정의
constborder=20;constduration=700;// 캔버스 및 2D 컨텍스트 설정
constcanvas=$(this)[0];constctx=canvas.getContext('2d');// 애니메이션에 필요한 변수 및 데이터 속성에서 목표 퍼센트 가져오기
consttargetPercent=$(this).data('percent');constposX=canvas.width/2;constposY=canvas.height/2;constonePercent=360/100;constresult=onePercent*targetPercent;constradius=(canvas.width/2)-(border/2);letpercent=0;ctx.lineCap=(targetPercent<=0)?'butt':'round';// 원을 그리고 퍼센트 업데이트하는 함수
functionarcMove(){letdegrees=0;letstartTime=null;// 애니메이션을 처리하는 함수
functionanimate(timestamp){if(!startTime)startTime=timestamp;letprogress=(timestamp-startTime)/duration;progress=Math.min(1,progress);degrees=progress*result;// 캔버스 초기화 및 퍼센트 업데이트
ctx.clearRect(0,0,canvas.width,canvas.height);percent=Math.floor(degrees/onePercent);spanpercent.text(percent);// 배경 선 그리기
ctx.beginPath();ctx.arc(posX,posY,radius,0,Math.PI*2);ctx.strokeStyle='#b1b1b1';ctx.lineWidth=border;ctx.stroke();// 애니메이션 되는 선 그리기
ctx.beginPath();ctx.strokeStyle='#3949AB';ctx.lineWidth=border;ctx.arc(posX,posY,radius,Math.PI*-0.5,(Math.PI/180)*degrees-(Math.PI/2));ctx.stroke();// 애니메이션이 완료되지 않았다면 계속해서 프레임 요청
if(progress<1){requestAnimationFrame(animate);}}// 첫 프레임 요청
requestAnimationFrame(animate);}// 애니메이션 함수 호출
arcMove();});
jQuery 선택자 및 변수 선언
canvas 클래스를 가진 모든 캔버스 태그를 선택하고 each 함수를 사용하여 각각의 캔버스에 대해 반복작업을 수행합니다.
spanpercent 변수는 해당 캔버스 요소와 관련된 퍼센트 값을 표시할 요소를 선택합니다.
border 변수는 원 프로그레스바의 테두리 너비를 정의하고, duration 변수는 애니메이션 지속 시간을 정합니다.
캔버스 및 컨텍스트 설정
각 캔버스 요소에 대해 JavaScript 렌더링 컨텍스트를 가져옵니다.
targetPercent 변수는 캔버스 요소의 data-percent 속성 값을 읽어 들여 목표 퍼센트로 설정합니다.
arcMove 함수
주 함수로, 원형 프로그레스바의 애니메이션을 실행하는 역할을 합니다.
animate(timestamp) 함수
애니메이션 프레임마다 호출되는 콜백 함수입니다.
startTime 변수를 활용하여 각 프레임에서 경과한 시간을 계산합니다.
progress 변수를 통해 애니메이션의 현재 진행률을 나타냅니다.
degrees 변수를 사용하여 진행률에 비례하는 각도를 계산합니다.
캔버스를 프레임마다 초기화하여 원형 프로그레스바를 지웁니다.
percent 변수에 현재 degrees 값에서 계산된 퍼센트 값을 저장하고, 화면에 표시된 텍스트를 업데이트합니다.
캔버스 초기화
ctx.clearRect(0, 0, canvas.width, canvas.height)를 이용하여 캔버스를 프레임마다 초기화합니다.
프로그레스바 업데이트
이전 원형 프로그레스바의 배경 선(회색)을 그립니다.
애니메이션 되는 프로그레스바(파란색)를 그립니다.
파란색 선의 시작 각도는 -90도(Math.PI * -0.5)입니다(시계 12시 방향부터 시작).
ctx.arc() 메서드의 마지막 인자에 의해, 진행률에 따라 서서히 원이 그려지게 됩니다.
애니메이션 프레임 요청
애니메이션 진행률이 1 미만일 때까지 계속해서 requestAnimationFrame(animate)를 호출하여 애니메이션이 완료될 때까지 반복합니다.
결론
jQuery와 HTML5의 캔버스를 활용하여 원형 프로그레스바와 애니메이션을 구현하는 방법을 설명했습니다. 캔버스를 활용하여 동적인 퍼센트 표시 및 부드러운 애니메이션을 통해 진행 상황을 시각적으로 표현할 수 있습니다.