여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. HTML 그래픽 - SVG 변형

HTML 그래픽 – SVG 변형

2주전 작성

SVG 변형(Transformations)

SVG 변형 소개

SVG 변형은 SVG 요소의 위치, 크기, 회전 및 기울기를 변경하는 데 사용된다. SVG는 다양한 종류의 변형을 지원한다.

SVG 변형 종류

SVG에서 사용할 수 있는 변형 함수는 다음과 같다.

  • translate(x,y) – 요소를 이동시킨다
  • rotate(angle,cx,cy) – 요소를 회전시킨다
  • scale(x,y) – 요소의 크기를 조절한다
  • skewX(angle) – X축을 따라 요소를 기울인다
  • skewY(angle) – Y축을 따라 요소를 기울인다
  • matrix(a,b,c,d,e,f) – 사용자 정의 변형 행렬을 정의한다

SVG 요소의 변형을 위해서는 transform 속성을 사용한다.

SVG translate

translate() 함수는 요소를 현재 위치에서 지정된 양만큼 이동시킨다.

<svg height="200" width="250" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="100" height="100" fill="blue" />
<rect x="0" y="0" width="100" height="100" transform="translate(50,50)" fill="red" opacity="0.5" />
</svg>

코드 설명:

  • 첫 번째 사각형은 기본 위치(0,0)에 파란색으로 그려진다.
  • 두 번째 사각형은 translate(50,50) 변형이 적용되어 오른쪽으로 50px, 아래로 50px 이동한다.
  • 두 번째 사각형은 opacity 속성으로 반투명하게 표시되어 두 사각형의 겹침을 볼 수 있다.

SVG rotate

rotate() 함수는 요소를 지정된 각도만큼 회전시킨다. 기본적으로 원점(0,0)을 중심으로 회전하지만, 선택적으로 회전 중심점을 지정할 수 있다.

<svg height="120" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="80" height="50" fill="blue" />
<rect x="20" y="20" width="80" height="50" transform="rotate(30)" fill="red" opacity="0.5" />
</svg>

지정된 중심점을 기준으로 회전:

<svg height="120" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="80" height="50" fill="blue" />
<rect x="20" y="20" width="80" height="50" transform="rotate(30 60 45)" fill="red" opacity="0.5" />
</svg>

코드 설명:

  • 첫 번째 예제에서는 원점(0,0)을 기준으로 30도 회전한다.
  • 두 번째 예제에서는 좌표 (60,45)를 기준으로 30도 회전한다.
  • 회전 각도는 시계 방향으로 적용된다.

SVG scale

scale() 함수는 요소의 크기를 변경한다. 이 함수는 X축과 Y축 방향으로 각각 다른 비율로 크기를 조절할 수 있다.

<svg height="200" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="60" height="40" fill="blue" />
<rect x="20" y="20" width="60" height="40" transform="scale(2)" fill="red" opacity="0.5" />
</svg>

X축과 Y축에 대해 다른 비율로 크기 조절:

<svg height="200" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="60" height="40" fill="blue" />
<rect x="20" y="20" width="60" height="40" transform="scale(1.5,3)" fill="red" opacity="0.5" />
</svg>

코드 설명:

  • 첫 번째 예제에서는 X와 Y 모두 2배로 확대한다.
  • 두 번째 예제에서는 X 방향으로 1.5배, Y 방향으로 3배 확대한다.
  • scale 변형은 요소의 위치도 함께 변경한다. 예를 들어, 좌표 (20,20)도 함께 확대된다.

SVG skew

skewX()와 skewY() 함수는 각각 X축과 Y축을 기준으로 요소를 기울인다.

<svg height="200" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="80" height="50" fill="blue" />
<rect x="20" y="20" width="80" height="50" transform="skewX(30)" fill="red" opacity="0.5" />
</svg>

<svg height="250" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="80" height="50" fill="blue" />
<rect x="20" y="20" width="80" height="50" transform="skewY(30)" fill="red" opacity="0.5" />
</svg>

코드 설명:

  • skewX(30)은 X축 방향으로 30도 기울인다.
  • skewY(30)은 Y축 방향으로 30도 기울인다.

SVG 다중 변형

여러 변형을 동시에 적용하려면 transform 속성 내에 공백으로 구분하여 함수들을 나열한다. 변형은 오른쪽에서 왼쪽 순서로 적용된다.

<svg height="200" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="60" height="40" fill="blue" />
<rect x="20" y="20" width="60" height="40" transform="translate(60,60) rotate(30) scale(1.5)" fill="red" opacity="0.5" />
</svg>

코드 설명:

  • 위 변형은 다음 순서로 적용된다: 먼저 1.5배 확대, 그 다음 30도 회전, 마지막으로 (60,60) 만큼 이동한다.
  • 변형 순서는 결과에 큰 영향을 미친다.

SVG matrix() 변형

matrix() 함수는 모든 2D 변형을 하나의 변형 행렬로 결합할 수 있는 강력한 방법을 제공한다. 이 함수는 6개의 매개변수 (a,b,c,d,e,f)를 사용한다.

<svg height="200" width="300" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="60" height="40" fill="blue" />
<rect x="20" y="20" width="60" height="40" transform="matrix(1,0.5,0.5,1,50,50)" fill="red" opacity="0.5" />
</svg>

코드 설명:

matrix(a,b,c,d,e,f) 함수는 다음 행렬 연산에 해당한다.

| a c e |   | x |   | ax + cy + e |
| b d f | * | y | = | bx + dy + f |
| 0 0 1 |   | 1 |   |      1      |

여기서:

  • a와 d는 X축과 Y축의 크기 조절을 담당한다.
  • b와 c는 X축과 Y축의 기울기를 담당한다.
  • e와 f는 X축과 Y축의 이동을 담당한다.

SVG transform 속성과 사용법

변형 함수 설명 매개변수
translate(x,y) 요소를 X축과 Y축을 따라 이동시킨다. x – X축 이동량
y – Y축 이동량 (생략 시 0)
rotate(angle, cx, cy) 지정된 각도만큼 요소를 회전시킨다. angle – 회전 각도(도)
cx, cy – 회전 중심점 (생략 시 (0,0))
scale(x,y) 요소의 크기를 조절한다. x – X축 배율
y – Y축 배율 (생략 시 x와 동일)
skewX(angle) X축을 따라 요소를 기울인다. angle – 기울기 각도(도)
skewY(angle) Y축을 따라 요소를 기울인다. angle – 기울기 각도(도)
matrix(a,b,c,d,e,f) 사용자 정의 변형 행렬을 적용한다. a,b,c,d,e,f – 2D 변형 행렬 값

SVG viewBox와 변형

SVG의 viewBox 속성은 SVG 캔버스의 특정 영역을 확대하거나 축소하는 방법을 제공한다. 이것은 viewport 내에서 SVG 요소가 어떻게 보여질지 결정한다.

<svg width="300" height="100" viewBox="0 0 150 50" xmlns="http://www.w3.org/2000/svg">
<rect x="10" y="10" width="50" height="30" fill="blue" />
<rect x="80" y="10" width="50" height="30" fill="green" />
</svg>

코드 설명:

  • viewBox=”0 0 150 50″은 왼쪽 상단 좌표 (0,0)에서 시작하여 너비 150, 높이 50인 영역을 정의한다.
  • 이 viewBox는 width=”300″ height=”100″인 SVG 캔버스에 맞게 자동으로 확장된다.
  • 따라서 모든 내용이 2배로 확대되어 보인다.

 

viewBox와 transform을 함께 사용하면 복잡한 확대/축소 및 패닝 효과를 만들 수 있다.

 

💡 SVG 변형 활용 팁:
• transform-origin을 CSS로 설정하여 더 유연한 변형 기준점을 정의할 수 있다
• SVG 애니메이션에 변형을 활용하여 동적 효과 생성
• viewBox와 변형을 조합하여 SVG 요소의 반응형 동작 구현
• 변형 순서에 주의하라 – 순서를 바꾸면 결과가 크게 달라질 수 있다
• 변형 계산을 단순화하기 위해 그룹(<g>)을 활용하라

참고
Mingg`s Diary
밍구
공부 목적 블로그