gpt4 book ai didi

html - 防止绝对定位元素在{ overflow-y : auto } div from triggering scrollbar

转载 作者:太空狗 更新时间:2023-10-29 14:17:36 25 4
gpt4 key购买 nike

有没有办法在设置overflow-y 时防止绝对定位的元素触发滚动条?我的印象是它不会,因为绝对定位的元素通常不会影响父元素的宽度/高度。出于某种原因,这似乎与确定是否在设置 overflow-y: auto 时显示滚动条无关紧要。有没有办法在不将下拉内容放在 DOM 中完全不同的位置的情况下解决这个问题?

我希望只有那些通常会使元素增长的东西能够触发滚动条。

overflow-y problem demonstration

这是显示问题的代码笔:

http://codepen.io/isaksky/pen/zxedXe

最佳答案

IMO 用户代理使用 overflow 在包装器中呈现绝对定位的元素除了visible 这种方式由于性能问题。

因为他们必须根据 containing block 重绘(并更改位置)绝对定位元素在滚动期间。

同样的事情发生在 float 的情况下——见:


一个可能的选择是让绝对定位的元素位置相对于 initial containing block (<html> 元素所在的位置)。

为了实现这一点,我们可以删除 position: relative来自 #dialog-1 ,因此绝对定位元素的包含 block 将是初始包含 block 。它还会随着页面一起滚动。

Example Here

function forAllNodes(nodes, fn) {
Array.prototype.forEach.call(
nodes,
function(node) {
fn.call(node);
}
);
}

var layoutGate = function() {
forAllNodes(
document.querySelectorAll('.dropdown-contents'),
function() {
if (this.classList) this.classList.toggle('hide');
}
);
};

var intervalId = setInterval(layoutGate, 1000);

forAllNodes(
document.querySelectorAll('.toggle-dropdown-btn'),
function() {
var elm = this;
elm.addEventListener('click', function() {
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
}
layoutGate();
}, false);
}
);
.wrapper {
padding-left: 20px;
}

p {
line-height: 1.3em;
}

#dialog-1 {
padding: 10px;
border: 3px solid black;
width: 400px;
min-height: 100px;
max-height: 150px;
overflow-y: auto;
}

.dropdown-control {
/* position: relative; */
margin: 0;
padding: 0;
}

.toggle-dropdown-btn {
padding: 0;
margin: 0;
}

.dropdown-contents {
list-style-type: none;
position: absolute;
/* min-width: 100%; */
width: 400px;
background-color: #81d4fa;
margin: 0;
padding: 0;
border: 1px solid green;
/* top: 100%; */
/* left: 0; */
}

#dialog-2 {
padding: 10px;
border: 3px solid black;
width: 400px;
min-height: 100px;
max-height: 150px;
}

.hide {
display: none;
}
<div class="wrapper">
<h1>Div with overflow-y:</h1>
<div id="dialog-1">
<p>Stuff in Dialog blah blah</p>

<div class="dropdown-control">
<button type="button" class="toggle-dropdown-btn">Toggle Dropdown</button>
<ul class="dropdown-contents">
<li>why</li>
<li>do i </li>
<li>trigger </li>
<li>scroll</li>
</ul>
</div>
</div>

<h1>Normal div, no overflow-y</h1>
<div id="dialog-2">
<p>Stuff in Dialog blah blah</p>
<div class="dropdown-control">
<button type="button" class="toggle-dropdown-btn">Toggle Dropdown</button>
<ul class="dropdown-contents">
<li>this</li>
<li>does not </li>
<li>grow </li>
<li>the div</li>
</ul>
</div>
</div>
</div>

关于html - 防止绝对定位元素在{ overflow-y : auto } div from triggering scrollbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29244426/

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