Применить анимацию в CSS на SVG при нажатии кнопки

#javascript #css #reactjs #svg

#javascript #css #reactjs #svg

Вопрос:

Предположим, у меня есть файл SVG static.svg :

 <svg class="machine-svg" width="100%" height="100%" viewBox="200 173 1784 1444" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<desc>Created with Sketch.</desc>
<defs>
    <rect id="path-1" x="0" y="16" width="118" height="63"></rect>
    <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="118" height="63" fill="white">
        <use xlink:href="#path-1"></use>
    </mask>
    . . . more elements here (my SVG file is so long I can't possibly paste it here) 
</svg>
  

и другой CSS animation.css -файл, содержащий анимации указанного SVG.

 .machine-svg{
  width: 100%;
  height: 100%;
  position: relative;
}

@media screen and ( max-width: -12px ) {
  .figure { transform: translate3D(40%, 50px, 0); }
}

@keyframes fall {
  100% { background-position: 0 300px;
  }
}

.shoes {
  transform: translateY(838px) translateX(550px);
  animation: shoes 4s 1.5s linear infinite;
  animation-duration: 15s;
}

@keyframes shoes {
  0% {
    transform: translateY(838px) translateX(550px) scaleY(1.00) scaleX(1.00);
  }
  25% {
    transform: translateY(838px) translateX(957px) scaleY(1.00) scaleX(1.00);
  }
  26% {
    transform: translateY(838px) translateX(957px) scaleY(0.0) scaleX(0.0);
  }
  100% {
    transform: translateY(838px) translateX(957px) scaleY(0.0) scaleX(0.0);
  }

}
. . . . . more animation here (also too long)
  

На странице SVG сначала должен быть статичным, что означает отсутствие анимации.

Таким образом, вариант использования должен быть таким: когда я нажимаю на кнопку на странице, SVG начинает анимироваться: для чего анимация находится в указанном файле CSS.

Возможно ли в Javascript / React загружать анимацию CSS в этот файл при событии нажатия кнопки?

Это была одна из моих попыток. Я попытался импортировать приведенный выше CSS (который я преобразовал в SCSS) в класс в другом файле SCSS.

 import-svg {
  height: 800px;
  width: 800px;
  object-fit: cover;

  amp;--animate {
    @extend .import-svg;
    @import "animation";  //the animation.css above which I made animation.scss
  }
}
  

(Приведенный ниже код является всего лишь макетом и синтезирован, реальный код намного сложнее)

 import React from 'react';
import image from 'images/static.svg'; // The SVG file

class Upload extends Component {
    constructor(props) {
        super(props);
        this.state = {items: []};
    }
    upload() {
        this.setState({ . . adding contents to items here . . });
    }
    render() {
        return (
            <img className={"import-svg"   
                 (this.state.items !== 'undefined' amp;amp; this.state.items.length > 0 ?
                 "--animate" : "")} // The class that contains the imported animation.scss file
                 src={image}></img>
            <button onClick={this.upload.bind(this)}>Upload</button>
        )
    }
}
  

Но это не работает (очевидно). Но вся суть того, что я хочу сделать, похожа на это. Есть идеи о том, как это переработать?

Я также открыт для любых альтернатив, но перекодирование анимации CSS в JavaScript должно быть последним средством, потому что это требует времени (из-за длины кода), а у меня не так много свободного времени.

(У меня также есть одна попытка, когда я превратил код CSS в встроенный стиль React и SVG, отображаемый в компоненте React SVGComponent . Но я понятия не имею, как действовать дальше)

PS. jQuery не разрешен по запросу клиента.

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

1. Это должен быть просто вопрос добавления класса, содержащего анимации (т.е. «обувь») к соответствующему элементу при нажатии кнопки. Вы пробовали это?