SVG에 SVG를 포함 하시겠습니까?


98

SVG 문서가 있는데 그 안에 외부 svg 이미지를 포함하고 싶습니다. 예를 들면 다음과 같습니다.

<object data="logo.svgz" width="100" height="100" x="200" y="400"/>

( "object"는 예일뿐입니다. 외부 문서는 xhtml이 아닌 SVG입니다).

어떤 아이디어? 이것이 가능할까요? 아니면 내 외부 SVG 문서에 logo.svg xml을 간단히 넣는 것이 가장 좋은 방법입니까?

답변:


136

image요소를 사용하고 SVG 파일을 참조하십시오. 재미를 위해 다음을 다음과 같이 저장하십시오 recursion.svg.

<svg width="100%" height="100%" viewBox="-100 -100 200 200" version="1.1"
     xmlns="http://www.w3.org/2000/svg">
  <circle cx="-50" cy="-50" r="30" style="fill:red" />
  <image x="10" y="20" width="80" height="80" href="recursion.svg" />
</svg>

3
감사합니다. 어떤 이유로이 질문을 게시 할 때까지 인터넷 검색이 작동하지 않았습니다. 이미지를 렌더링하려면 너비와 높이가 있어야합니다.
Marcin 2011 년

19
한 가지 흥미로운 사실은 Firefox, Chrome 및 Safari의 최신 버전은 모두 위의 방법을 사용하여 한 수준의 재귀 (점 두 개) 만 보여줍니다. 그러나 위를 "a.svg"로 저장하고 이미지를 "b.svg"로 변경 한 다음 "a.svg"를 참조하는 이미지와 함께 "b.svg"로 저장하면 Firefox는 추가 교대 파일을 다시로드 할 때마다 반복 수준 . 파일을로드 할 때마다 결과를 캐시하는 것처럼 보이며 한 단계 더 깊게 진행됩니다.
Phrogz 2011 년

6
@IanStormTaylor SVG 요소 자체에는 스타일 속성이 없습니다. 오히려 SVG 요소 내부의 항목에는 스타일이 있습니다. 그러나 사용하는 경우 <image>SVG에서 (나 <img>또는 <embed>당신이 기본 DOM에 대한 액세스 권한이 부여되지 않은 SVG 파일을 참조하는 HTML에서). 따라서에서 참조한 SVG 요소 내부의 요소는 스타일을 지정할 수 없습니다 <image>.
Phrogz

2
@proteneer <image xlink:href="data:image/svg+xml;utf8,&lt;svg …&gt;… &lt;/svg&gt;" />. (JavaScript를 사용하여 href속성 을 설정하는 경우 <등 문자 를 이스케이프 할 필요가 없습니다 .)
Phrogz

1
xlink:href더 이상 사용되지 않습니다 . 이제 href. 이를 포함하도록 답변을 업데이트 할 수 있습니까?
Donald Duck

91

또는 실제로 다음과 같이 부모 svg에 자식 svg를 포함 할 수 있습니다.

<svg>
    <g>
        <svg>
            ...
        </svg>
    </g>
</svg>

데모 :
http://hitokun-s.github.io/old/demo/path-between-two-svg.html


@toshi 답변의 또 다른 예가 있습니까? 나는 노력하고 있지만 귀하의 조언을 구현하지 못했습니다. 내 '외부'SVG는 원과 그라디언트를 설정합니다. 내 내부 SVG는 객체입니다. 독립 실행 형, 내부 SVG는 예상대로 작동합니다. 그러나 내부 SVG는 귀하의 조언을 구현할 때 표시되지 않습니다. 따라서 다른 예를보기를 요청합니다.
Jay Gray

독립형 대안을 언급하는 경우 +1. 이러한 임베디드 SVG의 위치 / 크기 조정은 어떻게 작동합니까?
bluenote10

40

다음을 사용하여 SVG를 다른 SVG에 포함 할 때 언급 할 가치가 있습니다.

<image x="10" y="20" width="80" height="80" xlink:href="image.svg" />

그런 다음 포함 된 SVG는 지정된 크기 의 직사각형 모양을 취 합니다.

즉, 임베디드 SVG가 원이거나 정사각형이 아닌 다른 모양이면 투명도가있는 정사각형이됩니다. 따라서 마우스 이벤트는 포함 된 사각형에 트랩되어 상위 SVG에 도달하지 않습니다. 조심하세요.

더 나은 방법은 패턴을 사용하는 것입니다. 모양을 채우려면 원, 정사각형 또는 경로를 선택합니다.

<defs>
 <pattern id="pat" x="0" y="0" width="500" height="500" patternUnits="userSpaceOnUse">
   <image x="0" y="0" width="500" height="500" xlink:href="images/mysvg.svg"></image>
 </pattern>
</defs>

그런 다음 다음과 같은 패턴을 사용하십시오.

<circle cx="0" cy="0" r="250" fill="url(#pat)"></circle>

이제 마우스 이벤트가 투명한 이미지 사각형에 갇히지 않습니다!


그 채우기 패턴은 완벽합니다. 감사합니다. 더 작은 삽입물이나 더 작은 뷰 박스의 경우 코더는 모든 너비와 높이를 동일한 크기로 줄일 수 있습니다.
스티브 테일러

7

<image>태그 를 사용 하면 포함 된 파일의 렌더링 품질이 낮다는 것을 알았습니다 . 그러나 다음 기술이 효과가있었습니다 (SVG 파일 내부에 SVG 파일을 포함하기 위해-반드시 HTML 페이지에서 렌더링 할 필요는 없음).

  • 텍스트 편집기에서 SVG 파일을 편집합니다.

  • 메타 데이터의 끝을 찾으십시오.

    </metadata>
      <g
       id="layer1"
       inkscape:groupmode="layer"
       inkscape:label="Layer 1">
  • 해당 그룹 태그 뒤에 다음 행을 삽입하십시오.

    <use xlink:href="OTHERFILE.svg#layer1" y="0" x="0" />
  • 이 경우 OTHERFILE.svg를 파일에 포함하고 모든 layer1 (첫 번째 및 기본 레이어)을 포함합니다.

  • 이것을 저장하고 Inkscape에서 파일을 엽니 다.

이 기술은 모든 페이지에 표준 배경 또는 로고를 포함하는 데 유용합니다. 파일에 먼저 넣으면 먼저 렌더링되므로 맨 아래에 렌더링됩니다. 다음 속성을 추가하여 잠글 수도 있습니다.

sodipodi:insensitive="true" 

다시 말해:

<use xlink:href="OTHERFILE.svg#layer1" sodipodi:insensitive="true" y="0" x="0" />

@WilliamEntriken "외부 파일"이란 무엇을 의미합니까? 내가 설명한 방법은 외부 파일, 즉 다른 내용이 들어있는 파일을 사용합니다.
Nick Gammon

5

참고 xlink:href더 이상 사용되지 않습니다 . href대신 사용하십시오.

<svg viewBox="0 0 512 512">
  <image width="512" height="512" href="external.svg"/>
</svg>

viewBox, widthheight값 (이 답변에서)은 단순히 설명을 목적으로 한 것이므로 그에 따라 레이아웃을 조정하십시오 ( 더 읽기 ).

<image> 와 비슷한 사양공유 하므로 Christiaan의 답변<img> 에서 언급했듯이 SVG 스타일을 지원하지 않습니다 . 예를 들어, svg 모양 색상을 글꼴 색상과 동일하게 설정하는 다음 css 라인이있는 경우

svg {
  fill: currentColor;
}

위의 스타일 <image>이 사용 되면 적용되지 않습니다 . 이를 위해 Nick의 답변에<use> 표시된 것처럼 을 사용해야합니다 . 합니다.

그의 대답의 메모 id="layer1"href="OTHERFILE.svg#layer1"값은 필수입니다. 입니다.

즉, id속성을 외부 svg 파일 에 추가 해야하므로 (수정 된) 외부 svg 파일을 직접 (웹 사이트) 또는 다른 곳에서 호스팅해야합니다. 결과 외부 svg 파일은 다음과 같습니다 id.

<svg id="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
  <path d="..."/>
</svg>

id 의 가치 무엇이든 될 수 있습니다.이 예제에서는 "logo"를 사용합니다.

해당 svg를 포함하려면

<svg viewBox="0 0 512 512">
  <use href="edited-external.svg#logo"/>
</svg>

위의 svg를 html에서 인라인으로 사용하는 경우 xmlns 속성이 필요하지 않습니다 (적어도 svgo 에서 알고있는 것 ).


1
viewBox는 필수가 아니며 생략하면 다른 레이아웃을 얻을 수 있지만 경우에 따라 원하는 것일 수 있습니다. Safari는 방금 href를 지원하기 시작했습니다.
Robert Longson 19

4

SVG에 SVG를 임베드하고 색상을 변경하고 변형을 적용해야했습니다.

Firefox만이 중첩 된 svg 요소에서 "transform"속성을 지원합니다. <이미지>의 색상 변경도 불가능합니다. 그래서 둘의 조합이 필요했습니다.

내가 한 일은 다음과 같았습니다.

<svg>
  <image x="0" y="0" xlink:href="data:image/svg+xml;base64,[base64 of nested svg]"></image>
</svg>

이것은 적어도 Firefox, Chrome 및 Inkscape에서 작동합니다.

이것은 이제 변형을 적용 할 수 있다는 점을 제외하면 부모 svg 응답의 자식 svg와 동일하게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.