bir html svg nesnesini de tıklanabilir bir bağlantı haline getirme


143

HTML sayfamda bir SVG nesnesi var ve svg görüntü tıklatıldığında kullanıcı bağlantı bağlantısına götürür bir çapa sarma.

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

Bu kod bloğunu kullandığımda, svg nesnesini tıklatmak beni google'a götürmez. IE8 <'de yayılma metni tıklanabilir.

Svg resmimi etiketleri içerecek şekilde değiştirmek istemiyorum.

Benim sorum, svg resmini nasıl tıklanabilir yapabilirim?

Yanıtlar:


20

En kolay yol <object> kullanmamaktır. Bunun yerine bir <img> etiketi kullanın ve çapanın iyi çalışması gerekir.


1
İmg etiketi normalde span etiketinin bu değerin incelikle bozulması için kullanılır.
Adrian Garner

18
Bir svg vektörü görüntüleme fikri bir görüntü değil mi?
Luke

7
@ ErikDahlström ancak <img>svg verilerine referansla, Chrome'un en son sürümünde bile beklediğiniz gibi çalışmaz :( stackoverflow.com/questions/15194870/…
dshap 7:13

15
@Energee'nin işaret ettiği gibi, tıklanabilir hale getirmek için <object>etiketi kullanabilir ve a ekleyebilirsiniz point-event: none;. Svg kaynak kodunuza erişimi korur ve dinamik olarak değiştirmenize izin verir.
Antoine

1
Bir kullanmak imgher zaman bir seçenek değildir. Benim durumumda, svg'yi manipüle etmem gerekiyor, ki bu doğru bir şekilde yapılamıyor, imgkullanmam gerekiyor object.
Martijn

216

Aslında, bunu çözmenin en iyi yolu ... <object> etiketinde şunu kullanın:

pointer-events: none;

Not: Reklam Engelleyici eklentisi yüklü olan kullanıcılar, fareyle üzerine gelindiğinde sağ üst köşede sekme benzeri bir [Engelle] alırlar (flash banner ile aynıdır). Bu css ayarları ile, o da gidecek.

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


4
Not: IE, IE 11'e kadar normal öğelerdeki işaretçi olaylarını desteklemez, ancak bunları SVG'de zaten destekliyor. Bkz. Caniuse.com/pointer-events
webdesserts

9
Bu çözümün bir dezavantajı (ve noelmcg'den de bir dezavantajı) SVG dosyanızda: vurgulu seçiciyle CSS kuralları varsa, bu kurallar çalışmayı durduracaktır. Ben Frain tarafından önerilen çözümün bu sorunu yok.
MathieuLescure

6
Bu cevap onaylanmalıdır. imgSvg ile kullanmak dahili SVG stillerini değiştirmek için kullanılamaz hale getirir.
kadavra

3
Bu onaylanmış cevap olmalı! Gerçekten güzel, teşekkürler
Daniel Broughan

5
Mükemmel cevap. Küresel css'de benimkini evrensel hale getirdim. object [type * = "svg"] {pointer-events: none}
Gregor Macgregor

40

Aynı sorunu yaşadım ve bunu şu şekilde çözmeyi başardım:

Nesneyi, blok veya satır içi blok olarak ayarlanmış bir öğe ile sarma

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

Ekleme <a>etiketi:

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

ve <span>etikete:

display: inline-block;

ve <object>etikete:

position: relative; 
z-index: -1

Buradaki bir örneğe bakın: http://dabblet.com/gist/d6ebc6c14bd68a4b06a6

20 numaralı yorum aracılığıyla burada bulundu https://bugzilla.mozilla.org/show_bug.cgi?id=294932


1
Özür diler, ekranı unuttum: nesnenin etrafına sarmak için satır içi blok / blok öğesi
Richard

1
Burada en iyi çözüm!
Baldráni

Bu, bu sorun için en iyi çözümdür ve tüm tarayıcılarda çalışır
Kalpesh Popat

1
Resmin şeffaf
bg'si

Bu benim için çalıştı, ayrıca yükseklik eklemek zorunda kaldım:
Durumumdaki

32

Bunun için kredi almak istiyorum ama burada bir çözüm buldum:

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

çapa için css'e aşağıdakileri ekleyin:

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>

Bağlantı svg ve yedekte çalışır.


2
Bu, en kolay ve en desteklenen çözümdür
Type-Style

3
bunun hala bir sorunu var: SVG işaretçi olayları (animasyonlar) artık çalışmıyor (fareyle üzerine gelme, fareyle üzerine gelme, tıklama)! Hiçbiri nesnesinin kendisi ...: Sadece basit işaretçi-olayları kullanarak gibi
qdev

26

Ayrıca SVG'nizin altına (kapanış </svg>etiketinden hemen önce ) böyle bir şey yapıştırabilirsiniz :

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

Ardından bağlantıyı uygun şekilde değiştirin. Oturduğu SVG'yi kapsamak için% 100 genişlik ve yükseklik kullandım. Tekniğin kredisi Clearleft.com'daki akıllı insanlara gidiyor - ilk kez gördüğüm yer burası.


2
SVG dosyama gömülü bir vurgulu seçici ile css stilleri var. Bu, stili devre dışı bırakmayan tek çözümdür.
MathieuLescure

21

Richard'ın çözümünün basitleştirilmesi. En azından Firefox, Safari ve Opera'da çalışır:

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

Ek çözümler için http://www.noupe.com/tutorial/svg-clickable-71346.html adresine bakın .


3
Teşekkürler, ekranın ebeveynin üzerinde blockveya inline-blocküzerinde ayarlanması gerekiyordu <a>.
element119

İyi bağlantı: noupe.com/inspiration/tutorials-inspiration/… her çözüm için artıları ve eksileri vardır .
Serge Stroobandt

Ayrıca inline-blockbazı durumlarda kullanmam gerekiyordu , ancak blockdiğer durumlarda iyi iş gördüm ; Sanırım çevreleyen bloklara bağlı ...
Gwyneth Llewelyn

9

Bunu tüm tarayıcılarda gerçekleştirmek için @energee, @Richard ve @Feuermurmel yöntemlerinin bir kombinasyonunu kullanmanız gerekir.

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

Ekleme:

  • pointer-events: none; Firefox'ta çalışmasını sağlar.
  • display: block; Chrome ve Safari'de çalışmasını sağlar.
  • z-index: 1; z-index: -1; IE'de de çalışmasını sağlar.

@janaspage Emin değilim ... IE 10'da denemedim. Çalışırsa bana bildirin :)
ChristopherStrydom

@jaepage Önemli değil, çünkü objectartık üst öğesinden daha düşük bir yığınlama bağlamında (altında) olacak.
Jason T Featheringham

bu bir iPhone / mobil cihazda çalışıyor mu? benim için değil. tıklanabilir / dokunulmaz
bafromca

3

Bunu svg dosyasını da düzenleyerek çözdüm.

Aşağıdaki gibi bir tıklama olayı olan bir grup etiketi tüm svg grafiğin xml sarılmış:

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

Çözüm, nesne svg komut dosyasını destekleyen tüm tarayıcılarda çalışır. (svg'yi desteklemeyen tarayıcılar için nesne öğenizin içindeki bir img etiketini varsayılan olarak kullanırsanız, tarayıcıların gamını kapsarsınız)


Onclick'i dış <svg>elemana eklemenin ve onu sarmamanın işe yaramadığını buldunuz mu?
Robert Longson

1
Kök svg öğesinin olaylarını da kullanabilirsiniz. onclick olaylarına ek olarak onmouseout, ontouchstart, ontouchend vb kullanıyorum ... ve kök svg öğesi için onload olayını sık sık kullanıyorum. Aşağıdaki Ben Frain çözümü, tıklama etkinliklerini yakalamak için fazladan bir kapak nesnesi (dikdörtgen) çizmeyi içerir ... Bu yüzden, yalnızca bir tıklama etkinliği elde etmek için şeffaf bir kapak yapmak zorunda kalmadan çizim öğelerinde kendileri olayları almayı gösteren bu çözümü sundum. Özellikle başka bir öğe çizmek istemediğinizde veya bir dikdörtgen yerine mevcut şekle özgü olayları istediğinizde yararlıdır.
Bruce Pezzlo

3

Bu temiz kolay yöntemi denedim ve tüm tarayıcılarda çalışıyor gibi görünüyor. Svg dosyasının içinde:

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


Bu işi yapmak için svg öğesine aşağıdaki 'xlink' ad alanının eklenmesi gerekecektir: xmlns: xlink = " w3.org/1999/xlink "
Mere Development

Diğer çözümlerin hiçbiri benim için işe yaramadı ama bu işe yaradı, vay canına, teşekkürler!
ByteMyPixel

Genellikle bir SVG dosyasını doğrudan değiştirme konusunda hiçbir sorunum olmasa da, senaryomda, aynı SVG'yi birkaç farklı bağlantı için kullanıyorum - yani teorik olarak her biri için farklı bir SVG oluşturmak zorunda kalacağım. Alternatif olarak, elbette, grafik bitini <svg> etiketine satır içi ekleyebilirim, ancak yinelenen koddan nefret ediyorum (elimdeki SVG küçük olmasına rağmen ...)
Gwyneth Llewelyn

0

Sadece kullanma <object>. İşte benim için çalışan bir çözüm <a>ve <svg>etiketler:

<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 Ben tailwind css kullanıyorum.
Ege Hurturk

-5

Javascript ile yapın ve -element onClickiçin object-attribute ekleyin :

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

Bunu çevreleyen <a> etiketleri ile ve olmadan denedim ve bunu çalıştıramıyorum. Linux'ta FF ve Chrome'da denedim. Bunu hangi tarayıcıda denediniz?
iancoleman

6
Bunu denemek ve çalıştığını onaylamak harika olurdu, böylece bunu okuyan diğerleri cevabınızdan emin olabilir. "Çalışmalı" teoride iyi, ama benim için pratikte çalışmalı.
iancoleman

Bunu Windows'ta Chrome 45'te denedim ve iyi çalışıyor gibi görünüyor. Bir sarma bağlantısı olmadan doğrudan bir SVG etiketine onClick'i ekledim. Downvotes neden açıkladı güzel olurdu.
Chase
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.