зробити об’єкт htg svg також посиланням, яке можна натиснути


143

Я маю об’єкт SVG на своїй HTML-сторінці і загортаю його у якір, тому при натисканні на зображення 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, щоб це граціозно зменшилось.
Адріан Гарнер

18
Хіба не ідея відображати вектор SVG, а не зображення?
Лука

7
@ ErikDahlström , але <img>з посиланням на дані SVG не завжди працює , як ви очікуєте, навіть в останній версії Chrome :( stackoverflow.com/questions/15194870 / ...
dshap

15
Як @energee вказував на це, ви можете використовувати <object>тег та додати, point-event: none;щоб зробити його доступним для натискання. Він зберігає доступ до вихідного коду svg і дозволяє динамічно ним маніпулювати.
Антуан

1
Використання imgне завжди є варіантом. У моєму випадку мені потрібно маніпулювати svg, що не можна правильно виконувати через img, я повинен використовувати object.
Martijn

216

Насправді, найкращий спосіб вирішити це - у тезі <object> використовуйте:

pointer-events: none;

Примітка. Користувачі, у яких встановлений плагін рекламного блокування, після наведенного курсору наведіть на зразок вкладку [Блок] у верхньому правому куті (те саме, що отримується флеш-банер). Встановивши цей css, він також піде.

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


4
Примітка: IE не підтримуватиме події покажчика на регулярних елементах до IE 11, але вже підтримує їх у SVG. Див caniuse.com/pointer-events
webdesserts

9
Недолік цього рішення (і того, що є, і від noelmcg) - якщо ваш файл SVG містить правила CSS із селектором: навести курсор, ці правила перестануть працювати. Рішення, запропоноване Бен Фрейном, не має цієї проблеми.
MathieuLescure

6
Це має бути затвердженою відповіддю. Використання imgз SVG робить непридатним для зміни внутрішніх стилів SVG.
кадавр

3
Це має бути затвердженою відповіддю! Дійсно приємно, дякую
Даніель Бруган

5
Чудова відповідь. Я зробив свою універсальну з цим у глобальному css. object [type * = "svg"] {pointer-events: none}
Грегор Макгрегор

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
Вибачте, забув дисплей: вбудований / блоковий елемент, щоб обернутись навколо об’єкта
Річард

1
Найкраще рішення тут!
Балдрані

це найкраще рішення цієї проблеми і працює на всіх браузерах
Kalpesh Popat

1
якщо зображення має прозорий bg, то ці біти не можна натискати
sobelito

Це працювало для мене, я також повинен був додати висоту: 100% до елементів a і span в моїй ситуації
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>

Тоді просто змініть посилання на відповідний варіант. Я використовував 100% ширину та висоту, щоб покрити SVG, в якому він сидить. Заслуга на техніку - це розумні люди на Clearleft.com - саме там я вперше побачив, як це використовували.


2
У мене є стилі css із перемикачем курсора, вбудованим у мій файл SVG. Це єдине рішення, яке не деактивує стиль.
MathieuLescure

21

Спрощення рішення Річарда. Принаймні працює у 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>.
елемент119

Хороше посилання: noupe.com/inspiration/tutorials-inspiration/… має плюси та мінуси кожного рішення.
Серж Стройбандт

Мені також потрібно було користуватися 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 / мобільному телефоні? не для мене. не можна натискати / натискати
bafromca

3

Я вирішив це, редагуючи також файл SVG.

Я загорнув xml усієї графіки svg у тег групи, який має подію кліку наступним чином:

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

Рішення працює у всіх браузерах, які підтримують скрипт об'єкта svg. (за замовчуванням тег img всередині вашого об'єктного елемента для веб-переглядачів, які не підтримують svg, і ви покриєте гаму браузерів)


Чи виявили ви, що додавання onclick до зовнішнього <svg>елемента і взагалі його обгортка не спрацювало?
Роберт Лонгсон

1
Ви також можете використовувати події кореневого svg елемента. Окрім подій onclick, я використовую onmouseout, ontouchstart, ontouchend і т. д. ... а для елемента root 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 tailwind.
Еге Хуртурк

-5

Зробіть це за допомогою JavaScript та додайте 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>, і без них, і я не можу змусити це працювати. Я спробував у FF та Chrome на Linux. У якому браузері ви спробували це?
iancoleman

6
Було б чудово, якби ви могли спробувати і підтвердити, що він працює, щоб інші, хто читав це, могли бути впевнені у вашій відповіді. "Це повинно працювати" теоретично чудово, але для мене воно має працювати на практиці.
iancoleman

Я просто спробував це на Chrome 45 в Windows, і, здається, він працює добре. Я додав onClick безпосередньо до тегу SVG без обгорткового якоря. Було б добре, якби низові пояснили, чому.
Чейз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.