我正在开发一个React应用程序,其中有一个带有选项卡内容的模态框,偶尔需要滚动。然而,问题在于我无法使正确的内容滚动。
模态框分为3个主要部分:
1. 头部 - 应始终可见于模态框顶部
2. 内容 - 应填充在“头部”和“页脚”之间的空间,但不应强制将任一部分隐藏
3. 页脚 - 应始终位于“内容”下方 - 这可能意味着位于模态框底部(如果“内容”填充剩余空间)或位于“内容”下方(如果“内容”未填充空间)
虽然这很容易实现(我已经这样做了),但问题在于“内容”不应该滚动,而是其内部的某些内容应该滚动。以下图片显示了预期行为的两个示例,其中一个具有应滚动的长内容,另一个没有。
我正在使用一个自定义的选项卡组件,在容器内呈现一些内容。这个容器(在下面的图片中是白色的)应该在需要时滚动。
我已经做的最好的可以在以下CodePen和示例代码中找到。我目前能够滚动包含所需可滚动内容的元素,但实际上无法使该内容滚动。如果您检查Pen,您会发现它(出于某种原因)超出了包含元素。
模态框分为3个主要部分:
1. 头部 - 应始终可见于模态框顶部
2. 内容 - 应填充在“头部”和“页脚”之间的空间,但不应强制将任一部分隐藏
3. 页脚 - 应始终位于“内容”下方 - 这可能意味着位于模态框底部(如果“内容”填充剩余空间)或位于“内容”下方(如果“内容”未填充空间)
虽然这很容易实现(我已经这样做了),但问题在于“内容”不应该滚动,而是其内部的某些内容应该滚动。以下图片显示了预期行为的两个示例,其中一个具有应滚动的长内容,另一个没有。
我正在使用一个自定义的选项卡组件,在容器内呈现一些内容。这个容器(在下面的图片中是白色的)应该在需要时滚动。
我已经做的最好的可以在以下CodePen和示例代码中找到。我目前能够滚动包含所需可滚动内容的元素,但实际上无法使该内容滚动。如果您检查Pen,您会发现它(出于某种原因)超出了包含元素。
代码示例
HTML
<div class="modal">
<div class="background" />
<div class="modal_content">
<div class="header">Random header</div>
<div class="tabbed_content">
<div class="tabs">
<div class="tab active">Tab 1</div>
<div class="tab">Tab 2</div>
</div>
<div class="content">
<div class="scrollable">
Tabbed Content
<br /><br /><br /><br /><br /><br />
Another Couple Lines
<br /><br /><br /><br /><br /><br />
More Tabbed Content
<br /><br /><br /><br /><br /><br />
Even More Content!
<br /><br /><br /><br /><br /><br />
Why not more yet!
<br /><br /><br /><br /><br /><br />
Some Ending Content
<br /><br /><br /><br /><br /><br />
Final Content!
</div>
</div>
</div>
<div class='footer'>
<button class='button'>
Done
</button>
</div>
</div>
</div>
CSS
body {
font-family: 'Montserrat', sans-serif;
}
/* Modal wrapper */
.modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
/* Modal background styles */
.background {
position: absolute;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.5)
}
/* Modal content */
.modal_content {
height: 100vh;
display: flex;
flex-direction: column;
width: 85%;
margin: 0 auto;
background-color: white;
}
.header {
margin-bottom: 1rem;
padding: 1rem;
font-size: 125%;
text-align: center;
font-weight: bold;
background-color: #EEEEEE;
border-bottom: 1px solid #CECECE;
}
/* Contains the tabs and content */
.tabbed_content {
display: flex;
flex-direction: column;
align-items: stretch;
}
/* IGNORE */
.tabs {
display: flex;
/* NOTE: Added to stop them from hiding */
flex-shrink: 0;
}
/* IGNORE */
.tab {
flex-grow: 1;
margin-top: 8px;
padding: 0.5rem;
text-align: center;
background-color: #CECECE;
}
/* IGNORE */
.tab.active {
margin-top: 0;
font-weight: bold;
background-color: #EEEEEE;
}
/* Contains the current tab's content */
/* NOTE: This shouldn't scroll */
.content {
padding: 1rem;
background-color: #EEEEEE;
/* NOTE: Currently the closest I can come */
/*overflow: auto;*/
}
/* IMPORTANT: This should scroll if necessary! */
.scrollable {
padding: 0.5rem;
background-color: white;
/* NOTE: Can't get this to scroll */
/*overflow: auto;*/
border: 1px dashed #CECECE;
}
.footer {
display: flex;
flex-align: center;
flex-shrink: 0;
justify-content: center;
margin-top: 1rem;
padding: 1rem;
border-top: 1px dashed #CECECE;
}
/* IGNORE */
.button {
padding: 0.75rem 1rem;
font-size: 90%;
color: white;
background-color: lightseagreen;
border: none;
border-radius: 2px;
cursor: pointer;
}
我快要被这个问题搞疯了(已经浪费了两个小时)。非常感谢您提前的帮助!
另外,我还需要考虑在模态框打开时停止背景滚动...