防止滚动条累加到Chrome的页面宽度


125

我在尝试将.html页面在Chrome上保持一致的宽度时遇到一个小问题,例如,我的页面(1)的内容很多,导致视口(正确的单词?)高度溢出,因此有一个垂直滚动条在该页面上(1)。在页面(2)上,我具有相同的布局(菜单,div,...等),但内容较少,因此其中没有垂直滚动条。

问题是,在页面(1)上,滚动条似乎将元素稍微向左推(累加了宽度?),而所有内容似乎都很好地位于页面(2)的中心

我仍然是HTML / CSS / JS的初学者,我非常相信这并不是那么困难,但是我没有运气找出解决方案。它确实可以在IE10和FireFox(无干扰滚动条)上正常运行,我只在Chrome上遇到过。

Answers:


42

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

像这样:

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'});
    }
}

用于删除h-scrollbar的CSS:

body{
    overflow-x:hidden;
}

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


1
聪明的解决方案,我不明白'if'中的情况!
Acemad

3
scrollHeight是元素的总高度。您所看到的以及隐藏的内容。例如:您的窗口的高度约为500px,主体的内容为900px。显示了500像素,但其他400像素被隐藏,滚动条将出现以显示该剩余像素。因此,条件就像“如果所有内容的高度都大于视点高度,则为主体增加边距”。对不起,我的英语不好
Lwyrn

我现在知道了,感谢您的清晰解释,我尝试了此解决方案并获得了一个附加的水平滚动条,但是不知道为什么。
阿塞玛德

2
我在回复中添加了一点CSS来防止它:)
Lwyrn

4
此解决方案禁用了滚动功能
avalanche1

117

免责声明覆盖已被弃用
如果绝对必须,您仍然可以使用此功能,但不要这样做。

这仅适用于WebKit浏览器,但我非常喜欢。与auto其他浏览器一样。

.yourContent{
   overflow-y: overlay;
}

这将使滚动条仅显示为叠加层,从而不会影响元素的宽度


它不适用于IE11。是否有任何替代方法可以使叠加值在IE中工作。
Anvesh Reddy '18年

据我所知,您将不得不考虑此线程中针对IE提出的其他选项
simonDos

非常需要!我花了半个多小时才看清楚我的标记到底做错了什么。我过度使用了哪些样式?这也应该是默认值。
kushalvm

3
却已

1
我更新了解决方案以反映这一点。Kinda sad:P
simonDos

57

您需要做的就是添加:

html {
    overflow-y: scroll;
}

在您的css文件中,尽管您只是无法滚动,但无论是否需要它都将具有滚动条

这意味着两个视口的宽度相同


4
因此,我不得不向两者都添加滚动条?有没有办法忽略垂直滚动条的宽度?谢谢 !
Acemad

没有办法忽略我所知道的,但是我说的对@ Rockr90
起作用-Hive7

@ d3c0y这是真的,我已经在答案中提到了它,但这是最简单的方法。我不知道这在过去3年中是否发生了变化
Hive7 '16

@aks。它迫使浏览器认为您可以滚动,因此启用滚动条和滚动y是侧面滚动条
Hive7 '16

1
溢出y:滚动;即使没有可滚动的元素,也将在所有视口中添加/显示滚动条。
阿比拉什

35

大概

html {
    width: 100vw;
}

就是您想要的。


1
这对我的用例非常有用gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847calc()用来确定主要内容视图的宽度,以便固定的屏外导航可以在桌面上占据屏幕的左侧,同时又保留了本地在手机上滚动。
bmcminn

3
在过去的36个小时里,我一直在浏览我的滚动条。我有几种可行的解决方案,但是提出了其他问题。这是第一个既可行又可以让我在其他地方使用普通滚动条的解决方案。谢谢。
犹太教

别客气!但是弄乱htmls中的宽度vw有点麻烦,因此请多加注意!
Neurotransmitter

这很好用,有人可以解释它是如何工作的吗?
宙斯'18

1
解决方案还不错,但是可以添加水平滚动。
FDisk

18

在计算宽度:100%或100vw时,Safari和Chrome等Webkit浏览器会从可见页面宽度中减去滚动条宽度。更多在DM卢瑟福的滚动和页面宽度

尝试overflow-y: overlay改用。


9
请不要针对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以将其他问题重复进行关闭。如果问题不是重复的,请定制问题的答案。
Paul Roub

这应该可以工作,但是叠加层还不是标准的,也不是所有浏览器都支持的。
Zia Ul Rehman Mughal

快速打ic:在Safari中,这导致页面停止滚动
joshfindit


4

对于具有固定宽度的容器,可以通过将容器包装到另一个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的示例


3

目前,我的其他答案似乎还不太正确(但我将继续尝试使其正常运行)。

但是基本上,您需要做的以及它试图动态进行的工作是将内容的宽度设置为略小于父级可滚动窗格的宽度。
这样,当滚动条出现时,对内容没有任何影响。

示例通过对widths 进行硬编码,而不是尝试使浏览器通过来为我们完成此任务,从而展示了一种更为灵活的方法来实现该目标padding
如果可行,如果您不希望使用永久滚动条,这是最简单的解决方案。


那是一个很好的解决方案,但是我正在使用Bootstrap在一个响应式网站上工作,对宽度自动进行所有操作都很重要,您怎么说?
Acemad

好吧,除非(以降低可能性的顺序)之一是:有人想出了如何使我的其他答案起作用(使用填充或边距);您可以通过某种方式使用媒体查询来选择性地应用填充;在现代浏览器中实现了CSSCSS表达式,以选择性地应用填充。我认为只有永久滚动条或使用JS来检测滚动条
才行

1

编辑:此答案目前还不太正确,请参考我的其他答案以查看我在此处尝试做的事情。我正在尝试对其进行修复,但是如果您可以提供帮助,请在评论中提供帮助,谢谢!

使用padding-right将减轻滚动条的突然出现

chrome devtools显示填充未移动

从圆点可以看出,无论是否存在滚动条,文本都会在换行前到达页面中的同一点。
这是因为在引入滚动条时,填充物隐藏在其后面,因此滚动条不会压入文本!


3
滚动条的宽度可以更改,具体取决于您所使用的操作系统和浏览器。它可以测量20px和40px
Lwyrn

2
好吧,您将使用所有可能的值中的最大值
Hashbrown 2013年

1
某些设备/ OS浏览器的滚动甚至没有宽度。
Sergey Goliney 2015年

0
.modal-dialog {
   position: absolute;
   left: calc(50vw - 300px);
}

其中300像素是我对话框窗口宽度的一半。

这实际上是唯一对我有用的东西。


0

我在Chrome上遇到了同样的问题。仅当滚动条始终可见时,它才发生在我身上。(在常规设置中找到)我有一个模态,当我打开模态时,我注意到...

body {
    padding-left: 15px;
}

被添加到身体。为了阻止这种情况的发生,我添加了

body {
    padding-left: 0px !important;
}

0

我无法为第一个答案添加评论,这已经很长时间了……但是该演示存在问题:

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

b.prop('scrollHeight')始终等于b.height(),

我认为应该是这样的:

if(b.prop('scrollHeight')>window.innerHeight) ...

最后,我推荐一种方法:

html {
 overflow-y: scroll;
}

:root {
  overflow-y: auto;
  overflow-x: hidden;
}

:root body {
  position: absolute;
}

body {
 width: 100vw;
 overflow: hidden;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.