元素上的动画未应用

时间:2016-01-31 11:56:39

标签: javascript css animation reactjs

我有一个react组件,我在其中动态添加一些元素:

addElement( reactComponent, imgurl, e, layer ) {
    const elementWrapper = document.createElement( 'span' );
    const { dispatch } = this.props;
    const element = document.createElement( 'img' );
    const [ x, y ] = this.getMousePositionInsideTheElement( banner, e );

    elementWrapper.style.position = 'absolute';
    elementWrapper.id = layer.name;

    element.src = imgurl;
    element.onload = function () {

        element.classList.add( layer.name.split('.')[0] );
        element.style.height = '50px';
        element.style.width = '50px';
        elementWrapper.style.top = `${y - 50 / 2 }px`;
        elementWrapper.style.left = `${x - 50 / 2}px`;

        element.onclick = () => dispatch( setSelectedLayer( layer ) );

        elementWrapper.appendChild( element );
        reactComponent.appendChild( elementWrapper )
    }
}

根据用户输入,我动态创建style元素并将其附加到head

updateScene( stylesheet ) { let style = document.createElement( 'style' ); style.type = 'text/css'; style.innerHTML = getCSS( stylesheet ); document.getElementsByTagName( 'head' )[ 0 ].appendChild( style ); }

元素的css属性已正确更新,元素也会更新,例如如果用户更改高度和宽度,我会生成一个新的css并将其附加到头部,正确应用css规则并更新“场景”中的元素。但animations并没有发生这种情况,尽管它们似乎是正确的(它们适用于Codepen)。

我生成的CSS就像:

img.CZ6kGtDWwAAcrG4 {
  height: 200px;
  widht: 200px;
}

.CZ6kGtDWwAAcrG4 {
  width: 100px !important;
  height: 100px !important;
  border-top-width: 10px;
  animation-name: cz6kgtdwwaacrg4-octopus-animation;
  animation-iteration-count: 15;
  animation-duration: 5s;
}

@keyframes cz6kgtdwwaacrg4-octopus-animation {
  9% {
    border-top-style: solid;
  }

  42% {
    border-top-style: solid;
  }

  70% {
    border-top-width: 30px;
    border-top-color: red;
    border-top-style: solid;
  }
}

知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

我设法使用React.createElement而不是document.createElement来解决问题

    const reactElementOptions = {
        style: {
            height: '50px',
            width: '50px'
        },
        className: layer.name.split('.')[0],
        src: imgurl
    };

    const reactElement = React.createElement( 'img', reactElementOptions );

    const reactElementWrapperOptions = {
        id: layer.name,
        style: {
            position: 'absolute',
            top: y,
            left: x
        },
        onClick: () => dispatch( setSelectedLayer( layer ) )
    };
    const reactElementWrapper = React.createElement( 'span', reactElementWrapperOptions, reactElement );

    this.state.elements.push( reactElementWrapper );

    this.setState( {
        elements: this.state.elements
    } );

然后map加入组件而不是append

            {
                this.state.elements.map( ( el ) => el )
            }