SVG
SVG(Scalable Vector Graphics)란 XML 기반의 벡터 그래픽 형식으로, 웹 페이지와 어플리케이션에서 벡터 기반의 그래픽을 표현하기 위해 사용됩니다. HTML이 헤더, 표와 같은 요소를 제공하는 거처럼 SVG는 원, 사각형, 곡선 등을 그릴 수 있는 요소를 제공합니다.
SVG 장점
SVG는 이미지가 아니기 때문에 크기를 조절하여도 이미지가 깨지지 않습니다. 또한 간단한 이미지 같은 경우 JPG나 PNG 같은 비트맵 파일에 비해 크기가 작습니다. 이러한 이유로 아이콘이나 로고에 많이 쓰입니다. 이미지 뿐만 아니라 JS와 CSS와 결합하여 애니메이션을 만들 수 있고, 차트와 그래프를 표현하여 데이터도 시각화할 수 있습니다.
SVG 사용법
SVG 시작
<svg> 태그를 먼저 작성해줍니다. 속성으로는 width와 height가 있으며 SVG 이미지의 너비와 높이를 지정하는 속성입니다. 단위는 px 또는 상대적인 비율로 값을 설정할 수 있습니다.
<svg width="1600" height="900" >
<!-- SVG 그래픽 요소 -->
<rect width="100%" height="100%" fill="blue" />
<circle cx="800" cy="450" r="300" fill="white" />
<text x="800" y="510" font-size="200" text-anchor="middle" fill="blue">Hello</text>
</svg>
<svg> 요소 안에 그래픽 요소들을 위와 같이 집어 넣어주면 됩니다. 위 예제는 rect(사각형)과 circle(원) 그리고 text(텍스트)를 넣어주었습니다. 그 결과는 다음과 같습니다.
주의
SVG은 내용의 위에서 부터 아래로 랜더링됩니다. 따라서 요소의 순서에 따라 보이는 이미지가 달라질 수 있습니다. 위 예제 코드에서 만약 rect 요소를 아래쪽에 작성했을 경우, 다른 그래픽 요소들은 보이지 않게됩니다.
Tip
SVG를 작성 시 왼쪽 위 모서리 부분이 (0,0)이며 X축은 오른쪽 방향이며, Y축은 아래 방향 입니다.
사각형: rect
<rect x="10" y="10" width="50" height="30" stroke="red" fill="transparent" stroke-width="3"/>
<rect x="100" y="10" rx="10" ry="10" width="50" height="80" stroke="blue" fill="transparent" stroke-width="3"/>
- x, y: 좌상 꼭짓점의 x, y 좌표 값
- rx, ry: 사각형 모서리 굴곡의 x축, y축 반지름을 설정
- width, height: 사각형의 가로, 세로 길이
- stroke: 테두리 색상
- stroke-width: 테두리 굵기
- fill: 도형 채울 색상 (default: black)
- opacity: 도형 투명도
선: line
<line x1="10" y1="10" x2="100" y2="50" stroke="blue" stroke-width="3"/>
- x1, y1: 시작 좌표 값
- x2, y2: 끝 좌표 값
- stroke-linecap: 선의 끝 모양을 제어합니다.
<line x1="40" x2="120" y1="40" y2="40" stroke="blue" stroke-width="15" />
<line x1="40" x2="120" y1="80" y2="80" stroke="blue" stroke-width="15" stroke-linecap="butt"/>
<line x1="40" x2="120" y1="120" y2="120" stroke="blue" stroke-width="15" stroke-linecap="square"/>
<line x1="40" x2="120" y1="160" y2="160" stroke="blue" stroke-width="15" stroke-linecap="round"/>
여러 선: Polyline
<polyline points="10,100 150,100 30,200 80,45 130,200"
stroke="blue" stroke-width="5" fill="white"/>
- points: 첫 번째 꼭짓점부터 마지막 꼭짓점까지 차례대로선으로 연결됩니다.
- stroke-linejoin: 선이 연결되는 부분의 모양을 제어합니다.
<polyline points="40 60 80 20 120 60"
stroke="blue" stroke-width="15" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
<polyline points="40 140 80 100 120 140"
stroke="blue" stroke-width="15" stroke-linecap="round" fill="none" stroke-linejoin="round"/>
<polyline points="40 220 80 180 120 220"
stroke="blue" stroke-width="15" stroke-linecap="square" fill="none" stroke-linejoin="bevel"/>
다각형: polygon
<polygon points="10,100 150,100 30,200 80,45 130,200"
stroke="blue" stroke-width="5" fill="white"/>
- points: 다각형의 각 꼭짓점 좌표 값, 첫 번째 꼭짓점부터 마지막 꼭짓점까지 차례대로 선으로 연결됩니다. Polyline과 다른점은 마지막 꼭짓점이 처음 입력한 꼭짓점과 연결된다는 점입니다.
원: circle
<circle cx="50" cy="50" r="20" />
- cx, cy: 원의 중심 x, y 좌표 값
- r: 원의 반지름 길이
타원: ellipse
<ellipse cx="80" cy="80" rx="40" ry="5" />
- cx, cy: 타원의 중심 x, y 좌표 값
- rx, ry: 타원의 x, y 축의 반지름 길이
여러 직선과 곡선: path
<path> 태그는 여러 직선과 곡선을 그릴 수 있는 요소입니다. 패스의 속성은 d 속성 하나입니다. d 속성에 여러 개의 명령어와 좌표 속성 값들로 이루어집니다.
<path d="명령어 x좌표 y좌표 명령어 x좌표 y좌표 ... />
- 명령어:
- 대문자인 경우: 좌표는 페이지의 절대 좌표 값입니다.
- 소문자인 경우: 좌표는 마지막 위치에 에대한 상대 좌표 값입니다.
그리는 위치 옮기기: M, m
<path d="M 10 10"/>
그리는 커서의 위치가 다른 위치에 있을 때, 지정한 좌표로 그리는 위치를 옮겨줍니다.
선 그리기 명령어: L, l
<path d="M 10 10 L 90 10 V 90 H 10 V 10"
stroke="blue" stroke-width="5" fill="white"/>
- L x y (혹은 l dx dy): 현재 위치에서 지정한 x, y 좌표 값으로 선을 긋습니다.
- H x (혹은 h dx): 가로선을 긋습니다. 때문에 x 좌표 값만 입력합니다.
- V y (혹은 v dy): 세로선을 긋습니다. 때문에 y 좌표 값만 입력합니다.
시작 점과 현재 위치 선 그리기: Z, z
<path d="M 10 10 L 90 10 V 90 H 10 Z"
stroke="blue" stroke-width="5" fill="white"/>
Z와 z의 차이는 없습니다.
3 차 베지어 곡선: C, c
<path d="M 10 10 C 20 20, 40 20, 50 10" stroke="black" fill="transparent"/>
<path d="M 70 10 C 70 20, 120 20, 120 10" stroke="black" fill="transparent"/>
<path d="M 140 10 C 130 20, 190 20, 180 10" stroke="black" fill="transparent"/>
<path d="M 10 60 C 20 80, 40 80, 50 60" stroke="black" fill="transparent"/>
<path d="M 75 60 C 75 80, 115 80, 115 60" stroke="black" fill="transparent"/>
<path d="M 140 60 C 130 80, 190 80, 180 60" stroke="black" fill="transparent"/>
<path d="M 10 110 C 20 140, 40 140, 50 110" stroke="black" fill="transparent"/>
<path d="M 75 110 C 75 140, 115 140, 115 110" stroke="black" fill="transparent"/>
<path d="M 140 110 C 130 140, 190 140, 180 110" stroke="black" fill="blue"/>
- C x1 y1, x2 y2, x3, y3 (혹은 c dx1 dy1, dx2 dy2, dx3 dy3):
베지어 곡선은 3차(Cubic) 곡선입니다. 현재 위치에서 첫 번째 제어점인 x1, y1로 방향을 향하고 두 번째 제어점인 x2, y2까지 완만한 곡선을 그립니다. 그리고 마지막 x3, y3을 끝점으로 하여 그리기를 마칩니다.
<path d="M 10 100 C 50 10, 100 10, 95 100 S 140 190, 180 100" stroke="blue" fill="transparent"/>
베지어 곡선을 연결하여 긴 곡선을 만들고 싶을 때 S 혹은 s 명령어를 사용합니다.
- S x2 y2, x3 y3 (혹은 s dx2 dy2, dx3 dy3):
S 명령어의 첫 번째 제어점(x1, y1)은, 앞선 C나 S 명령어의 마지막 제어점(x2, y2)을 뒤집은 것으로 설정됩니다. 이를 통해 유연하고 자연스러운 연결된 곡선을 만들 수 있습니다.
2 차 베지어 곡선: Q, q
<path d="M 20 100 Q 100 190, 180 100" stroke="blue" fill="transparent"/>
- Q x1 y1, x2 y2 (혹은 q dx1 dy1, dx2 dy2):
앞서 설명한 3차 베지어 곡선은 시작점과 끝점 그리고 제어점 2개였다면 2차 베지어 곡선은 시작점과 끝점 그리고 하나의 제어점으로 곡선을 생성합니다.
<path d="M 20 100 Q 100 190, 180 100 T 340 100" stroke="blue" fill="transparent"/>
- T x2 y2 (혹은 t dx2 dy2):
3차 베지어 곡선의 S와 같은 기능입니다. 첫 번째 제어점(x1, y1)이, 앞선 Q나 T 명령어의 제어점(x1, y1)을 뒤집은 것으로설정됩니다. 만약 T 명령어가 단독으로 쓰일 경우 앞선 제어점은 시작점의 좌표로 간주되어, 직선만 그릴 수 있게 됩니다.
원호: A, a
<path d="M 300 200 h -150 a 150 150, 0, 1, 0, 150 -150 z"
fill="yellow" stroke="blue" stroke-width="5" />
<path d="M 275 175 v -150 a 150 150, 0, 0, 0, -150 150 z"
fill="blue" stroke="blue" stroke-width="5" />
- A rx ry x-axis-rotation large-arc-flag sweep-flag x y:
- rx ry: Arc에 해당하는 타원의 반지름, 이때 타원의 중심은 알아서 계산하여 결과가 나옵니다.
- x-axis-rotation: x축 회전 각도
- large-arc-flag: 호의 각도가 180도 이상이면 1, 아니면 0
- sweep-flag: 호의 진행 방향(시계 방향 기준)이 양의 각도이면 1, 음의 각도이면 0
- x y: Arc의 끝점
원호는 타원의 일부분이기 때문에 이러한 개념을 갖고 원호를 생성합니다.
원호의 시작점과 끝점이 있다고 가정해봅니다. 그리고 크기가 정해져있는 타원을 앞선 두 점을 지나게 배치한다고 하였을 때 놓을 수 있는 경우는 두 가지 입니다.
결국 두 점을 지나는 타원은 2 개가 되며, 두 점을 지나는 호는 4 개가 됩니다.
'Front-End > d3.js' 카테고리의 다른 글
D3.js 데이터 시각화를 구현하기 위한 자바스크립트 라이브러리 (0) | 2023.11.09 |
---|