ReactSVG에 viewBox를 조작하는 애니메이션을 넣어본다.
애니메이션을 사용하는 방법
여러가지가 있겠지만, 찾은것은 다음과 같다.
애니매이션이 주가 아니므로 간단하게 애니메이션을 구현해보기 위해, GSAP을 사용해서 애니메이션을 구현해보기로 한다.
다음은 시도해본 코드의 일부이다.
svg.addEventListener('click', this.onClick.bind(this));
//중략 ...
onClick(event){
if(event.target.getAttribute('name'))
{
//console.log(event.target.getBoundingClientRect());
let rect = event.target.getBoundingClientRect();
this.current_viewbox.x = rect.top;
this.current_viewbox.y = rect.bottom;
this.current_viewbox.width = rect.width;
this.current_viewbox.height = rect.height;
this.animatingViewBox(event.target, this.current_viewbox.x, this.current_viewbox.y, this.current_viewbox.width, this.current_viewbox.height);
}
}
animatingViewBox(target, x,y,width,height){
gsap.to(target, {
duration: 1,
viewBox : `${x} ${y} ${width} ${height}`
});
}
상기 코드 실행결과 다음과 같은 로그가 남는다.
Invalid property viewBox set to 312.7962646484375 544.2816772460938 288.6868896484375 231.48541259765625 Missing plugin? gsap.registerPlugin()
상기 기재된 기능을 수행하기 위해서는 어떤 plugin이 필요한것 같다.
참고 링크 결과, CSSPlugin(DOM Element중 CSS와 관련된 프로퍼티와 관련된 플러그인)을 설치해보라고 한다.
따라서, 프로젝트의 상단(최우선으로 실행되는 초기화과정)에 다음을 기재한다.
gsap.registerPlugin(gsap.plugins.CSSPlugin);
TypeError: Cannot read properties of undefined (reading 'name')
=> 최종적으로, 다음과 같은 방식으로 구동 성공하였다.
animatingViewBox(target, x,y,width,height){
console.log("animating View Box...");
gsap.to(target, {
duration: 1,
attr: {viewBox: `${x} ${y} ${width} ${height}`},
ease: "power3.inOut"
});
}
오류원인은 이전의 이벤트 코드가 GSAP 2.0 버전에서 사용됐던 tweepMax와 혼용된 코드, 그리고 사용방법이 틀린 것에 있었다.
상기 수정을 해보았지만 결국 원하는 목표로는 되지 않는다.
target을 다음과 같이 수정해 본다.
onClick(event){
if(event.target.getAttribute('name'))
{
let rect = event.target.getBoundingClientRect();
this.current_viewbox.x = rect.top;
this.current_viewbox.y = rect.bottom;
this.current_viewbox.width = rect.width;
this.current_viewbox.height = rect.height;
this.animatingViewBox(this.svg, this.current_viewbox.x, this.current_viewbox.y, this.current_viewbox.width, this.current_viewbox.height);
}
}
수정한 내용은, element(event의 타깃)를 지정하는 것이 아니라 svg전체에 대하여 바꾼다.
최종적으로, 원하는 대로 된다!
좌표 설정이 완벽하지 않아 엉뚱한 곳을 가리키지만, 목표한 바를 수행하였다. 좌표를 수정하는 것으로 변경이 가능하다.
동작하지 않았던 원인은, viewBox는 svg파일 하나에 대응하는 것이지 단일 element에 대응하는 것이 아니었기 때문이다.