【问题标题】:Box-shadow transition not working on scroll框阴影过渡不适用于滚动
【发布时间】:2019-12-10 06:21:58
【问题描述】:

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

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

我在项目中使用 gatsby,但这是一个 react/js 问题,只是说在使用 gatsby 将其应用于项目时是否有任何注意事项。

请注意,我正在使用 styled-components 来设置组件的样式。我正在使用“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 */}
      </>
    );
  }
}

代码沙盒链接:https://codesandbox.io/s/wizardly-cray-44mri

【问题讨论】:

    标签: javascript css reactjs gatsby styled-components


    【解决方案1】:

    您需要做的是随着滚动位置逐渐改变 box-shadow 的不透明度。过渡按时运行,因此不会给用户带来预期的体验 - 即我们可能会遇到用户在断点处停止滚动,然后盒子阴影会慢慢出现的情况。如果 box-shadow 会随着滚动出现,那将是一种更酷的体验。

    您使用样式化组件真是太好了 - 这样我们可以将一个 prop 传递给组件 Header,它将取自应用程序的状态,我们将滚动位置保持为数字。

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

    这样我们将包含一个断点并随着滚动改变 box-shadow 的不透明度。

    这是你的working example

    【讨论】:

    • 我正在考虑这个,但不知道如何实现该功能。这工作得很好,谢谢!
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多