làm cho một đối tượng svg html cũng là một liên kết có thể nhấp


143

Tôi có một đối tượng SVG trong trang HTML của mình và đang gói nó trong một neo vì vậy khi hình ảnh svg được nhấp, nó sẽ đưa người dùng đến liên kết neo.

<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>

Khi tôi sử dụng khối mã này, nhấp vào đối tượng svg sẽ không đưa tôi đến google. Trong IE8 <văn bản span có thể nhấp.

Tôi không muốn sửa đổi hình ảnh svg của mình để chứa các thẻ.

Câu hỏi của tôi là, làm thế nào tôi có thể làm cho hình ảnh svg có thể nhấp được?

Câu trả lời:


20

Cách dễ nhất là không sử dụng <object>. Thay vào đó, hãy sử dụng thẻ <img> và neo sẽ hoạt động tốt.


1
Thẻ img thường sẽ đi nơi thẻ span để điều này giảm xuống một cách duyên dáng.
Adrian Garner

17
Không phải là ý tưởng để hiển thị một vectơ svg, không phải là một hình ảnh?
Lu-ca

7
@ ErikDahlström nhưng <img>với tham chiếu đến dữ liệu svg không phải lúc nào cũng hoạt động như bạn mong đợi, ngay cả trong phiên bản mới nhất của Chrome :( stackoverflow.com/questions/15194870/iêu
dshap

15
Như @energee đã chỉ ra, bạn có thể sử dụng <object>thẻ và thêm một point-event: none;để làm cho nó có thể nhấp được. Nó bảo vệ quyền truy cập vào mã nguồn svg của bạn và cho phép bạn tự động thao tác nó.
Antoine

1
Sử dụng imgkhông phải luôn luôn là một lựa chọn. Trong trường hợp của tôi, tôi cần phải thao tác với Svg, điều này không thể được thực hiện đúng cách img, tôi phải sử dụng object.
Martijn

216

Trên thực tế, cách tốt nhất để giải quyết vấn đề này là ... trên thẻ <object>, sử dụng:

pointer-events: none;

Lưu ý: Người dùng đã cài đặt plugin Trình chặn quảng cáo sẽ nhận được [Chặn] giống như tab ở góc trên bên phải khi di chuột (giống như biểu ngữ flash được). Bằng cách cài đặt css này, điều đó cũng sẽ biến mất.

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


4
Lưu ý: IE sẽ không hỗ trợ các sự kiện con trỏ trên các phần tử thông thường cho đến IE 11, nhưng đã hỗ trợ chúng trên SVG. Xem caniuse.com/pulum-events
webdesserts

9
Một nhược điểm của giải pháp này (và cũng là từ noelmcg) là nếu tệp SVG của bạn chứa các quy tắc CSS với: bộ chọn di chuột, các quy tắc này sẽ ngừng hoạt động. Giải pháp được đề xuất bởi Ben Frain không có vấn đề này.
MathieuLescure

6
Điều này cần được phê duyệt câu trả lời. Sử dụng imgvới svg sau đó không thể sử dụng để thay đổi kiểu SVG nội bộ.
cadavre

3
Điều này cần phải là câu trả lời được phê duyệt! Thực sự tốt đẹp, cảm ơn
Daniel Broughan

5
Câu trả lời chính xác. Tôi đã làm cho tôi phổ quát với điều này trong css toàn cầu. object [type * = "svg"] {con trỏ-sự kiện: none}
Gregor Macgregor

39

Tôi đã có cùng một vấn đề và quản lý để giải quyết điều này bằng cách:

Bao bọc đối tượng bằng một phần tử được đặt thành khối hoặc khối nội tuyến

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

Thêm vào <a>thẻ:

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

và vào <span>thẻ:

display: inline-block;

và vào <object>thẻ:

position: relative; 
z-index: -1

Xem một ví dụ ở đây: http://dabblet.com/gist/d6ebc6c14bd68a4b06a6

Tìm thấy thông qua nhận xét 20 tại đây https://ormszilla.mozilla.org/show_orms.cgi?id=294932


1
Xin lỗi, quên hiển thị: phần tử khối / khối nội tuyến để quấn quanh đối tượng
Richard

1
Giải pháp tốt nhất tại đây!
Baldráni

đây là giải pháp tốt nhất cho vấn đề này và hoạt động trên tất cả các trình duyệt
Kalpesh Popat

1
nếu hình ảnh có bg trong suốt thì các bit đó không xuất hiện có thể nhấp được
sobelito

Điều này làm việc cho tôi, tôi cũng phải thêm chiều cao: 100% cho các yếu tố a và span trong tình huống của mình
sk03

32

Muốn lấy tín dụng cho việc này nhưng tôi đã tìm thấy một giải pháp ở đây:

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

thêm phần sau vào css cho neo:

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>

Liên kết hoạt động trên các Svg và trên dự phòng.


2
Đây là giải pháp dễ nhất và được hỗ trợ nhiều nhất theo quan điểm
Type-Style

3
điều này vẫn có một vấn đề: các sự kiện con trỏ SVG (hình động) không hoạt động nữa (rê chuột, rê chuột, nhấp chuột)! Cũng giống như chỉ đơn giản là sử dụng các sự kiện con trỏ: không có gì trên chính đối tượng ...
qdev

26

Bạn cũng có thể dán một cái gì đó như thế này vào dưới cùng của SVG (ngay trước </svg>thẻ đóng ):

<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>

Sau đó chỉ cần sửa đổi các liên kết cho phù hợp. Tôi đã sử dụng 100% chiều rộng và chiều cao để trang trải cho SVG mà nó có. Tín dụng cho kỹ thuật này dành cho những người thông minh tại Clearleft.com - đó là nơi lần đầu tiên tôi nhìn thấy nó được sử dụng.


2
Tôi có kiểu css với bộ chọn: hover được nhúng trong tệp SVG của tôi. Đây là giải pháp duy nhất không hủy kích hoạt kiểu.
MathieuLescure

21

Đơn giản hóa giải pháp của Richard. Hoạt động ít nhất trong Firefox, Safari và Opera:

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

Xem http://www.noupe.com/tutorial/svg-clickable-71346.html để biết thêm giải pháp.


3
Cảm ơn, tôi cần màn hình được đặt thành blockhoặc inline-blocktrên cha mẹ <a>.
tử119

Liên kết tốt: noupe.com/inspirst/tutorials-inspirst/ từnhững ưunhược điểm cho từng giải pháp.
Serge Stroobandt

Tôi cũng cần sử dụng inline-blocktrong một số trường hợp, nhưng blockdường như hoạt động tốt trên các trường hợp khác; Tôi đoán nó phụ thuộc vào các khối kèm theo ...
Gwyneth Llewelyn

9

Để thực hiện điều này trong tất cả các trình duyệt, bạn cần sử dụng kết hợp các phương thức @energee, @Richard và @Feuermurmel.

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

Thêm:

  • pointer-events: none; làm cho nó hoạt động trong Firefox.
  • display: block; làm cho nó hoạt động trong Chrome và Safari.
  • z-index: 1; z-index: -1; làm cho nó hoạt động trong IE là tốt.

@janaspage Tôi không chắc ... Tôi chưa dùng thử trên IE 10. Hãy cho tôi biết nếu nó hoạt động :)
ChristopherStrydom

@jaepage Điều đó không quan trọng, vì objectbây giờ sẽ ở trong bối cảnh xếp chồng thấp hơn (dưới) so với cha mẹ của nó.
Jason T Featheringham

cái này có hoạt động trên iPhone / di động không? không cho tôi không thể nhấp / tappable
bafromca

3

Tôi đã giải quyết điều này bằng cách chỉnh sửa tập tin svg.

Tôi đã gói xml của toàn bộ đồ họa svg trong thẻ nhóm có sự kiện nhấp như sau:

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

Giải pháp hoạt động trong tất cả các trình duyệt hỗ trợ tập lệnh svg đối tượng. (mặc định thẻ img bên trong thành phần đối tượng của bạn cho các trình duyệt không hỗ trợ svg và bạn sẽ bao quát toàn bộ gam của trình duyệt)


Bạn có thấy rằng việc thêm onclick vào <svg>phần tử bên ngoài và không bao bọc nó không hoạt động?
Robert Longson

1
Bạn cũng có thể sử dụng các sự kiện của phần tử svg gốc. Ngoài các sự kiện onclick tôi sử dụng onmouseout, ontouchstart, ontouchend, v.v ... và đối với phần tử svg gốc, tôi thường xuyên sử dụng sự kiện onload. Giải pháp Ben Frain dưới đây liên quan đến việc vẽ một đối tượng bìa bổ sung (hình chữ nhật) để ghi lại các sự kiện nhấp chuột ... vì vậy tôi đã đưa ra giải pháp này cho thấy việc nhận các sự kiện trên chính các thành phần vẽ mà không phải tạo một nắp trong suốt chỉ để có một sự kiện nhấp chuột. Đặc biệt hữu ích khi bạn không muốn vẽ một yếu tố khác hoặc bạn muốn các sự kiện cụ thể cho hình dạng hiện tại và không phải là một hình chữ nhật.
Bruce Pezzlo

3

tôi đã thử phương pháp dễ dàng sạch sẽ này và dường như hoạt động trong tất cả các trình duyệt. Bên trong tập tin svg:

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


Không gian tên 'xlink' sau đây sẽ phải được thêm vào phần tử svg để làm cho công việc này: xmlns: xlink = " w3.org/1999/xlink "
Phát triển

Không có giải pháp nào khác làm việc cho tôi nhưng giải pháp này đã làm, whew, cảm ơn bạn!
ByteMyPixel

Mặc dù tôi thường không có ý định thay đổi trực tiếp tệp SVG, nhưng trong kịch bản của tôi, tôi sử dụng cùng một SVG cho một số liên kết khác nhau - có nghĩa là về mặt lý thuyết, tôi phải tạo một SVG khác nhau cho mỗi liên kết. Ngoài ra, tất nhiên, tôi có thể thêm dòng bit đồ họa vào thẻ <svg>, nhưng tôi ghét mã trùng lặp (mặc dù SVG thực tế tôi có là nhỏ ...)
Gwyneth Llewelyn

0

Chỉ không sử dụng <object>. Đây là một giải pháp phù hợp với tôi <a><svg>các thẻ:

<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 Tôi đang sử dụng css tailwind.
Ege Hurturk

-5

Làm điều đó với javascript và thêm một onClick-attribution vào -element của bạn 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>

Tôi đã thử điều này, cả có và không có các thẻ <a> xung quanh và tôi không thể làm việc này. Tôi đã thử trong FF và Chrome trên Linux. Trình duyệt nào bạn đã thử cái này?
iancoleman

6
Sẽ thật tuyệt nếu bạn có thể dùng thử và xác nhận rằng nó hoạt động để những người khác đọc nó có thể tự tin về câu trả lời của bạn. "Nó phải hoạt động" là lý thuyết tốt, nhưng đối với tôi nó phải hoạt động trong thực tế.
iancoleman

Tôi mới thử cái này trên Chrome 45 trên Windows và nó có vẻ hoạt động tốt. Tôi đã thêm onClick trực tiếp vào thẻ SVG mà không cần neo. Sẽ thật tốt nếu các downvote giải thích lý do tại sao.
Đuổi theo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.