gpt4 book ai didi

html - 滚动容器内的右侧固定侧边栏

转载 作者:搜寻专家 更新时间:2023-10-31 08:40:09 24 4
gpt4 key购买 nike

这听起来好像已经被问过一百万次了,但我还没有找到任何能真正解决我试图解决的所有问题的方法。有了这个免责声明,这就是我想要实现的目标:

  1. 侧边栏,固定在右侧
  2. 一个内容区域,可以滚动
  3. 内容区域的滚动条需要在侧边栏的右边
  4. 应该可以显示覆盖
  5. 叠加层也应该是可滚动的
  6. 虽然叠加层可见,但底层内容区域不应滚动
  7. 显示带有滚动条的叠加层不会导致底层内容区域的重新布局,例如因为溢出:隐藏

所有这些要求的组合打破了我尝试过的每个解决方案。

我现在有两个解决方案,它们很接近但还不够好:
解决方案 1 无法解决需求 7。
当叠加层可见时,解决方案 2 有两个滚动条。

解决方案一:

function showOverlay() {
var style = document.body.style;
style.overflow = 'hidden';
document.getElementById('overlay').style.display = 'block';
}

function closeOverlay() {
var style = document.body.style;
style['overflow-y'] = 'scroll';
document.getElementById('overlay').style.display = 'none';
}
* {
margin: 0;
box-sizing: border-box
}
html {
}
body {
position: relative;
width: 100%;
overflow-y: scroll;
}

.content {
position: relative;
display: block;
background-color: lightblue;
border: 2px solid white;
width: calc(100% - 60px)
}

.fixed {
position: fixed;
top: 0;
right: 0;
bottom: 0;
z-index: 1000;
background-color: lightgreen;
width: 60px;
border: 2px solid black;
text-align: right;
}

#overlay {
display: none;
position: fixed;
z-index: 10000;
left: 0;
top: 0;
bottom: 0;
right: 0;
background-color: rgba(32,32,32,0.5);
overflow-y: scroll;
}

.overlay-content {
margin: 50px auto;
height: 1000px;
width: 80%;
background-color: yellow;
}
<div class="content">
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
<button onclick="showOverlay()">show overlay</button>
</div>
<div class="fixed">A<br/>B<br/>C</div>
<div id="overlay">
<div class="overlay-content">
<button onclick="closeOverlay()">Close overlay</button>
</div>
</div>

解决方案 2:

function showOverlay() {
var style = document.body.style;
style.top = '-' + document.documentElement.scrollTop + 'px';
style.position = 'fixed';
document.getElementById('overlay').style.display = 'block';
}

function closeOverlay() {
var style = document.body.style;
style.position = 'relative';
style.top = 0;
document.getElementById('overlay').style.display = 'none';
}
* {
margin: 0;
box-sizing: border-box
}
html {
}
body {
position: relative;
width: 100%;
overflow-y: scroll;
}

.content {
position: relative;
display: block;
background-color: lightblue;
border: 2px solid white;
width: calc(100% - 60px)
}

.fixed {
position: fixed;
top: 0;
right: 0;
bottom: 0;
z-index: 1000;
background-color: lightgreen;
width: 60px;
border: 2px solid black;
text-align: right;
}

#overlay {
display: none;
position: fixed;
z-index: 10000;
left: 0;
top: 0;
bottom: 0;
right: 0;
background-color: rgba(32,32,32,0.5);
overflow-y: scroll;
}

.overlay-content {
margin: 50px auto;
height: 1000px;
width: 80%;
background-color: yellow;
}
<div class="content">
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
Body<br/>
<button onclick="showOverlay()">show overlay</button>
</div>
<div class="fixed">A<br/>B<br/>C</div>
<div id="overlay">
<div class="overlay-content">
<button onclick="closeOverlay()">Close overlay</button>
</div>
</div>

我认为解决方案 1 是两者中较好的一种,但是否有可能阻止重新布局的发生?

请注意,我正在尝试找到一种无需使用 Javascript 检测滚动条宽度即可工作的解决方案。

最佳答案

解决方案是将内容和固定部分包裹起来,防止从body 滚动。

此外,您使用 position: absolute 包装器包装修复部分。区别在于不同的 position 如何处理 right: 0absolute 相对于父级(position: relative),fixed 始终相对于窗口。

此时浏览器将在侧边栏上阻止鼠标滚轮事件(因为 position: fixed)所以我们将添加 .fixed-inner pointer-events: auto 允许用户与侧边栏内容进行交互。

我只在最新的 Chrome 上测试过它。

function showOverlay() {
// var style = document.body.style;
// style.overflow = 'hidden';
document.getElementById('overlay').style.display = 'block';
}

function closeOverlay() {
// var style = document.body.style;
// style['overflow-y'] = 'scroll';
document.getElementById('overlay').style.display = 'none';
}
* {
margin: 0;
box-sizing: border-box
}

html,
body {
position: relative;
height: 100%;
overflow-y: hidden;
}

.wrapper {
overflow-y: auto;
position: relative;
height: 100%;
}

.content {
position: relative;
display: block;
background-color: lightblue;
border: 2px solid white;
width: calc(100% - 60px)
}

.fixed-wrapper {
position: absolute;
top: 0;
right: 0;
width: 60px;
height: 100%;
}

.fixed {
position: fixed;
z-index: 1000;
background-color: lightgreen;
width: 60px;
border: 2px solid black;
text-align: right;
height: 100%;
top: 0;
pointer-events: none;
}

.fixed .fixed-inner {
pointer-events: auto;
}

#overlay {
display: none;
position: fixed;
z-index: 10000;
left: 0;
top: 0;
bottom: 0;
right: 0;
background-color: rgba(32, 32, 32, 0.5);
overflow-y: scroll;
}

.overlay-content {
margin: 50px auto;
height: 1000px;
width: 80%;
background-color: yellow;
}
<div class="wrapper">
<div class="content">
Body<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/> Body
<br/>
<button onclick="showOverlay()">show overlay</button>
</div>
<div class="fixed-wrapper">
<div class="fixed">
<div class="fixed-inner">
<a href="https://google.com">A</a>
<br/>B<br/>C
</div>
</div>
</div>
</div>
<div id="overlay">
<div class="overlay-content">
<button onclick="closeOverlay()">Close overlay</button>
</div>
</div>

关于html - 滚动容器内的右侧固定侧边栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com