Как анимировать тег SVG <animate>на Scroll - PullRequest
0 голосов
/ 02 декабря 2018

Как сделать так, чтобы тег svg начал работать только тогда, когда его можно увидеть на экране.Вот практический шорткод, над которым я работаю

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 200">
    <g>
        <rect x="50" y="0" fill="#f00" width="100" height="100">
            <animate id="op1" attributeName="height" from="0" to="100" dur="0.5s" fill="freeze" />
        </rect>
    </g>
</svg>

В данный момент svg анимируется при загрузке страницы.я хочу, чтобы он работал только тогда, когда он отображается на экране.

1 Ответ

0 голосов
/ 02 декабря 2018

Вы можете установить begin="indefinite" для подавления автоматического запуска анимации.Затем в Javascript вы можете использовать метод .beginElement() для запуска анимации в любой момент по вашему выбору.

Вот базовый пример, который принимает событие окна scroll и проверяет, находится ли прямоугольник вокно просмотра, а затем запускает анимацию (только один раз: restart="never").

var op1 = document.querySelector('#op1');
var ticking = false;

// test if element is at least partial in viewport
function isElementVisible (el) {
    var rect = el.getBoundingClientRect();
    return (
        rect.bottom >= 0 ||
        rect.right >= 0 ||
        rect.top <= window.innerHeight ||
        rect.left <= window.innerWidth
    );
}

window.addEventListener('scroll', function () {
    // call only once per animation frame
    if (!ticking) {
        window.requestAnimationFrame(function() {
            // the animated element is the parent of the animate element
            if (isElementVisible(op1.parentElement)) {
                op1.beginElement();
            }
            ticking = false;
        });

        ticking = true;
    }
});
svg {
    position:relative;
    top: 300px;
}
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 200">
    <rect x="50" y="0" fill="#f00" width="100" height="100">
        <animate id="op1" attributeName="height" from="0" to="100"
            begin="indefinite" dur="0.5s" fill="freeze" restart="never" />
    </rect>
</svg>
...