SVG에 대해서 1

2025. 7. 29. 21:55it

SVG란?

  • 확장 가능한 벡터 그래픽(Scalable Vector Graphics)
  • 웹페이지에서 벡터 그래픽을 표현하기 위한 W3C 표준 형식.
  • 확대하거나 축소해도 깨지지 않고 선명.
  • xml 기반 문서 형식(HTML처럼 태그로 이루어져 있으며, 직접 코드로 작성하거나 조작 가능.)
  • CSS와 javascript를 이용해서 조작 가능.
  • 모양이 복잡하고 개체수가 많을 수록 성능이 떨어짐.
  • 벡터이기 때문에 이미지의 크기에 상관 없이 선명하게 유지되고 모양이 많이 복잡하지 않은 경우 파일 사이즈도 작다.

 

HTML 문서에 SVG를 넣는 여러가지 방법

① <img> 태그

<body>
  <img src="images/test.svg" alt="">
</body>
  • 이미지에 조작 불가능.

② CSS Background

<head>
  <style>
    .svg {
      width: 300px;
      height: 300px;
      background: url('images/test.svg') no-repeat 0 0;
    }
  </style>
</head>
<body>
  <div class="svg"></div>
</body>
  • 이미지에 조작 불가능.

③ SVG 요소들을 직접 inline으로 삽입

<body>
  <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
    <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
  </svg>
</body>
  • 이미지에 조작 가능.

④ <object> 태그

<body>
  <object data="images/test.svg" type="image/svg+xml"></object>
</body>
  • 이미지에 조작 어려움.

그 외 imbed, iframe으로도 사용 가능하지만 추천하지 않음.

 

SVG 크기 설정

viewBox란?

  • svg 태그의 속성으로 사용.
  • SVG 그래픽의 내부 좌표 시스템을 정의하는 역할
  • SVG의 카메라 시야
  • viewBox="minX minY width height"
    • minX: 가시 영역의 왼쪽 시작 좌표 (x축 기준)
    • minY: 가시 영역의 위쪽 시작 좌표 (y축 기준)
    • width: 내부 좌표계의 너비
    • height: 내부 좌표계의 높이

viewBox 예시

viewBox 속성을 사용한 경우와 사용하지 않은 경우 차이 비교.

 

viewBox 속성 없는 경우

<style>
  svg {
    border: 1px solid #000;
  }
</style>

<h3>viewBox 없이 표현</h3>
<svg width="300" height="150">
  <rect x="0" y="0" width="100" height="50" fill="blue" />
</svg>

viewBox 속성 없는 경우

 

  • width="100"과 height="50"인 파란 사각형이,
  • 300×150 캔버스 안에 그대로 원래 크기대로 위치.

 

viewBox 속성 있는 경우

<style>
  svg {
    border: 1px solid #000;
  }
</style>

<h3>viewBox를 이용한 확대</h3>
<svg width="300" height="150" viewBox="0 0 100 50">
  <rect x="0" y="0" width="100" height="50" fill="green" />
</svg>

viewBox 속성 있는 경우

 

  • viewBox="0 0 100 50"으로 설정하면,
  • 내부의 100x50 사각형이 **캔버스 전체(300x150)**를 꽉 채우도록 확대되어 보임.

 

SVG 압축

 

svg에 CSS 적용하기 1

  • html 태그 처럼, svg 태그 및 자식 태그에도 클래스를 적용할 수 있고 해당 클래스 이름으로 css를 적용 가능.
  • svg에서는 background-color 속성 대신 fill 속성을 사용.
<style>
  .rect {
    fill: blueviolet;
  }
</style>

<h3>css 적용하기</h3>
<svg width="100" height="100" viewBox="0 0 100 100">
  <rect class="rect" x="0" y="0" width="100" height="100"/>
</svg>

class와 css 적용 가능.

svg에 CSS 적용하기 2

  • css를 svg 내부에 포함시킬 수도 있다.
  • svg는 xml이다 보니, xml 파서에서 문자 처리시 오류나는 경우가 있기 때문에 style태그 안쪽 시작 부분과 끝 부분에 각각 <![CDATA[ 와 ]]> 를 입력한다.
<h3>css 적용하기</h3>
<svg width="100" height="100" viewBox="0 0 100 100">
  <style>
  <![CDATA[
  .rect {
    fill: blueviolet;
  }
  ]]>
  </style>
  <rect class="rect" x="0" y="0" width="100" height="100"/>
</svg>

 

참고 : CDATA란?

CDATA는 character data(문자 데이터)를 의미하며, 마크업 언어(xml)에서 CDATA로 문자들을 감싸게 되면, 이 문자열들 사이의 데이터는 마크업으로 해석하지 않아야 하는 데이터를 포함한다는 것을 의미한다. 

예를들어 마크업 언어에서 < 또는 > 와 같은 기호는 이미 태그로서 정의되어 있기 때문에 문자기호를 그대로 사용하면 안되고, &lt , &gt , &amp 와 같은 문자를 사용하여야 한다. 하지만 가독성이 좋지않고 사용성도 좋지 않다.

따라서 마크업 언어에서 <  또는  > 와 같은 기호를 문자 그대로 인식 시키기 위해 CDATA 블록으로 감싸주는 것이다.

출처: https://inpa.tistory.com/entry/XML-📑-CDATA-란-무엇인가-❓-문자-기호-처리 [Inpa Dev 👨‍💻:티스토리]

 

svg에 javascript 적용하기 1

  • svg도 일반 html 태그와 같이 javascript로 제어할 수 있다.
<style>
  .rect {
    fill: blueviolet;
    transition: .4s;
  }
  .rect.ani-on {
    fill: green;
  }
</style>

<h3>css 적용하기</h3>
<svg width="100" height="100" viewBox="0 0 100 100">
  <rect class="rect" x="0" y="0" width="100" height="100"/>
</svg>

<script>
  const rectEl = document.querySelector('.rect');
  rectEl.addEventListener('click', function() {
    this.classList.toggle('ani-on');
  });
</script>

svg도 html 태그와 똑같이 javascript로 제어 가능

 

svg에 javascript 적용하기 2

  • 위에서 style태그를 svg에 포함시킨 것 처럼 script도 포함시킬 수 있다.
<h3>css 적용하기</h3>
<svg width="100" height="100" viewBox="0 0 100 100">
  <style>
    .rect {
      fill: blueviolet;
      transition: .4s;
    }
    .rect.ani-on {
      fill: green;
    }
  </style>
  <script>
    const rectEl = document.querySelector('.rect');
    rectEl.addEventListener('click', function() {
      this.classList.toggle('ani-on');
    });
  </script>
  <rect class="rect" x="0" y="0" width="100" height="100"/>
</svg>