【问题标题】:React hover animation based on class基于类的 React 悬停动画
【发布时间】:2016-10-19 22:37:02
【问题描述】:

到目前为止,我已经就这个组件和悬停问题提出了一些问题。我的下一个也是最后一个问题是关于悬停动画。

我有一个名为 .eye-container & 的默认类,然后是 .eye-container-hover

在悬停时为这种过渡设置动画的最佳方式是什么。这是我的 Item 组件:

import React from 'react';
import { Link } from 'react-router';

import Eyecon from '../../static/eye.svg';


class Item extends React.Component {
    constructor(props) {
        super(props);
        this.displayName = 'Item';
        this.state = {
            hover: false
        };
    }
    mouseOver(){
        this.setState({hover: true});
    }
    mouseOut() {
        this.setState({hover: false});
    }
    render() {
      const { item, i } = this.props;
        return (
            <div className="grid-box" onMouseOver={this.mouseOver.bind(this)} onMouseOut={this.mouseOut.bind(this)}>
                <Link to={`/view/${item.id}`}>
                    <div className="eye-container">
                        <img src={Eyecon}/>
                    </div> 
                    <div className="grid-image">
                        <img src={item.image} alt="" className="fade-in img"></img>
                    </div>
                    <div className="columns">
                        <div className="column">
                            <h2>{item.title}</h2>
                        </div>
                        <div className="column">
                            <h3>Type:</h3>
                            <p>{item.type}</p>
                        </div>
                    </div>
                </Link>
            </div>
        )
    }
}


export default Item;

这是我的“get-to-know-react”项目。希望有人能帮忙。

【问题讨论】:

  • 你到底想用悬停效果实现什么?一个标准的 CSS :hover 伪类就足够了吗?
  • @TimoSta 我想更改位置、z-index 和高度。
  • 这完全可以通过 CSS 的 :hover pseudo-class 来实现。这使您可以显着整理 JavaScript 代码。
  • @TimoSta 但我正在尝试影响 .eye-container 类
  • 这不起作用,因为...?

标签: javascript css reactjs


【解决方案1】:

使用纯 CSS 及其 :hover 伪类可以更简单、更简洁地解决您想要实现的目标:(点击 Run code sn-p 按钮)

.blackbox {
  width: 100px;
  height: 100px;
  background: black;
  z-index: 1;
  position: absolute;
}

.blackbox:hover {
  z-index: 3;
  height: 120px;
  width: 120px;
}

.redbox {
  width: 100px;
  height: 100px;
  background: red;
  z-index: 2;
  position: absolute;
  left: 70px;
  top: 70px;
}
<div class='container'>
  <div class='blackbox'></div>
  <div class='redbox'></div>
<div>

编辑:您还可以更改,例如元素的兄弟元素使用正确的 CSS 选择器:

.blackbox {
  width: 100px;
  height: 100px;
  background: black;
  z-index: 1;
  position: absolute;
}

.blackbox:hover + div {
  z-index: 0;
  height: 120px;
  width: 120px;
}

.redbox {
  width: 100px;
  height: 100px;
  background: red;
  z-index: 2;
  position: absolute;
  left: 70px;
  top: 70px;
}
<div class='container'>
  <div class='blackbox'></div>
  <div class='redbox'></div>
<div>

【讨论】:

  • 如何将鼠标悬停在黑框上并为红框设置动画?
  • 它在 sn-p 中工作,但对我不起作用。这是我用的。 .grid-box:hover + .eye-container { 高度:500px;位置:相对; }
  • eye-container 不是 grid-box 的子级。
  • 这是因为+ 选择器引用了元素的直接兄弟。您尝试连接的两个元素没有兄弟姐妹。
  • @TimoSta 我可以控制动画的持续时间吗?动画可以用css慢慢发生吗?
【解决方案2】:

如果您没有依赖交互,我建议您使用纯 CSS。我的意思是 - 您没有在动画之前或之后触发的任何同步交互 - 你的动画完全基于 CSS,不需要 JS。

您可以使用 react 向元素添加/删除悬停类,这样可以更好地控制动画。

.eye {}
.eyeContainer.lookAround .eye{ ..animate.. }
.eyeContainer.blink .eyelid {} // you can do a timer to change its state

我建议你使用 classnames 模块,这样你就可以使用 state 来改变类,并且在同一个组件中包含所有 css,所以你不需要管理多个文件

<eye className={classnames({
         blink: this.state.blink,
         rotate : this.state.rotate
})} />

为了简单起见,或者只是纯 css

.eye {
    z-index:1;

}
.eye:hover + .eyelid.blink{
    z-index:10
    height: 0
    animate: height 2s
}

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 2022-01-09
    • 2020-10-14
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多