html svg 객체를 클릭 가능한 링크로 만듭니다.


143

내 HTML 페이지에 SVG 객체가 있고 앵커로 감싸서 svg 이미지를 클릭하면 사용자를 앵커 링크로 안내합니다.

<a href="http://www.google.com/">
    <object data="mysvg.svg" type="image/svg+xml">
        <span>Your browser doesn't support SVG images</span>
    </object>
</a>

이 코드 블록을 사용할 때 svg 객체를 클릭해도 Google로 이동하지 않습니다. IE8 <에서 스팬 텍스트를 클릭 할 수 있습니다.

태그를 포함하도록 svg 이미지를 수정하고 싶지 않습니다.

내 질문은 어떻게 svg 이미지를 클릭 가능하게 만들 수 있습니까?

답변:


20

가장 쉬운 방법은 <object>를 사용하지 않는 것입니다. 대신 <img> 태그를 사용하면 앵커가 제대로 작동합니다.


1
img 태그는 일반적으로 span 태그가 정상적으로 저하되는 위치로 이동합니다.
Adrian Garner

18
이미지가 아닌 svg 벡터를 표시하는 아이디어가 아닙니까?
Luke

7
@ ErikDahlström하지만 <img>SVG 데이터에 대한 참조를하지 않습니다 항상 작업 당신은 예상대로, 심지어 크롬 :( 최신 버전의 stackoverflow.com/questions/15194870/...
dshap

15
@energee가 지적했듯이 <object>태그 를 사용 하고 a point-event: none;를 추가하여 클릭 가능하게 만들 수 있습니다. svg 소스 코드에 대한 액세스 권한을 유지하고 동적으로 조작 할 수 있습니다.
Antoine

1
를 사용하는 img것이 항상 옵션은 아닙니다. 내 경우에는 svg를 조작해야합니다 .svg를 통해 올바르게 수행 할 수 없으므로을 img사용해야 object합니다.
Martijn

216

실제로 이것을 해결하는 가장 좋은 방법은 <object> 태그에서 다음을 사용하는 것입니다.

pointer-events: none;

참고 : Ad Blocker 플러그인을 설치 한 사용자는 마우스를 올리면 오른쪽 상단에 탭과 같은 [차단]이 표시됩니다 (플래시 배너와 동일). 이 CSS를 설정하면 사라질 것입니다.

http://jsfiddle.net/energee/UL9k9/


4
참고 : IE는 IE 11까지 일반 요소에서 포인터 이벤트를 지원하지 않지만 SVG에서는 이미 포인터 이벤트를 지원합니다. 참조 caniuse.com/pointer-events을
webdesserts

9
이 솔루션 (및 noelmcg의 솔루션)의 단점은 SVG 파일에 : hover 선택기가있는 CSS 규칙이 포함 된 경우 이러한 규칙의 작동이 중지된다는 것입니다. Ben Frain이 제안한 솔루션에는이 문제가 없습니다.
MathieuLescure

6
이것은 승인 된 답변이어야합니다. imgsvg와 함께 사용하면 내부 SVG 스타일을 변경할 수 없습니다.
cadavre

3
이것은 승인 된 답변이어야합니다! 정말 감사합니다
Daniel Broughan

5
좋은 대답입니다. 나는 글로벌 CSS에서 이것을 보편적으로 만들었습니다. object [type * = "svg"] {포인터 이벤트 : 없음}
Gregor Macgregor

40

나는 같은 문제가 있었고 다음과 같이 해결했습니다.

블록 또는 인라인 블록으로 설정된 요소로 객체 감싸기

<a>
    <span>
        <object></object>
    </span>
</a>

<a>태그에 추가 :

display: inline-block;
position: relative; 
z-index: 1;

그리고 <span>태그에 :

display: inline-block;

그리고 <object>태그에 :

position: relative; 
z-index: -1

여기에 예를 참조하십시오 : http://dabblet.com/gist/d6ebc6c14bd68a4b06a6

코멘트 20을 통해 발견 https://bugzilla.mozilla.org/show_bug.cgi?id=294932


1
사과, 디스플레이 잊어 버린 : 개체를 감싸는 인라인 블록 / 블록 요소
Richard

1
여기에 최고의 솔루션!
Baldráni

이것은이 문제에 대한 최상의 솔루션이며 모든 브라우저에서 작동합니다
Kalpesh Popat

1
이미지에 투명한 bg가 있으면 해당 비트를 클릭 할 수없는 것으로 보입니다
sobelito

이것은 나를 위해 일했다, 나는 또한 높이를 추가해야했다 : 내 상황에서 a 및 span 요소에 100 %
sk03

32

이것을 인정하고 싶지만 여기에서 해결책을 찾았습니다.

https://teamtreehouse.com/forum/how-do-you-make-a-svg-clickable

앵커의 CSS에 다음을 추가하십시오.

a.svg {
  position: relative;
  display: inline-block; 
}
a.svg:after {
  content: ""; 
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left:0;
}


<a href="#" class="svg">
  <object data="random.svg" type="image/svg+xml">
    <img src="random.jpg" />
  </object>
</a>

링크는 svg와 폴백에서 작동합니다.


2
이것은 가장 쉽고 지원되는 솔루션입니다
Type-Style

3
이것은 여전히 ​​문제가 있습니다 : SVG 포인터 이벤트 (애니메이션)가 더 이상 작동하지 않습니다 (마우스 오버, 마우스 아웃, 클릭)! 단순히 포인터 이벤트를 사용하는 것과 같이 객체 자체에는 없음
qdev

26

SVG의 맨 아래 (닫는 </svg>태그 바로 앞에)에 다음과 같은 것을 넣을 수도 있습니다 .

<a xmlns="http://www.w3.org/2000/svg" id="anchor" xlink:href="/" xmlns:xlink="http://www.w3.org/1999/xlink" target="_top">
    <rect x="0" y="0" width="100%" height="100%" fill-opacity="0"/>
</a>

그런 다음 링크를 수정하십시오. 저는 SVG를 덮기 위해 너비와 높이를 100 % 사용했습니다.이 기술에 대한 크레딧은 Clearleft.com의 똑똑한 사람들에게 전달됩니다.


2
SVG 파일에 : hover 선택기가 포함 된 CSS 스타일이 있습니다. 스타일을 비활성화하지 않는 유일한 솔루션입니다.
MathieuLescure

21

Richard의 솔루션 단순화. 최소한 Firefox, Safari 및 Opera에서 작동합니다.

<a href="..." style="display: block;">
    <object data="..." style="pointer-events: none;" />
</a>

추가 솔루션 은 http://www.noupe.com/tutorial/svg-clickable-71346.html 을 참조 하십시오 .


3
덕분에, 나는에 디스플레이 설정이 필요 block하거나 inline-block부모에 <a>.
element119

좋은 링크 : noupe.com/inspiration/tutorials-inspiration/...는장점단점 각각의 솔루션을.
Sroo Stroobandt

inline-block어떤 경우에는 사용해야 했지만 block다른 경우에는 잘 작동하는 것 같습니다. 나는 그것이 ... 둘러싸는 블록에 따라 달라집니다 것 같아요
기네스 르 웰린

9

모든 브라우저에서이를 수행하려면 @energee, @Richard 및 @Feuermurmel 방법을 조합하여 사용해야합니다.

<a href="" style="display: block; z-index: 1;">
    <object data="" style="z-index: -1; pointer-events: none;" />
</a>

첨가:

  • pointer-events: none; Firefox에서 작동합니다.
  • display: block; Chrome과 Safari에서 작동합니다.
  • z-index: 1; z-index: -1; IE에서도 작동합니다.

@janaspage 확실하지 않습니다 ... IE 10에서 사용해 보지 않았습니다. 작동하는지 알려주세요 :)
ChristopherStrydom

@jaepage object이제 부모보다 낮은 스택 컨텍스트 (아래)에 있기 때문에 중요하지 않습니다 .
Jason T Featheringham

이것은 iPhone / mobile에서 작동합니까? 나를 위해하지 않습니다. 클릭 불가 / 탭 가능
bafromca

3

svg 파일을 편집 하여이 문제를 해결했습니다.

다음과 같이 click 이벤트가있는 그룹 태그에 전체 svg 그래픽의 XML을 래핑했습니다.

<svg .....>
<g id="thefix" onclick="window.top.location.href='http://www.google.com/';">
 <!-- ... your graphics ... -->
</g>
</svg>

솔루션은 객체 svg 스크립트를 지원하는 모든 브라우저에서 작동합니다. (기본적으로 svg를 지원하지 않는 브라우저의 객체 요소 안에 img 태그가 있으며 브라우저의 범위를 다룰 것입니다)


외부 <svg>요소에 onclick을 추가 하고 전혀 감싸지 않는 것이 발견 되었습니까?
Robert Longson

1
루트 svg 요소의 이벤트도 사용할 수 있습니다. onclicke 이벤트 외에도 onmouseout, ontouchstart, ontouchend 등을 사용하고 루트 svg 요소는 onload 이벤트를 자주 사용합니다. 아래의 Ben Frain 솔루션은 클릭 이벤트를 캡처하기 위해 여분의 커버 객체 (사각형)를 그리는 것과 관련이 있습니다 ... 그래서 클릭 이벤트를 얻기 위해 투명 커버를 만들지 않고도 드로잉 요소 자체에 이벤트를 가져 오는 것을 보여주는이 솔루션을 제안했습니다. 다른 요소를 그리고 싶지 않거나 사각형이 아닌 기존 모양과 관련된 이벤트를 원할 때 특히 유용합니다.
브루스 페즐로

3

이 깨끗하고 쉬운 방법을 시도했지만 모든 브라우저에서 작동하는 것 같습니다. svg 파일 내부 :

<svg>
<a id="anchor" xlink:href="http://www.google.com" target="_top">
  
<!--your graphic-->
  
</a>
</svg>
  


다음 '인 XLink'공간이 작업 만들기 위해 SVG 요소에 추가되어야 할 것이다 : XMLNS : 인 XLink = " w3.org/1999/xlink "
단순한 개발

다른 솔루션 중 어느 것도 나를 위해 일한 것은 아니지만이 솔루션은 감사합니다!
ByteMyPixel

일반적으로 SVG 파일을 직접 변경하는 것에 대한 자격은 없지만 시나리오에서 여러 다른 링크에 동일한 SVG를 사용합니다. 이론적으로는 각각에 대해 서로 다른 SVG를 만들어야합니다. 또는 물론 <svg> 태그에 그래픽 비트 인라인을 추가 할 수는 있지만 중복 된 코드는 싫어합니다 (실제 SVG는 작지만 ...)
Gwyneth Llewelyn

0

그냥 사용하지 마십시오 <object>. 다음은 나를 위해 일한 솔루션 <a><svg>태그입니다.

<a href="<your-link>" class="mr-5 p-1 border-2 border-transparent text-gray-400 rounded-full hover:text-white focus:outline-none focus:text-white focus:bg-red-700 transition duration-150 ease-in-out" aria-label="Notifications">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="30" 
    height="30"><path class="heroicon-ui" fill="#fff" d="M17 16a3 3 0 1 1-2.83 
    2H9.83a3 3 0 1 1-5.62-.1A3 3 0 0 1 5 12V4H3a1 1 0 1 1 0-2h3a1 1 0 0 1 1 
    1v1h14a1 1 0 0 1 .9 1.45l-4 8a1 1 0 0 1-.9.55H5a1 1 0 0 0 0 2h12zM7 12h9.38l3- 
   6H7v6zm0 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm10 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
    </svg>
</a>

btw 꼬리 바람 CSS를 사용하고 있습니다.
Ege Hurturk

-5

자바 스크립트로 수행하고- 요소에- onClick속성을 추가 하십시오 object.

<object data="mysvg.svg" type="image/svg+xml" onClick="window.location.href='http://google.at';">
    <span>Your browser doesn't support SVG images</span>
</object>

주변 <a> 태그를 사용하거나 사용하지 않고 이것을 시도했지만이 작업을 수행 할 수 없습니다. Linux의 FF 및 Chrome에서 시도했습니다. 어떤 브라우저에서 시도 했습니까?
iancoleman

6
당신이 그것을 시도하고 그것이 작동하는지 확인하면 이것을 읽을 수 있다면 좋을 것입니다. "작동해야한다"는 이론 상으로는 문제가 없지만 실제로는 작동해야합니다.
iancoleman

방금 Windows의 Chrome 45 에서이 작업을 시도했지만 정상적으로 작동하는 것 같습니다. 래핑 앵커없이 SVG 태그에 onClick을 직접 추가했습니다. downvotes가 이유를 설명하면 좋을 것입니다.
Chase
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.