随着div位置的变化,为div设置动画效果

时间:2019-03-02 06:36:57

标签: reactjs css-transitions

我有一个绝对定位的div:

class MyDiv extends React.Component {
  state = {
    stepCount: 0
  };

  componentDidMount(){
    setInterval(() => {
      this.setState({ stepCount: this.state.stepCount + 1 })
    }, 1000);
  }

  render(){
    return (<div style={{ left: this.state.stepCount * 10 + "%" }} />);
  }
}

CSS
div { transition: 1s linear; }

每秒,我将div左移10%。 我希望过渡看起来平滑,但会有一点停顿。

示例: https://codepen.io/anon/pen/QoNGbQ

2 个答案:

答案 0 :(得分:0)

使用css转换代替动画的位置。性能更高。

  render(){
    return (<div style={{ transform: `translateX(${this.state.step * 3 + "%"})`}} />);
  }

请参阅有关媒体的this文章

答案 1 :(得分:0)

使用CSS转换或诸如react-spring之类的模块可能是最好的选择,但是如果它们都不适合您,那么您就需要requestAnimationFrame

(CSS转换可能会使文本模糊CSS transition effect makes image blurry / moves image 1px, in Chrome?,并且一次性可能不希望外部模块捆绑销售)

https://codesandbox.io/s/pj9m554nkj

const animate = ({ timing, draw, duration }) => {
  let start = performance.now();

  const animateLoop = time => {
    const durationFraction = Math.min(
      1,
      Math.max(0, (time - start) / duration)
    );
    const progress = timing(durationFraction);
    draw(progress);
    if (durationFraction < 1) {
      requestAnimationFrame(animateLoop);
    }
  };

  requestAnimationFrame(animateLoop);
};

const MovingDiv = ({ move, duration }) => {
  const [pos, setPos] = useState(0);
  useEffect(() => {
    animate({
      timing: fraction => move * fraction,
      draw: progress => setPos(progress),
      duration
    });
  }, []);

  return <div className="MovingDiv" style={{ left: pos }} />;
};

然后,您也可以在计时功能中以easyIn / easeOut开始播放,以增加弹力。.https://codesandbox.io/s/2w6ww8oymp