【问题标题】:Prevent scroll-bar from adding-up to the Width of page on Chrome防止滚动条添加到 Chrome 上的页面宽度
【发布时间】:2013-09-04 02:26:19
【问题描述】:

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

问题在于,在第 (1) 页上,滚动条似乎将元素稍微向左推(加起来到宽度?),而所有内容都很好地集中在第 (2) 页上

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

【问题讨论】:

  • 这是一个非常烦人的问题,直到我切换到滚动条持续存在并占用屏幕不动产的 Windows 编码之前,我从未遇到过这个问题。 Mac 滚动条消失并且不增加宽度。

标签: html css google-chrome scrollbar


【解决方案1】:

免责声明叠加层弃用
如果绝对需要,您仍然可以使用它,但尽量不要。

这仅适用于 WebKit 浏览器,但我非常喜欢它。 在其他浏览器上的行为类似于 auto

.yourContent{
   overflow-y: overlay;
}

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

【讨论】:

  • 它不适用于 IE11。是否有任何解决方法可以让覆盖值在 IE 中工作。
  • 据我所知,您将不得不使用此线程中针对 IE 提出的其他选项
  • 非常需要!我花了半个多小时才看到我的标记到底做错了什么。我过度使用了哪些风格?这也应该是默认的。
  • 但它已被弃用
  • 我更新了解决方案以反映这一点。有点伤心:P
【解决方案2】:

你需要做的就是添加:

html {
    overflow-y: scroll;
}

在您的 css 文件中,因为无论是否需要滚动条,您都无法滚动

这意味着视口将具有相同的宽度

【讨论】:

  • 那么,我有义务为两者添加滚动条吗?有没有办法忽略垂直滚动条的宽度?谢谢!
  • 我知道没有办法忽略它,但我所说的对@Rockr90 很有用
  • @d3c0y 这是真的,我在答案中提到了它,但它是最简单的方法。我不知道这在过去 3 年中是否发生了变化
  • @aks。它迫使浏览器认为您可以滚动,因此启用滚动条并且滚动 y 是侧滚动条
  • 溢出-y:滚动;即使没有可滚动元素,也会在所有视口中添加/显示滚动条。
【解决方案3】:

大概

html {
    width: 100vw;
}

正是你想要的。

【讨论】:

  • 这对我的用例非常有用:gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847 我正在使用calc() 来确定主要内容视图的宽度,以便固定的屏幕外导航可以占据桌面屏幕的左侧,同时保留移动设备上的原生滚动。
  • 在过去的 36 小时里,我一直在搞乱我的滚动条。我有一些不同的解决方案有效,但提出了其他问题。这是第一个既可行又允许我在其他地方使用普通滚动条的解决方案。谢谢。
  • 这很好用,有人能解释一下它是如何工作的吗?
  • 嗯,它只是将根 HTML 节点 (<html>) 的宽度设置为 100 个 视口宽度单位。那是浏览器窗口的 100% 宽度。
  • 解决方案还不错,但可以添加水平滚动。
【解决方案4】:

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

类似这样的:

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/

【讨论】:

  • 聪明的解决方案,虽然我不明白'if'中的条件!
  • scrollHeight 是元素的总高度。你看到的和隐藏的。一个例子:您的窗口高度为 500px,body 的内容为 900px。显示了 500 像素,但隐藏了其他 400 像素,滚动条将出现以显示此剩余像素。所以条件就像“如果所有内容的高度大于视点高度,则将边距添加到正文”。对不起我的英语不好
  • 我在回复中添加了一小段css来防止它:)
  • 此解决方案禁用滚动
  • 伙计,你用这段代码救了我,我已经浪费了 20 个小时试图弄清楚我应该做什么!谢谢哥们!
【解决方案5】:

Safari 和 Chrome 等 Webkit 浏览器在计算宽度时从可见页面宽度中减去滚动条宽度:100% 或 100vw。更多信息请访问DM Rutherford's Scrolling and Page Width

尝试改用overflow-y: overlay

【讨论】:

  • 请不要对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答。
  • 这应该可以,但是覆盖还不是标准的,也不是所有浏览器都支持。
  • 快速打嗝:在 Safari 中这会导致页面停止滚动
【解决方案6】:

我发现我可以添加

::-webkit-scrollbar { 
display: none; 
}

直接到我的 css,它会使滚动条不可见,但仍然允许我滚动(至少在 Chrome 上)。当您不想在页面上出现分散注意力的滚动条时非常适合!

【讨论】:

【解决方案7】:

对于具有固定宽度的容器,纯 CSS 跨浏览器解决方案可以通过将容器包装到另一个 div 并将相同的宽度应用于两个 div 来完成。

#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;
}

Click here to see an example on Codepen

【讨论】:

    【解决方案8】:
    body {
        width: calc( 100% );
        max-width: calc( 100vw - 1em );
    }
    

    也适用于默认滚动条。 可以补充:

    overflow-x: hidden;
    

    确保水平滚动条对父框架保持隐藏。除非您的客户希望这样做。

    【讨论】:

      【解决方案9】:

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

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

      这个EXAMPLE 展示了一种更老套的方式来实现这个目标,通过硬编码widths 而不是试图让浏览器通过padding 为我们完成它。
      如果这是可行的,如果您不想要永久滚动条,这是最简单的解决方案。

      【讨论】:

      • 这是一个很好的解决方案,但是我正在使用 Bootstrap 开发一个响应式网站,并且自动化宽度和所有内容很重要,你说什么?
      • 好吧,除非(按可能性递减的顺序):有人想出如何让我的其他答案起作用(使用填充或边距);您可以以某种方式使用media queries 选择性地应用填充;或 css expressions 在现代浏览器中实现以选择性地应用填充。我认为只有永久滚动条或使用JS检测滚动条是要走的路
      【解决方案10】:

      编辑:这个答案目前不太正确,请参阅我的其他答案,看看我在这里尝试做什么。我正在尝试修复它,但如果您能提供帮助,请在 cmets 中提供帮助,谢谢!

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

      EXAMPLE

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

      【讨论】:

      • 滚动条宽度可以根据您使用的操作系统和浏览器而改变。它可以测量 20px 和 40px
      • 你会使用所有可能值中的最大值
      • 一些设备/操作系统浏览器的滚动甚至没有宽度。
      【解决方案11】:

      2021 年的解决方案是使用scrollbar-gutter,它将滚动条将使用的空间永久添加到元素。

      使用

      .element-class {
         scrollbar-gutter: stable both-edges;
      }
      

      both-edges 是可选的。

      另请参阅https://caniuse.com/mdn-css_properties_scrollbar-gutterhttps://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-gutter

      overflow: overlay 已弃用。

      【讨论】:

        【解决方案12】:
        .modal-dialog {
           position: absolute;
           left: calc(50vw - 300px);
        }
        

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

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

        【讨论】:

          【解决方案13】:

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

          body {
              padding-left: 15px;
          }
          

          被添加到正文中。为了阻止这种情况发生,我添加了

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

          【讨论】:

            【解决方案14】:

            我无法为第一个答案添加评论,已经很久了......但是那个演示有问题:

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

            【讨论】:

              【解决方案15】:

              我通过这种方式解决了滚动条的类似问题:

              首先通过设置禁用垂直滚动条:

              overflow-y: hidden;
              

              然后制作一个位置固定的 div,高度等于屏幕高度,并使其宽度变细,看起来像滚动条。这个 div 应该可以垂直滚动。现在在这个 div 中创建另一个具有文档高度的 div(包含它的所有内容)。现在您需要做的就是在容器 div 中添加一个 onScroll 函数,并在 div 滚动时滚动主体。代码如下:

              HTML:

              <div onscroll="OnScroll(this);" style="width:18px; height:100%;  overflow-y: auto; position: fixed; top: 0; right: 0;">
                  <div id="ScrollDiv" style="width:28px; height:100%; overflow-y: auto;">
                  </div>
              </div>
              

              然后在你的页面加载事件中添加:

              JS:

              $( document ).ready(function() {
                  var body = document.body;
                  var html = document.documentElement;
                  var height = Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
                  document.getElementById('ScrollDiv').style.height = height + 'px'; 
              });
              
              function OnScroll(Div) {
                  document.body.scrollTop = Div.scrollTop;
              }
              

              现在滚动 div 就像滚动 body 而 body 没有滚动条一样。

              【讨论】:

              • 好的,对于显示经典滚动条的浏览器,用户如何知道还有更多内容可以滚动到?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-16
              • 2019-09-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多