сделать объект HTML 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 кликабельным?

iancoleman
источник

Ответы:

20

Самый простой способ - не использовать <объект>. Вместо этого используйте тег <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.
Мартейн
216

На самом деле, лучший способ решить эту проблему - использовать тег <object>:

pointer-events: none;

Примечание. Пользователи, на которых установлен плагин Ad Blocker, при наведении курсора получают вкладку [Блок] в правом верхнем углу (то же, что и флэш-баннер). По настройкам этого css, это тоже пройдет.

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

energee
источник
4
Примечание: IE не будет поддерживать события указателя на обычных элементах до IE 11, но уже поддерживает их в SVG. См. Caniuse.com/pointer-events
webdesserts
9
Недостаток этого решения (также как и у noelmcg) состоит в том, что если ваш SVG-файл содержит правила CSS с селектором: hover, эти правила перестанут работать. Решение, предложенное Беном Фрейном, не имеет этой проблемы.
MathieuLescure
6
Это должен быть одобренный ответ. Использование imgс svg делает невозможным изменение внутренних стилей SVG.
Кадр
3
Это должен быть одобренный ответ! Действительно хорошо, спасибо
Дэниел Броун
5
Отличный ответ. Я сделал мой универсальный с этим в глобальном CSS. object [type * = "svg"] {pointer-events: none}
Грегор Макгрегор
40

У меня была та же проблема, и мне удалось решить это:

Обтекание объекта элементом, установленным в block или inline-block

<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
Извиняюсь, забыл отображение: элемент inline-block / block для обтекания объекта
Ричард
1
Лучшее решение здесь!
Baldráni
это лучшее решение для этой проблемы и работает во всех браузерах
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 и запасной вариант.

noelmcg
источник
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-стили с селектором: hover, встроенным в мой 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 для дополнительных решений.

Feuermurmel
источник
3
Спасибо, мне нужно, чтобы дисплей был установлен на blockили inline-blockна родителя <a>.
element119
Хорошая ссылка: 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 также.
ChristopherStrydom
источник
@janaspage Я не уверен ... Я не пробовал это в IE 10. Дайте мне знать, если это работает :)
ChristopherStrydom
@jaepage Это не должно иметь значения, потому objectчто теперь он будет в более низком стэк-контексте (ниже), чем его родитель.
Джейсон Ферингем
это работает на iPhone / мобильном телефоне? не для меня. не кликабелен /
неактивен
3

Я решил это, отредактировав файл SVG тоже.

Я обернул xml всей графики svg в групповой тег с событием click следующим образом:

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

Решение работает во всех браузерах, которые поддерживают объектный SVG-скрипт. (по умолчанию тег img внутри вашего объекта object для браузеров, которые не поддерживают svg, и вы охватите весь спектр браузеров)

Брюс Пеццло
источник
Считаете ли вы, что добавление onclick к внешнему <svg>элементу и полное его отсутствие не работает?
Роберт Лонгсон
1
Вы также можете использовать события корневого элемента svg. в дополнение к событиям onclick я использую onmouseout, ontouchstart, ontouchend и т. д., а в качестве корневого элемента svg я часто использую событие onload. Приведенное ниже решение Бена Фрейна включает рисование дополнительного объекта обложки (прямоугольника) для захвата событий щелчка ... поэтому я предложил это решение, показывающее получение событий на самих элементах чертежа без необходимости создавать прозрачную крышку только для получения события щелчка. Особенно полезно, когда вы не хотите рисовать другой элемент или хотите, чтобы события были специфичны для существующей фигуры, а не для прямоугольника.
Брюс Пеццло
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 "
Mere Development
Ни одно из других решений не сработало для меня, но это сработало, вот так, спасибо!
ByteMyPixel
Хотя обычно у меня нет никаких сомнений по поводу непосредственного изменения файла SVG, в моем сценарии я использую один и тот же SVG для нескольких разных ссылок, то есть теоретически мне придется создавать разные SVG для каждой. В качестве альтернативы, конечно, я мог бы добавить встроенный графический бит в тег <svg>, но я ненавижу дублирующий код (даже если фактический SVG у меня небольшой ...)
Гвинет Ллевелин
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>
Эге Хуртурк
источник
Кстати, я использую попутный ветер.
Эге Хуртурк
-5

Сделайте это с помощью javascript и добавьте onClick-attribute к вашему object-element:

<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. В каком браузере вы пробовали это?
Янколеман
6
Было бы здорово, если бы вы попробовали это и подтвердили, что это работает, чтобы другие, кто читает это, могли быть уверены в вашем ответе. «Это должно работать» - хорошо в теории, но для меня это должно работать на практике.
Янколеман
Я только что попробовал это на Chrome 45 на Windows, и, кажется, работает нормально. Я добавил onClick непосредственно в тег SVG без привязки. Было бы хорошо, если бы отрицательные мотивы объяснили почему.
Погоня