所以这个问题是由于多个<Layout /> 组件及其子组件在它们具有不同高度时相互交互的方式而发生的。子 Layout 和 Content 组件似乎总是(不是 100% 总是)从它们的父 Layout 继承高度,或者至少总是具有较小的高度。
目前,您的布局设置如下(伪代码):
<Layout>
<Layout restrictedHeight >
<Layout inheritedRestrictedHeight>
<Content inheritedRestrictedHeight >
<div unrestrictedHeight />
</Content> //Content "height" ends here
<Footer fixedPosition /> //Always begins where Content ends
//Div "height" ends here
</Layout>
</Layout>
</Layout>
由于 footer 的实现方式,在 DOM 中它被放置在 Content 之后,但由于大 div 的 DOM 对象高度不受限制,它在 Content 容器下方结束。这就是为什么Footer 组件似乎呈现在内容中间的原因。
原因是这一行:
<Layout hasSider={true} style={{ height: "100vh", marginTop: 64 }}>
您将 height 属性设置为 100vh,表示 100% 的视图高度,这实际上只是屏幕 y 轴上当前可用的像素数。
您希望包含的布局对象不是 100% 的视图高度,而是页面上所有内容的完整大小,即使是屏幕外的内容。为此,只需将高度设置为 100% 而不是 100vh:
<Layout hasSider={true} style={{ height: "100%", marginTop: 64 }}>
编辑:
这也可以解决您的双滚动条问题。
非滚动侧边栏的更新和答案
我终于有机会看到这个了,这就是你需要给Sider 组件一个设置在屏幕上显示的高度的地方。
组件以 div 的形式呈现给 DOM,其中包含的内容高度相同。对浏览器来说,它并不关心它的那一部分不在屏幕上,因为你实际上是在告诉浏览器它应该是那么大。
为了让侧边栏滚动,您需要将高度限制为该空间的大小(在导航栏的右下方到屏幕底部)。为此,您需要计算 100vh 减去侧边栏的 css/less 中导航栏的大小:height: calc(~"100vh - 64px");,并确保 overflow-y 为自动。
.sidebar {
// fixed sider
overflow-y: auto;
overflow-x: hidden;
height: calc(~"100vh - 64px");
position: fixed;
left: 0;
}
这是更新后的codesandbox
以后尽量把你的问题集中在一个主要问题上,这样会得到更好的答案。