[SVG] 애니메이션

Lpla

·

2021. 2. 27. 22:35

반응형

SVG

SVG로 애니메이션 효과를 만들어보도록 하겠다.

내가 원하는 결과물은 아래와 같다.

 

 

먼저 svg파일을 다운받거나 만들어야 한다.

나는 일러스트레이터 패스툴로 금방 그렸다.

 

pulse.svg
0.00MB

 

HTML

<body>
  <div class="pulse_con">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1395 630">
      <defs>
        <style>
          .cls-1 {
            fill: none;
            stroke: #231f20;
            stroke-linejoin: round;
            stroke-width: 10px;
          }
        </style>
      </defs>
      <title>Asset 2</title>
      <g id="Layer_2" data-name="Layer 2">
        <g id="Layer_1-2" data-name="Layer 1">
          <polyline class="cls-1" points="0 312.85 170 312.85 210 288 262 331 298 277 321 625 359 5 404 341 447 278 480 312.85 681 312.85 720.33 286 759 349 796 281 826 625 861 5 909 341 945 273 979 312.85 1395 312.85" />
        </g>
      </g>
    </svg>
  </div>
</body>

먼저 svg를 HTML에 붙여넣는다.

코드가 길지만 결국에 선을 나타내는 건 <polyline class="cls-1" .... /> 이다.

<g ....>는 그룹(group)의 약자로 여기선 사용할 일이 없으므로 지워도 상관 없다.

 

Polyline, Path

Polyline과 Path는 큰 차이가 없다. 곡선을 나타낼 때 Polyline이 Path보다 더 많은 개수가 사용된다고 하나 크게 의미 없다.

혹시라도 polyline를 path로 바꿔 쓰고 싶다면 아래처럼 코드를 수정하면 된다.

 

<path class="cls-1" d="M0 312.85 170 .... />

 

만약 svg의 마지막 지점과 처음 지점을 연결해야 한다면 마지막에 z를 추가한다.

 

<path class="cls-1" d="M0 312.85 170 .... 312.85z />

 

지금은 마지막과 처음을 연결할 일이 없으므로 사용하지 않는다.

어디까지나 설명을 위해서 언급한 내용이며 나는 Polyline을 쓰겠다.

 

애니메이션 효과

stroke-dasharray는 SVG의 점선을 만들어주는 코드다.

 

(좌) stroke-dasharray: 10, (우) stroke-dasharray: 100
(좌) stroke-dasharray: 1000, (우) stroke-dasharray: 10000

stroke-dasharray가 10이면 시작지점부터 10까지 점선을 만들고 10만큼 간격을 띄운 후 다시 점선을 만든다.

 

 

stroke-dashoffset은 SVG은 stroke-dasharray의 시작 지점을 정하는 코드다.

 

(좌) stroke-dashoffset: 0, (우) stroke-dashoffset: 100
stroke-dashoffset: 100, @keyframes dash { to { stroke-dashoffset: 0; }}

특이한 점이라면 0으로 향해야 앞으로 가는 애니메이션 효과가 있다.

이 부분은 개발자도구로 직접 수치를 조절해보면서 감을 익히는 것이 좋다.

 

길이 계산

이제 우리는 svg의 총 길이를 구해야 한다.

다행히 자바스크립트의 힘을 빌려 쉽게 구할 수 있다.

 

JavaScript

var myPath = document.querySelector("path");
var length = myPath.getTotalLength();
console.log(length);

// 4033.64599609375

반올림해서 svg의 총 길이는 4034이다.

 

CSS

stroke-dasharray: 4034 를 입력하면 전체 길이의 점선이 만들어진다.

그리고 stroke-dashoffset: 4034 에서 0으로 향하는 키프레임을 추가하면 앞으로 선이 이동하는 효과가 나타난다.

 

body {
  background: #dedede;
}

.cls-1 { stroke-dasharray: 4034; stroke-dashoffset: 4034; animation: dash 3s linear infinite; }

@keyframes dash {
  to {
    stroke-dashoffset: 0;
  }
}

 

 

만약 stroke-dashoffset을 총길이의 2배로 하면 나타났다 사라지는 효과가 된다.

 

 

반응형