Я не уверен, почему вы использовали элементы здесь, когда все, что вам было нужно, это JavaScript-массив Array / JSON или, в конечном итоге, элементы, которые по крайней мере имеют x
, y
, width
и *Атрибут 1006 * по запросу атрибута viewBox
, но хорошо ... давайте разберемся с s затем ...
Чтобы преобразовать значение s point
вашего атрибута в viewBox
атрибут, самый простой - вызвать polygonElement.getBBox()
, который вернет SVGRect с необходимыми значениями.
Чтобы анимировать свойство viewBox
, проще всего использовать анимацию SMIL и полифилл для MSbrowsers.
Вам просто нужно определить элемент , нацеленный на атрибут viewBox
, и обновить его атрибут to
до целевого значения после обновления его from
атрибут текущего значения.
// animate : <animate attributeName="viewBox" ...>
// rect : {SVGRect} result of polygonElement.getBBox();
function animateViewBox(animate, rect) {
animate.setAttribute('from', animate.getAttribute('to'));
animate.setAttribute('to', `${rect.x} ${rect.y} ${rect.width} ${rect.height}`);
animate.beginElement(); // (re)start the animation
}
Как только мы это получим, нам нужно только настроить функцию, которая будет перебирать все элементы в svg.
function animateViewBox(animate, rect) {
animate.setAttribute('from', animate.getAttribute('to'));
animate.setAttribute('to', `${rect.x} ${rect.y} ${rect.width} ${rect.height}`);
animate.beginElement(); // (re)start the animation
}
// container
const svg = document.getElementById('svg1413');
// all the <polygons> coordinates (would be better as JSON...)
const polygons = svg.querySelectorAll('polygon');
// <animate> element
const animator = svg.querySelector('.viewBoxAnimator');
// our iterator, we could call it on click
let i = 0;
function iterate() {
if (i < polygons.length) {
animateViewBox(animator, polygons[i++].getBBox());
return true;
}
}
// but we'll automate it
(async() => {
while (iterate()) {
await wait(1500);
}
})();
function wait(time) {
return new Promise(res => setTimeout(res, time));
}
svg {
width: 100%;
height: 100%;
max-width: 100vw;
max-height: 100vh;
transition: all .6s;
}
html {
background: black;
}
<!-- SMIL for IE -->
<script src="https://cdn.jsdelivr.net/gh/Kaiido/FakeSmile@1e50d675df616a8e784e0e6e931b3f0d595367d4/smil.user.js"></script>
<svg id="svg1413" class="svg-pg" width="154" height="83" version="1.1" viewBox="0 0 178 254" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<animate class="viewBoxAnimator" attributeType="XML" attributeName="viewBox" from="0 0 178 254" to="0 0 178 254" dur="0.6s" fill="freeze"/>
<image id="image1966" width="178" height="254" xlink:href="https://i.imgur.com/yiZFUK4.jpg" />
<g id="SvgjsG1413" class="click-panels">
<polygon fill="transparent" points=" 12,13 88,13 88,49 12,49"></polygon>
<polygon fill="transparent" points=" 81,44 166,44 166,74 81,74"></polygon>
<polygon fill="transparent" points=" 12,13 166,13 166,75 12,75"></polygon>
<polygon fill="transparent" points=" 101,80 166,80 166,118 101,118"></polygon>
<polygon fill="transparent" points=" 12,80 166,80 166,147 12,147"></polygon>
<polygon fill="transparent" points=" 12,152 91,152 91,200 12,200"></polygon>
<polygon fill="transparent" points=" 73,171 155,171 155,209 73,209"></polygon>
<polygon fill="transparent" points=" 12,198 79,198 79,235 12,235"></polygon>
<polygon fill="transparent" points=" 12,152 166,152 166,235 12,235"></polygon>
</g>
</svg>