代码之家  ›  专栏  ›  技术社区  ›  Matt

对于图像,ReactCSTransition动画不平滑

  •  0
  • Matt  · 技术社区  · 8 年前

    我尝试在React中使用 ReactCSSTransitionGroup .我跟踪了这个 solution 在前面的SO答案中。我有一个包含图像和文本的组件。对于文本,动画是平滑的,但对于图像,动画不是平滑的。看起来图像在动画过程中会闪烁。

    jsfiddle

    js公司

    var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
    
    var items = [
        {id: 1, text: "item1", img: "https://mirrors.creativecommons.org/presskit/icons/cc.large.png"},
      {id: 2, text: "item2", img: "https://mirrors.creativecommons.org/presskit/icons/by.large.png"},
      {id: 3, text: "item3", img: "https://mirrors.creativecommons.org/presskit/icons/nc.large.png"},
      {id: 4, text: "item4", img: "https://mirrors.creativecommons.org/presskit/icons/nc-eu.large.png"},
    ]
    
    function findObjectByKey(array, key, value) {
        for (var i = 0; i < array.length; i++) {
            if (array[i][key] === value) {
                return array[i];
            }
        }
        return null;
    }
    
    var SwitchContent = React.createClass({
        render: function() {
            var obj = findObjectByKey(items, 'id', this.props.id);
            console.log(obj);
    
            return (
                <div>
            <style
                dangerouslySetInnerHTML={{
                  __html: [
                    '.backgroundImg {',
                    '  background: url('+obj.img+');',
                    '  background-size: auto 100px;',
                    '}',
                  ].join('\n'),
                }}
              />
             <div className="backgroundImg" />
             <div className="textContent">{obj.text}</div>
          </div> 
            );
    
        }
    });
    
    var Switch = React.createClass({
        getInitialState: function() {
            return {
                id: 1,
            };
        },
        toggle: function(e) {
            this.setState({ id: this.state.id === 4 ? 1 : this.state.id + 1 });
        },
        render: function() {
            var key = this.state.id;
    
            return (
                <div>
                  <button onClick={this.toggle}>Toggle</button>
                  <ReactCSSTransitionGroup
                  transitionAppear
            transitionAppearTimeout={500}
            transitionLeaveTimeout={500}
            transitionEnterTimeout={500}
                  className="container"
                  transitionName="example">
                    <div key={key} className="item_container">
                      <SwitchContent id={key} />
                    </div>
                  </ReactCSSTransitionGroup>
                </div>
            );
    
        }
    });
    
    React.render(<Switch/>, document.getElementById("switch"));
    

    CSS

    .backgroundImg {
      background-repeat: no-repeat;
      background-position: center center;
      background-color: black;
      width: 100px;
      height: 100px;
    }
    
    .container {
        position: relative;
    }
    .container > div {
        position: absolute;
    }
    .button {
        display: block;
        height: 100px;
        width: 100px;
        border: 1px solid #aaa;
        border-radius: 25px;
        font: bold 20px Helvetica, Arial, sans-serif;
        text-align: center;
        line-height: 100px;
        cursor: pointer;
        color: #fff;
        background-color: #000;
        /* Define transition on the "opacity" property. */    
        transition: opacity 0.5s ease-in;
    }
    .example-enter {
      opacity: 0.01;
    }
    
    .example-enter.example-enter-active {
      opacity: 1;
      transition: opacity 500ms ease-in;
    }
    
    .example-leave {
      opacity: 1;
    }
    
    .example-leave.example-leave-active {
      opacity: 0.01;
      transition: opacity 500ms ease-in;
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Anna Tolochko Love Kumar    8 年前

    尝试设置 transition-delay 的值 .example-enter.example-enter-active CSS类和 ease-in-out 像 transition-timing-function :

    .example-enter.example-enter-active {
        opacity: 1;
        transition: opacity 500ms ease-in-out 500ms;
    }
    
    .example-leave.example-leave-active {
       opacity: 0.01;
       transition: opacity 500ms ease-in-out;
     }
    

    这样看起来更平滑。分叉的 JSFiddle

        2
  •  1
  •   Radu Luncasu    8 年前

    不知道你的小提琴里到底发生了什么,也不知道为什么下一张图片看起来不那么清晰。

    然而,我确实在最新的react和使用生成器中重写了您的示例,并且似乎一切正常。

    你错过了出现类的例子,但我认为还有更多。 您可以在此处查看我的沙盒: https://codesandbox.io/s/zw0xv4vy3x

    如果根据这个工作示例,您能够找出自己的问题所在,那就太好了! 如果没有,请复制(&M);粘贴和你应该是好的。

    js公司

    import React, { Component } from "react";
    import ReactCSSTransitionGroup from "react-addons-css-transition-group";
    import { render } from "react-dom";
    import "./main.css";
    
    function* continuosArrayIterator(arr) {
      let idx = 0;
      while (idx < arr.length) {
        let ret = arr[idx];
        idx++;
        if (idx === arr.length) {
          idx = 0;
        }
        yield ret;
      }
    }
    
    class App extends Component {
      constructor() {
        super();
        this.clickHandler = this.clickHandler.bind(this);
        this.items = [
          {
            id: 1,
            text: "item1",
            img: "https://mirrors.creativecommons.org/presskit/icons/cc.large.png"
          },
          {
            id: 2,
            text: "item2",
            img: "https://mirrors.creativecommons.org/presskit/icons/by.large.png"
          },
          {
            id: 3,
            text: "item3",
            img: "https://mirrors.creativecommons.org/presskit/icons/nc.large.png"
          },
          {
            id: 4,
            text: "item4",
            img:
              "https://mirrors.creativecommons.org/presskit/icons/nc-eu.large.png"
          }
        ];
        this.imageIterator = continuosArrayIterator(this.items);
        this.state = {
          image: this.imageIterator.next().value
        };
      }
    
      clickHandler(event) {
        return this.setState({
          image: this.imageIterator.next().value
        });
      }
    
      render() {
        return (
          <div>
            <button onClick={this.clickHandler}>Next Image</button>
            <ReactCSSTransitionGroup
              transitionAppear={true}
              transitionLeaveTimeout={500}
              transitionEnterTimeout={500}
              className="container"
              transitionName="example"
            >
              <div
                key={this.state.image.id}
                style={{
                  position: "absolute",
                  backgroundImage: `url(${this.state.image.img}`,
                  backgroundSize: "auto 100px",
                  height: "100px",
                  width: "100px"
                }}
              />
            </ReactCSSTransitionGroup>
          </div>
        );
      }
    }
    
    render(<App />, document.getElementById("root"));
    

    css

    .container {
      position: absolute;
    }
    
    .example-enter {
      opacity: 0.01;
    }
    
    .example-enter.example-enter-active {
      opacity: 1;
      transition: opacity 500ms ease-in;
    }
    
    .example-leave {
      opacity: 1;
    }
    
    .example-leave.example-leave-active {
      opacity: 0.01;
      transition: opacity 500ms ease-in;
    }
    
    .example-appear {
      opacity: 0.01;
    }
    
    .example-appear.example-appear-active {
      opacity: 1;
      transition: opacity 0.5s ease-in;
    }
    
    推荐文章