javascript - 我可以扩展一个 div 以便 overflow-y :auto scrollbar doesn't clip the div content?

标签 javascript jquery html css

Similar question, without a great answer:
How can I include the width of "overflow: auto;" scrollbars in a dynamically sized absolute div?

我有一个 <div>具有固定高度,充当宽度统一的按钮菜单。用户可以从菜单中添加/删除按钮。当按钮多于 <div> 中垂直放置的按钮时,我希望它变得可滚动 - 所以我正在使用 overflow-y:auto ,当 y 中的内容太大时,它确实会添加一个滚动条。 .不幸的是,当滚动条出现时,它与菜单按钮重叠,并因此添加了一个水平滚动条 - 最大的问题是它看起来很糟糕。

是否有解决此问题的“正确”方法?我很想学习一些样式技巧以使其正常工作(即滚动条位于 div 外部而不是内部,或者 div 在必要时自动扩展以容纳滚动条)。如果需要 javascript,那很好 - 我已经在使用 jQuery - 在这种情况下,检测添加/删除滚动条的正确事件是什么,我如何确保以跨浏览器/跨样式的方式使用正确的宽度?

JSFiddle:http://jsfiddle.net/vAsdJ/

HTML:
<button type="button" id="add">Add a button!</button>
<div id="menu">
</div>

CSS:
#menu{
    background:grey;
    height:150px;
    overflow-y:auto;
    float:left;
}

Script:
$('#add').button().click(function(){
    var d = $('<div/>');
    var b = $('<button type="button">Test</button>');
    d.appendTo($('#menu'));
    b.button().appendTo(d);
});

最佳答案

首先:移除水平滚动条集overflow-x: hidden;正如特伦特斯图尔特已经在另一个答案中提到的那样。

CSS 方法:

我过去做过的一件事是在内容 div 周围添加一个更宽的包装 div,以便为滚动条腾出空间。然而,这仅在您的容器宽度固定时才有效...并且由于滚动条的可变呈现,可能需要在各种浏览器中进行调整(通过提供不同的样式)。

这里是jsfiddle对于你的情况。注意新包装 <div id="menu-wrap">及其固定宽度 width: 95px; .在这种情况下,包装器 div 正在滚动。

您也可以通过在右侧给包装器一些填充来解决这个问题,从而避免固定宽度问题。


jQuery 方法:

另一种选择是使用 jquery 检测溢出,如 here 所述,然后增加 div 的宽度或填充以腾出空间。不过,您可能仍需要针对浏览器进行调整。

这里是jsfiddle为您的示例提供简化版本。这使用您的点击功能在每次点击后检查 div 高度,然后添加一些填充以为滚动条腾出空间; innerHeight 之间的基本比较和 scrollHeight :

if($('#menu').innerHeight() < $('#menu')[0].scrollHeight){
    $('#menu').css( "padding", "0 15px 0 0" );
}

为了使它对跨浏览器更友好,您可以检查滚动条宽度(如概述 here ),然后添加返回值而不是固定填充。这里还有一个jsfiddle进行演示。


可能还有许多其他方法,但这就是我要采用的方法。

关于javascript - 我可以扩展一个 div 以便 overflow-y :auto scrollbar doesn't clip the div content?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21539979/

相关文章:

javascript - 如何使用 Selenium Webdriver 处理从 DOM 中删除的 Web 元素?

PHP 脚本中 echo 内的 JavaScript 函数未调用

javascript - 在 Relay 中包含 Typescript 代码(System.js 导入)

jquery - IE11和IE10中的模糊事件功能

javascript - 在不使用 AJAX 的情况下继续之前等待方法响应

html - 消失菜单并修改 css 容器

javascript - 从 json 响应获取数据需要什么正则表达式或功能

javascript - 提交时获取新创建的列表元素

jquery - CSS/HTML 加载栏

javascript - 底部在复选框单击时显示消息