如何更改按钮上的波纹背景颜色?

时间:2019-02-05 00:03:52

标签: javascript reactjs material-ui

到目前为止,在API(v3.9.2)中,我看到TouchRippleProps代表https://material-ui.com/api/button-base/ButtonBase

我的按钮看起来像

<Button variant="text"
                  size={"large"}
                  fullWidth
                  className={classes.button}
          >
            {value}
          </Button>

,我的按钮style是。

 button: {
    backgroundColor: colors.surface,
    borderRadius: 0, // to make buttons sharp edged
    touchRipple: colors.primary
  }

当我触摸按钮时,我看到白色背景(参见数字5)为 enter image description here 我的问题是,当我触摸按钮时,如何将背景从white更改为blue,然后使其消失?

更新enter image description here

2 个答案:

答案 0 :(得分:2)

通过对您的numberPadStyle进行以下更改,我实现了合理的行为:

const numberPadStyle = theme => ({
  button: {
    backgroundColor: colors.surface,
    borderRadius: 0, // to make buttons sharp edged
    "&:hover": {
      backgroundColor: colors.primary,
      // Reset on touch devices, it doesn't add specificity
      "@media (hover: none)": {
        backgroundColor: colors.surface,
        "&:active": {
          backgroundColor: colors.primary
        }
      }
    },
    "&:active": {
      backgroundColor: colors.primary
    }
  }
});

触摸屏的问题在于,触摸会触发“悬停”效果,并且直到您触摸其他地方时,触摸效果才会消失。 "@media (hover: none)"以触摸设备(https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover)的悬停效果为目标。触摸/点击期间,“活动的” CSS有效,然后Button中内置的涟漪处理其余部分。

您当然可以根据需要调整悬停和活动颜色。

Edit Calculator

答案 1 :(得分:-2)

除了波纹之外,没有其他动画。但是,您可以创建类似以下TriggeredAnimation包装器组件的内容:

class TriggeredAnimationWrapper extends Component {
  constructor(...args) {
    super(...args)
    this.state = {
      wasClicked: false
    }
    this.triggerAnimation = this.triggerAnimation.bind(this)
  }

  triggerAnimation(callback) {
    return (...args) => {
      this.setState(
        {wasClicked: true}, 
        () => requestAnimationFrame(()=>this.setState({wasClicked: false}))
      )
      if (callback) return callback(...args)
    }
  }

  render() {
    const {
      triggerAnimation,
      props: {
        children
      },
      state: {
        wasClicked
      }
    } = this.props
    return children({wasClicked, triggerAnimation})
  }
}

并像这样使用它:

<TriggeredAnimationWrapper>({wasClicked, triggerAnimation}) => (
  <Button 
    onClick={triggerAnimation((e) => console.log('clicked', e))}
    className={wasClicked ? 'clicked' : ''}
  />
)</TriggeredAnimationWrapper>

然后,您可以创建一个CSS动画,并在出现click类时更改背景。