当滚动页面上的内容时,我希望在导航上添加阴影,以便更轻松地显示内容和导航之间的差异。阴影还应带有过渡效果以使其更平滑。
在断点上方滚动后,在导航中应用盒形阴影时,投影的过渡不起作用。但是,将相同的样式应用于悬停选择器时,过渡有效。
我正在为项目使用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
答案 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