728x90
반응형
SVG
- Scalable Vector Graphics의 약자로, 웹에서 벡터 그래픽을 그리기 위해 사용되는 XML 기반의 태그입니다.
- HTML 안에서 사용될 수 있으며, 해상도에 상관없이 깨지지 않는 장점이 있어 아이콘, 로고, 차트, 도형 등을 표현할 때 유용합니다.
- svg를 이용할 때의 장점
- 해상도에 독립적이다.
- 픽셀로 그리는 게 아니라 수학적인 벡터 좌표로 그려져서 고해상도 디스플레이에서도 깨지지 않습니다.
- 로고, 아이콘, 일러스트 등에 딱 좋아요.
- CSS 및 JavaScript로 조작 가능
- SVG 내부 요소는 DOM 요소처럼 접근 가능해서 스타일 변경, 애니메이션, 이벤트 처리 가능합니다.
- 애니메이션 및 인터랙티브 요소 구현이 가능합니다.
- <animate>, <animateTransform> 같은 SVG 자체 애니메이션 지원합니다.
- JavaScript나 CSS와 결합하면 다이내믹한 UI 제작 가능합니다.
- 검색 엔진 및 접근성 측면에서도 유리
- 텍스트를 포함할 수 있어서 검색 가능하고, 스크린 리더로도 읽을 수 있습니다.
- 해상도에 독립적이다.
- svg를 이용할 때의 단점
- 복잡한 이미지는 비효율적입니다.
- 사진처럼 디테일이 많고 복잡한 이미지를 SVG로 표현하면 오히려 파일 크기가 커지고 성능이 떨어질 수 있습니다. 이런 경우는 png, webp, jpeg를 사용하는 것이 더 좋습니다.
- 브라우저 렌더링 부담
- SVG에 복잡한 필터나 많은 요소가 들어가면 브라우저 렌더링 성능 저하가 발생할 수 있습니다.
- 특히, 모바일에서 부하가 클 수 있습니다.
- 보안 이슈
- SVG 내부에 JavaScript 삽입이 가능하기 때문에, 외부 SVG 파일을 직접 임포트 할 경우 XSS(크로스 사이트 스크립팅) 공격 가능성이 있습니다.
- 안전한 콘텐츠만 삽입하거나 <img> 태그로만 표시하는 방식 추천합니다.
- 복잡한 이미지는 비효율적입니다.
animate
- SVG 속성 값을 시간에 따라 변화시키는 태그
- 속성
- attributeName : 애니메이션 할 속성 이름 (ex: fill, x, r)
- from, to : 시작 값과 끝 값
- dur : 애니메이션 지속 시간 (s, ms)
- repeatCount : 반복 횟수 ("indefinite"는 무한 반복)
- begin : 언제 애니메이션 시작할지 ("0s", "click", "mouseover" 등)
<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">
<rect width="10" height="10">
<animate
attributeName="rx"
values="0;5;0"
dur="10s"
repeatCount="indefinite" />
</rect>
</svg>
animateTransform
- transform 속성(회전, 이동, 확대 등)에 애니메이션 적용
- 속성
- attributeName="transform" 고정
- type: 어떤 종류의 변형? (translate, rotate, scale, skewX, skewY)
- from, to: 변형 시작값과 끝값
- dur : 애니메이션 지속 시간 (s, ms)
- repeatCount : 반복 횟수 ("indefinite"는 무한 반복)
- begin : 언제 애니메이션 시작할지 ("0s", "click", "mouseover" 등)
animateMotion
- 경로(path)를 따라 요소를 움직이게 함
- 속성
- path: 이동 경로 지정 (M, L, C 등의 path 명령어 사용) 또는 mpath으로 참조 가능
- dur: 시간
- repeatCount: 반복 여부
- rotate="auto": 경로의 방향에 따라 자동 회전
<svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
<path
id="path1"
fill="none"
stroke="lightgrey"
d="M20,50 C20,-50 180,150 180,50 C180-50 20,150 20,50 z" />
<circle r="5" fill="red">
<animateMotion
dur="10s"
repeatCount="indefinite">
<mpath href="#path1" />
</animateMotion>
</circle>
</svg>
샘플 예제
<svg width="360" viewBox="0 0 240 240">
<defs>
<path
id="path1"
d="M180.3,103.7C193.9,145.6,69.7,179.9,60,137C46.3,95.1,170.5,60.7,180.3,103.7z"
/>
<path
id="path2"
d="M113.5,89.1c79.8-2.3,101.5,66.1,14.4,66.8C48.1,158.4,26.4,90,113.5,89.1z"
/>
<path
id="path3"
d="M169.1,123.5c-11.9,44-126.5,79.8-98.2-6.9C82.8,72.6,197.4,36.8,169.1,123.5z"
/>
<path
id="path4"
d="M59.8,136.3C46.2,94.4,170.4,60.1,180.1,103C193.8,144.9,69.6,179.3,59.8,136.3z"
/>
<path
id="path5"
d="M126.6,150.9c-79.8,2.3-101.5-66.1-14.4-66.8C192,81.6,213.7,150,126.6,150.9z"
/>
<path
id="path6"
d="M71,116.5c11.9-44,126.5-79.8,98.2,6.9C157.3,167.4,42.7,203.2,71,116.5z"
/>
</defs>
<path
fill="none"
stroke="#7d93b1"
stroke-width="5"
d="M160,120c0,22.1-17.9,40-40,40s-40-17.9-40-40"
/>
<g fill="#7d93b1">
<circle r="9">
<animateMotion dur="3s" repeatCount="indefinite">
<mpath xlink:href="#path1" />
</animateMotion>
</circle>
<circle r="8">
<animateMotion dur="3s" repeatCount="indefinite">
<mpath xlink:href="#path2" />
</animateMotion>
</circle>
<circle r="5">
<animateMotion dur="3s" repeatCount="indefinite">
<mpath xlink:href="#path3" />
</animateMotion>
</circle>
<circle r="9">
<animateMotion dur="3s" repeatCount="indefinite">
<mpath xlink:href="#path4" />
</animateMotion>
</circle>
<circle r="7">
<animateMotion dur="3s" repeatCount="indefinite">
<mpath xlink:href="#path5" />
</animateMotion>
</circle>
<circle r="6">
<animateMotion dur="3s" repeatCount="indefinite">
<mpath xlink:href="#path6" />
</animateMotion>
</circle>
</g>
<path
fill="#fff"
stroke="#7d93b1"
stroke-width="5"
d="M80,120c0-22.1,17.9-40,40-40s40,17.9,40,40"
/>
</svg>
728x90
반응형
'web' 카테고리의 다른 글
Lighthouse / Web Vitals (0) | 2025.04.23 |
---|---|
SVG 태그 정리 (0) | 2025.04.23 |
Local Storage / Session Storage / Cookies / IndexedDB (0) | 2025.04.19 |