javascript - 框阴影过渡不适用于滚动

标签 javascript css reactjs gatsby styled-components

当它滚动到页面上的内容时,我希望在导航上有一个投影,以便更容易地显示内容和导航之间的区别。投影也应应用过渡以使其更平滑。

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

我正在为元素使用 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 */}
      </>
    );
  }
}

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

最佳答案

你需要做的是随着滚动位置逐渐改变box-shadow的不透明度。 Transition 是按时运行的,所以它不会给用户带来预期的体验——即我们可能会遇到用户在断点处停止滚动,然后 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
    })`};

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

这是你的 working example

关于javascript - 框阴影过渡不适用于滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312649/

相关文章:

当 UserControl 使用 Ajax 加载时,Javascript 代码不起作用

javascript - 使 HTML5 canvas floodfill 高效

css - 在 SVG 中嵌套常规元素

reactjs - Chrome 扩展 + create-react-app 实时重新加载

reactjs - 带有 React Router v4 的 IIS 规则

javascript - 如何使用 javascript 和模板构建 DOM?

javascript - toggleClass 只工作一次

css - 如何将 2 个 div 彼此居中,其他 div 之间的空间不会随着窗口大小的调整而增加

javascript - 使用 IFrame 和 Javascript 滚动父页面

javascript - 在与 Material UI <TextField/> 一起使用时将 'label' Prop 传递给 Formik <Field/>