框影过渡在滚动条上不起作用

时间:2019-08-01 15:43:47

标签: javascript css reactjs gatsby styled-components

当滚动页面上的内容时,我希望在导航上添加阴影,以便更轻松地显示内容和导航之间的差异。阴影还应带有过渡效果以使其更平滑。

在断点上方滚动后,在导航中应用盒形阴影时,投影的过渡不起作用。但是,将相同的样式应用于悬停选择器时,过渡有效。

我正在为项目使用gatsby,但这是一个react / js问题,只是说在使用gatsby将其应用于项目时是否应该注意一些警告。

注意,我正在使用样式化组件来对组件进行样式设置。我使用的条件渲染器使用的是CSS:$ {condition && css-style}语法,可用于样式组件。

我已经尝试过使用动画了,但是可以在每次滚动页面时运行。

class App extends Component {
  constructor() {
    super();
    this.state = {
      scrollPos: 0
    };
  }

  componentDidMount() {
    window.addEventListener("scroll", this.updateScroll);
    this.updateScroll();
  }

  componentWillUnmountt() {
    window.removeEventListener("scroll", this.updateScroll);
  }

  updateScroll = () =>
    this.setState({ scrollPos: document.documentElement.scrollTop });

  render() {
    let breakpointScroll = 20;

    const Header = styled.div`
      position: fixed;
      width: 100vw;
      height: 90px;
      background-color: white;
      font-size: 26px;
      color: coral;
      text-align: center;
      transition: all 200ms ease;

      /* Problem here */
      box-shadow: ${this.state.scrollPos >= breakpointScroll &&
        "0px 1px 5px rgba(0, 0, 0, 0.25)"};

      /* This seems to work perfect */
      :hover {
        box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.25);
      }
    `;

    return (
      <>
        <Header>Header</Header>

        <Text>Scroll position: {this.state.scrollPos}</Text>

        {/* IGNORE, content for scroll */}
        <Box />
        <Box backgroundColor="lightblue" />
        <Box />
        {/* IGNORE, content for scroll */}
      </>
    );
  }
}

Codesandbox链接:https://codesandbox.io/s/wizardly-cray-44mri

1 个答案:

答案 0 :(得分:3)

您需要做的是随着滚动位置逐渐改变盒子阴影的不透明度。过渡是按时进行的,因此不会给用户带来预期的体验-也就是说,我们可能会遇到这样的情况,即用户将停止在断点上滚动,然后阴影框会慢慢出现。如果滚动显示方框阴影,那将是一个很棒的体验。

使用样式化的组件非常好-通过这种方式,我们可以将prop传递给组件Header,该标题将从应用程序保持滚动位置为数字的状态中获取。

box-shadow: ${props =>
    `0px 1px 5px rgba(0, 0, 0, ${
      props.scrollPos >= breakpointScroll
        ? `0.25`
        : 0.0125 * props.scrollPos
    })`};

这样,我们将包括一个断点并在滚动时更改框阴影的不透明度。

这是您的working example