【问题标题】:How to make React animation on Hover?如何在 Hover 上制作 React 动画?
【发布时间】:2019-03-08 09:57:46
【问题描述】:

我需要像 example 那样移动菜单项下划线。

使用 jQuery,我会简单地获取菜单项的左侧位置和宽度。然后在悬停时执行stop.animation

我正在尝试用React 制作这样的动画。但我不知道该怎么做。经过谷歌研究,我发现了流行的动画反应运动库。但我找不到如何在悬停时触发动画的方法。

我的任务是在div 悬停时移动蓝色下划线。请帮我找到解决办法。

【问题讨论】:

    标签: javascript reactjs animation react-motion


    【解决方案1】:

    你真的不必用 React 来做。如果您不介意框下方的下划线,可以使用box-shadow 来实现。它还允许您将其稍微模糊一下以获得更多样式。

    .App {
      width: 900px;
      overflow: hidden;
      position: relative;
      padding-bottom: 20px;
    }
    .box {
      width: 200px;
      height: 200px;
      background: #eee;
      border: 1px solid #333;
      float: left;
      margin-right: 10px;
    }
    
    .box:hover {
      box-shadow: 0 10px blue;
      transition: box-shadow 0.3s;
    }
    <div class="App">
      <span class="box"></span>
      <span class="box"></span>
      <span class="box"></span>
      <span class="box"></span>
    </div>

    【讨论】:

    • 作者明确要求提供基于 React 的解决方案。
    • @kamatheuska 说真的?!这也适用于 React。我只是没有将我的代码放入render() 函数中。另外,根据经验,如果不用 JS 也能轻松搞定,那就不要在 JS 里搞。
    • 虽然您的答案在某些情况下可能是有效的,但还是有使用 React 触发动作 onmouseenter 的用例,而不依赖于 CSS。例如,当 UI 中需要副作用时。因此,此答案并未涵盖这一点,因此在这种情况下不应支持 IMO。
    • @kamatheuska 够公平的。但是,您所说的不是OP所要求的。他只要求悬停时的底部边框。我还可以添加onMouseEnter 以获取副作用,没有什么可以阻止您这样做,但是问题中没有提到这一点。我提供了 YAGNI 类型的响应。
    • 想想是什么让某人得出这个答案。那将是标题,其中 REACT 显然是一个要求。所以是的,他确实要求反应相关的答案。它在标题中。
    【解决方案2】:

    您可以使用 css 过渡和下划线的绝对定位条纹来做到这一点。然后在元素悬停时更新条带的 left 属性。

    class App extends React.Component {
      constructor() {
        super()
        this.state = {
          left: 0,
        }
      }
      
      handleMouseEnter = (e) => {
        this.setState({
          left: e.target.getBoundingClientRect().x - 8,
        });
      }
    
      render() {
        return (
          <div className="App">
            <div className="box" onMouseEnter={this.handleMouseEnter} />
            <div className="box" onMouseEnter={this.handleMouseEnter}  />
            <div className="box" onMouseEnter={this.handleMouseEnter}  />
            <div className="box" onMouseEnter={this.handleMouseEnter}  />
            <div className="stripe" style={{ left: this.state.left }}/>
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <App />,
      document.getElementById('root')
    );
    .App {
      width: 900px;
      overflow: hidden;
      position: relative;
      padding-bottom: 20px;
    }
    .box {
      width: 200px;
      height: 200px;
      background: #eee;
      border: 1px solid #333;
      float: left;
      margin-right: 10px;
    }
    .stripe {
      width: 200px;
      height: 10px;
      background: blue;
      position: absolute;
      bottom: 0;
      transition: left 0.3s;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>

    这是codepen上的一个例子

    【讨论】:

    • 谢谢!工作,如此简单!
    • 非常有用。如果您的物品/盒子有不同的宽度,您还可以在 mouseEnter 处理程序handleMouseEnter = (e) =&gt; { this.setState({ left: e.target.getBoundingClientRect().x - 8, width: e.target.offsetWidth }); } 中更新条带的宽度
    • 请注意,当您滚动时,您的解决方案会弄乱条纹的位置。最初我没有注意到,但是当我在 SO 上运行您的内联 sn-p 并滚动 iframe 时,它​​立即将其移动到错误的位置。
    • 在 MDN 上查看更多信息:developer.mozilla.org/en-US/docs/Web/API/Element/… 它与视口相关。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2016-09-30
    • 2015-08-31
    • 2020-07-28
    • 2015-08-13
    相关资源
    最近更新 更多