防止Chrome浏览器中滚动条加宽页面的方法

240

我在Chrome上保持我的 .html 页面的宽度一致遇到了小问题。

例如,我有一个页面 (1) 有大量内容超过视窗的高度(这个词对吗?),所以在该页面 (1) 上有一个垂直滚动条。在页面(2)上,我有相同的布局(菜单、div等),但是内容较少,因此没有垂直滚动条。

问题在于,在页面(1) 上,滚动条似乎会将元素稍微向左推(增加宽度?),而在页面(2)上,一切都显示为居中状态。

我还是一个HTML/CSS/JS初学者,我相信这并不是很难解决,但是我一直没有找到解决方案。在IE10和FireFox上可以按预期工作,只有在Chrome上出现了这个问题。


1
这是一个非常烦人的问题,直到我切换到在Windows编码时遇到了滚动条占用屏幕空间并持续存在。Mac的滚动条会消失并不会增加宽度。 - Fydo
1
在 https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-gutter 中指定了 scrollbar-gutter: stable both-edges;。如果没有滚动条,则沟槽将被绘制为填充的扩展部分。 - daniel p
在Chrome浏览器上对我不起作用。如果出现垂直滚动条,可能会导致水平滚动条出现。 - David Spector
这里有一个很好的解决方案:https://dev.to/rashidshamloo/preventing-the-layout-shift-caused-by-scrollbars-2flp - undefined
20个回答

173

免责声明: overlay已被废弃
如果你非常需要,仍然可以使用它,但尽量避免使用。

这仅适用于WebKit浏览器,但我很喜欢它。 在其他浏览器上会像auto一样运行。

.yourContent{
   overflow-y: overlay;
}

这将使滚动条仅以 覆盖 的形式出现,因此不会影响您的元素的 宽度


它在IE11上无法工作。是否有任何解决方法使覆盖值在IE中正常工作? - Anvesh Reddy
据我所知,你将不得不使用本主题中提出的其他选项来解决IE的问题。 - simonDos
天才,你修复了一些关于body尺寸的bug(在调用body::-webkit-scrollbar时)。 - Nikola Lukic
3
但它已被弃用。 - Akash Yellappa
3
我更新了解决方案以反映出这一点。有点难过 :P - simonDos
显示剩余2条评论

77

你需要做的就是添加:

html {
    overflow-y: scroll;
}
在您的CSS文件中,这将具有滚动条,无论是否需要,尽管您将无法滚动。
这意味着视口的宽度将是相同的。

11
那么,我需要在两者上都添加滚动条吗?难道没有一种方法可以忽略垂直滚动条的宽度吗?谢谢! - Acemad
我不知道有什么方法可以忽略它,但是我说的方法非常有效。@Rockr90 - Hive7
@d3c0y 这是真的,我在答案中已经提到了,但这是最简单的方法。然而,我不知道在过去的三年里是否有所改变。 - Hive7
1
@aks。它强制浏览器认为你可以滚动,因此启用了滚动条和垂直滚动栏。 - Hive7
2
overflow-y: scroll; 将在所有视口中添加/显示滚动条,即使没有可滚动的元素。 - Abhilash KK
显示剩余2条评论

74

可能

html {
    width: 100vw;
}

就是你想要的。


5
我过去36小时一直在调整滚动条,尝试了几种不同的解决方案,虽然有些方法有效,但也带来了其他问题。这是第一个既能够解决问题又允许我在其他地方使用普通滚动条的解决方案。谢谢。 - kosher
1
这个很好用,请问有人可以解释一下它是怎么工作的吗? - Zeus
1
它只是将根HTML节点(<html>)的宽度设置为100个视口宽度单位。也就是浏览器窗口的100%宽度。 - Neurotransmitter
3
解决方案还不错,但可以添加水平滚动。 - FDisk
1
这是一个很棒的解决方案,同时添加 overflow-x: hidden; 也非常有帮助! - rlf89
显示剩余6条评论

67

6
非常好,终于有比这些 hack 更好的解决方案了。both-edges 在我的文本区域左侧造成了填充。因此,我只需使用 scrollbar-gutter: stable; 即可。 - Avatar
不错,我不知道这是可能的,谢谢分享 ^^ - RolandMakkelie
今天发生的最好的事情哈哈。当然,Safari因为一个bug而移除了支持,这使得它变得不那么完美。希望未来Safari能够重新添加支持。 - aderchox
这个在Chrome中对我有效。在Ms Edge中也有效。对于Safari不太确定,但目前为止还不错。在使用Chromium作为其浏览器引擎的Responsively应用程序上也有效。 - Cosmas Ochieng
似乎还不能在Firefox上运行。 - Avatar
实际上,我在Windows上使用FF时一切都很正常。你用的是哪个操作系统? - Christian

52

您可以获取滚动条的大小,然后将边距应用于容器。

类似这样:

var checkScrollBars = function(){
    var b = $('body');
    var normalw = 0;
    var scrollw = 0;
    if(b.prop('scrollHeight')>b.height()){
        normalw = window.innerWidth;
        scrollw = normalw - b.width();
        $('#container').css({marginRight:'-'+scrollw+'px'});
    }
}

用于去除水平滚动条的CSS:

body{
    overflow-x:hidden;
}

试着看看这个:http://jsfiddle.net/NQAzt/


1
聪明的解决方案,不过我不理解 'if' 语句中的条件! - Acemad
5
scrollHeight是一个元素的总高度,包括可见和隐藏部分。例如:如果你的窗口高度为500像素,而body里面的内容为900像素,则会显示500像素,剩余的400像素将被隐藏,并出现滚动条以显示这些隐藏的像素。所以条件是:“如果所有内容的高度大于视口高度,则向body添加边距”。抱歉我的英语不好。 - Lwyrn
我现在明白了,感谢清晰的解释。我尝试了这个解决方案,但出现了一个额外的水平滚动条,不知道为什么。 - Acemad
2
我已经添加了一小段CSS来防止在回复中出现这种情况 :) - Lwyrn
4
这个解决方案禁用了滚动。 - avalanche1
2
哥们,你这段代码真是救了我一命,我已经浪费了20个小时还是不知道该怎么做!谢谢你啊! - user3187075

27

Webkit 浏览器(如 Safari 和 Chrome)在计算宽度为 100% 或 100vw 时,会从可见页面宽度中减去滚动条的宽度。更多信息请参见DM Rutherford 的 Scrolling and Page Width

尝试使用 overflow-y: overlay 替代。


13
请不要在多个问题中发布相同的答案。发表一个好的答案,然后投票/标记关闭其他问题作为重复。如果问题不是重复的,请根据问题量身定制您的答案 - Paul Roub
1
这应该可以工作,但是覆盖层还不是标准,也不被所有浏览器支持。 - Zia Ul Rehman Mughal
小问题:在Safari中这会导致页面停止滚动。 - joshfindit

14
我发现我可以添加
::-webkit-scrollbar { 
display: none; 
}

我可以直接应用CSS样式,使滚动条不可见,但仍然可以在Chrome中进行滚动。这对于不想在页面上有分散注意力的滚动条时很有用!


5
尽管 https://dev59.com/RGox5IYBdhLWcg3wWzN7 提供了一种自定义滚动条的CSS方法,但这种方法有一定风险且不适用于所有浏览器。 - Alex Pyzhianov

6
对于具有固定宽度的容器,可以通过将容器包装到另一个div中并将相同的宽度应用于两个div来实现纯CSS跨浏览器解决方案。
#outer {
  overflow-y: auto;
  overflow-x: hidden;
  /*
   * width must be an absolute value otherwise the inner divs width must be set via
   * javascript to the computed width of the parent container
   */
  width: 200px;
}

#inner {
  width: inherit;
}

点击此处查看在Codepen上的示例


6
body {
    width: calc( 100% );
    max-width: calc( 100vw - 1em );
}

可以使用默认滚动条一起工作。 还可以添加:
overflow-x: hidden;

为了确保父框架中的水平滚动条保持隐藏状态,除非客户端要求显示。

3

目前我的另一个答案似乎并没有完全正常工作(但我将继续尝试让它运行)。

但基本上你需要做的事情,以及它动态尝试要做的事情,是将内容的宽度设置为略小于可滚动面板的父级。
这样当滚动条出现时,它对内容没有影响。

这个EXAMPLE展示了一种更加hacky的方式来达到这个目标,通过硬编码width而不是通过padding让浏览器为我们完成。
如果这是可行的,那么这是最简单的解决方案,如果你不想要一个永久的滚动条。


这是一个不错的解决方案,但我正在使用Bootstrap开发响应式网站,自动化宽度等方面非常重要,你觉得呢? - Acemad
除非(按可能性递减的顺序):有人找出如何让我的另一个答案工作(使用填充或边距之一);您可以以某种方式使用媒体查询有选择地应用填充;或现代浏览器中实现CSS表达式以有选择地应用填充。我认为只有永久滚动条或使用JS检测滚动条才是正确的方法。 - Hashbrown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接