Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Замена цвета элемента SVG туда и обратно при клике

#javascript #css #svg #анимация


Этот вопрос задавался много раз и есть хорошие решения при помощи использования javascript,
например такой код:



var shapeClick = document.getElementById("shape").addEventListener("click", changeColor);
var clicks = 0;
function changeColor(){
  if (shape.style.fill == "rgb(29, 172, 249)")
  {
    shape.style.fill = "rgb(255, 0, 0)";
  }
  else {
    shape.style.fill = "rgb(29, 172, 249)";
  }
}
>
Всё отлично работает, с помощью скриптов можно сделать очень много. Внимание вопрос Как сделать тоже самое на чистом SVG (SMIL), не используя javascript и CSS. Просто сменить цвет по клику не составляет труда: Но как сменить цвет обратно, повторно кликая по объекту не приходит в голову.


Ответы

Ответ 1



if (shape.style.fill == "rgb(29, 172, 249)") Так лучше не надо. А то кто-нибудь вернёт 1DACF9 вместо rgb(29, 172, 249) и всё. Как сделать тоже самое на чистом SVG, SMIL не используя - javascript, CSS label { display: block; } #red { display: none; } svg { width: 250px; display: block; } #shape { fill: green; stroke: black; stroke-width: 2; } #red:checked + svg #shape { fill: red; } где и как обрабатывается клик по элементу? В примере выше получился клик по всему svg. Чтобы это исправить, можно воспользоваться pointer-events. label { display: block; width: 100%; height: 100%; pointer-events: none; } #red { display: none; } svg { width: 250px; display: block; } foreignObject svg { pointer-events: none; } #shape { fill: green; stroke: black; stroke-width: 2; pointer-events: all; } #red:checked + svg #shape { fill: red; } Если внутри одного svg надо разместить несколько таких объектов, можно воспользоваться foreignObject, однако следует отметить, что его поддержка браузерами весьма сомнительна. label { display: block; width: 100%; height: 100%; pointer-events: none; } #red { display: none; } svg { width: 250px; display: block; } foreignObject svg { pointer-events: none; } #shape { fill: green; stroke: black; stroke-width: 2; pointer-events: all; } #red:checked + svg #shape { fill: red; }

Ответ 2



Два варианта ответа, но каждый из них не полностью соответствует поставленной задаче. Привожу их, может быть примеры кому-то помогут найти нужный ответ. Вынужден давать их, так как торопят с закрытием вопроса. Решение где-то рядом. Прошу еще немного времени. Первый вариант Click me Второй вариант

Комментариев нет:

Отправить комментарий