【问题标题】:How to get rid of unnecessary scrollbars如何摆脱不必要的滚动条
【发布时间】:2015-10-23 11:11:12
【问题描述】:

我有两个 div 一个在另一个里面。

两者都明确设置为相同的高度。

但是外部 div 有一个最大宽度/高度约束和溢出自动。

这可以按我的意愿工作,并且当调整 div 的大小并且内部内容暗淡超过外部 div 时,滚动条就会出现。

问题是从那时起减小两个 div 的大小不会关闭滚动条。

实际上一个滚动条使另一个滚动条保持打开状态。

到目前为止,唯一的解决方法是将内部 div 的大小暂时减小到比外部 div 小 20 像素,然后将其重置为匹配的尺寸。

有没有人知道当内部和外部 div 大小相同时会阻止滚动条保持“开启”的解决方案?

TIA 抢

demo hereJSFiddle

【问题讨论】:

  • 最好提供一些代码或至少创建demo
  • 使内部 div 略大于包含 div。将外部 div 上的溢出设置为隐藏。将内部 div 的宽度设置为 ~110%
  • 外部 div 需要溢出,因为用户必须能够滚动内部内容才能在受限时看到所有内容。由于其他 UI 元素,外部 div 对其有大小限制。当小于其最大值时,外部 div 垂直和水平居中。
  • 如果外层div只有内层div,设置内层div为overflow:scroll,外层div设置为overflow:hidden,使内层div比其父级更宽。用户可以通过拖动、滑动(触摸屏)或鼠标滚轮来滚动内部 div 内容,但滚动条将不可见。
  • 在这种情况下stackoverflow.com/questions/143815/… 每次 div 内容更改时您都必须手动添加溢出检查,并有选择地将 div 的溢出属性设置为在溢出时更改。

标签: javascript html css


【解决方案1】:

当通过脚本更改内容并且浏览器不更新滚动条位置时,这似乎是一个问题。

这里的技巧是通过在操作完成后再次将 overflow 更改为 auto 来强制重排,并且因为它发生得非常快,为了能够让浏览器重新计算对滚动条的需求,你需要稍等片刻。

例如:

window.clickit = function (mode){
    switch(mode){
        case 1:
            ...
            outer.style.overflow = 'hidden';
            setTimeout(fixScroll, 100);
            break;
        case 2:
            ...
            outer.style.overflow = 'hidden';
            setTimeout(fixScroll, 100);
            break;
        case 3:
            ...
            outer.style.overflow = 'hidden';
            setTimeout(fixScroll, 100);
            break;
    }
}
function fixScroll() { outer.style.overflow = 'auto'; }

演示小提琴:http://jsfiddle.net/abhitalks/f9c8orf7/1/

演示片段:

window.clickit = function (mode){
    switch(mode){
        case 1:
            outer.style.height='250px';
            outer.style.width='250px';
            inner.style.height='250px';
            inner.style.width='250px';
            outer.style.overflow = 'hidden';
            setTimeout(fixScroll, 100);
            break;
        case 2:
            outer.style.height='100px';
            outer.style.width='100px';
            inner.style.height='100px';
            inner.style.width='100px';
            outer.style.overflow = 'hidden';
            setTimeout(fixScroll, 100);
            break;
        case 3:
            outer.style.height='150px';
            outer.style.width='150px';
            inner.style.height='150px';
            inner.style.width='150px';
            outer.style.overflow = 'hidden';
            setTimeout(fixScroll, 100);
            break;
    }
}
function fixScroll() { outer.style.overflow = 'auto'; }
#outer{
    height: 150px; width: 150px;
    max-width:200px; max-height:200px;
    overflow:auto;
}
#inner {
    background-image: url('//lorempixel.com/200/200');
}
<div id="outer" style="height:150px;width:150px">
    <div id="inner" style="height:150px;width:150px"></div>
</div>
<button onclick="clickit(1);">bigger</button>
<button onclick="clickit(2);">smaller</button>
<button onclick="clickit(3);">reset</button>

【讨论】:

  • 是的,我喜欢这样,我将超时时间减少到 0,它仍然有效,并且似乎不明显。
  • @blackmamba:是的,超时就足够了。 setTimeout 停止当前执行上下文并为浏览器提供重排/重绘的机会,而与时间参数无关。您可以将其设置为零。
  • 所以似乎使用 setTimeout 翻转溢出值在两个 div 的大小相同并且处于约束值的边缘情况下失败,尽管浏览器不应该显示它所做的滚动条。
【解决方案2】:

将您的 CSS 更改为:

#outer{
max-width:200px;
max-height:200px;
background-color:red;
overflow:hidden;

}

【讨论】:

  • 外部 div 需要溢出,以便滚动条在内部 div 大于外部 div 时显示。根本没有滚动条不是一种选择。当两个 div 大小相同时,我只需要没有滚动条,而当内部 div 较大时,我需要滚动条。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2020-11-01
相关资源
最近更新 更多