如何防止滚动条重新定位网页?

Dmi*_*ruk 197 html css

我有一个中心对齐的DIV网站.现在,有些页面需要滚动,有些则不需要.当我从一种类型移动到另一种类型时,滚动条的外观会将页面移动几个像素到一侧.如果没有在每个页面上明确显示滚动条,有没有办法避免这种情况?

Rub*_*ben 248

overflow-y:滚动是正确的,但你应该使用它与html标签,而不是身体,否则你在IE 7中得到一个双滚动条
所以正确的CSS将是:

html {
  overflow-y: scroll;
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,它永久地显示了一个垂直滚动条.可能并不总是可以接受. (42认同)
  • 我在 Chromium 和 Firefox 中都有双滚动条。我正在使用弹性盒;也许这就是造成这个的原因...... (2认同)
  • @Garrett 尝试 body 标签 (2认同)

Rap*_*pti 50

我有同样的问题,但我有一个好主意:将可滚动元素的内容包装成div并应用padding-left: calc(100vw - 100%);.

<body>
    <div style="padding-left: calc(100vw - 100%);">
        Some Content that is higher than the user's screen
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

诀窍是100vw代表100%的视口,包括滚动条.如果减去100%(没有滚动条的可用空间),则最终得到滚动条的宽度或者0如果它不存在.在左侧创建该宽度的填充将模拟第二个滚动条,将居中内容向右移动.

请注意,这仅在可滚动元素使用页面的整个宽度时才有效,但这在大多数情况下应该没有问题,因为只有少数其他情况下您有可居中的可滚动内容.

  • 考虑到浏览器对calc的支持非常好,这绝对是天才并且确实是最好的答案. (14认同)
  • 我建议向此样式添加一些媒体查询 - `@media screen 和 (min-width: 800px) {...} `。在内容适合页面宽度的情况下。例如,在小分辨率上,将会出现不必要的间隙,将内容向右移动 (5认同)
  • 它对我来说很完美!为什么选票呢? (4认同)
  • 通过类应用比通过内联样式更好,并且只能在 [这些浏览器](http://caniuse.com/#search=calc) 中工作,但这是一个聪明的技术 - 我没有意识到` 100vw` 和 `100%` 测量的是不同的东西,所以我从中学到了一些有用的东西! (3认同)
  • 您可以执行相同的操作,只不过不是在左侧添加边距,而是在右侧添加负边距(请参阅 /sf/answers/2750261741/)。 (2认同)
  • 此解决方案将导致类似的背景色问题,如答案“ width:calc(100vw-34px);”。但在左侧。 (2认同)

Mic*_*ker 43

我想不是.但是造型bodyoverflow: scroll应该做的.但你似乎知道这一点.

  • `overflow-y:scroll` :) (48认同)
  • 听起来不错......强制页面始终显示滚动条是否需要它,...然后页面类型之间没有视觉上的变化. (3认同)
  • 以下是更好的答案 (2认同)

Moe*_*sio 34

随着滚动始终显示,可能不适合布局.

尝试用css3限制体宽

body {
    width: calc(100vw - 34px);
}
Run Code Online (Sandbox Code Playgroud)

vw是视口的宽度(请参阅此链接以获得一些解释)
calccss3中的计算
34px代表双滚动条宽度(请参阅此内容以了解固定或如果您不相信固定尺寸,则计算此值)

  • 在有人需要之前,一切都是徒劳的. (4认同)
  • 到目前为止,这已经满足了我的需求,我还添加了`padding-left:34px;`来均匀地居中我的页面. (4认同)
  • 这在视觉上不仅仅是强迫scollbars,如接受的答案描述. (3认同)
  • 这应该是公认的答案,不像目前接受的答案,它实际上回答了这个问题! (3认同)
  • 如果您的导航栏/标题的颜色与主体背景或底部边框等不同,则会出现问题. (2认同)

pon*_*ngo 24

html {
  overflow-x: hidden;
  margin-right: calc(-1 * (100vw - 100%));
}
Run Code Online (Sandbox Code Playgroud)

例子.单击"更改最小高度"按钮.

calc(100vw - 100%)我们可以计算出滚动条的宽度(如果未显示,这将是0).想法:使用负边距,我们可以增加宽度<html>到这个宽度.您将看到一个水平滚动条 - 它应该被隐藏使用overflow-x: hidden.

  • 这效果很好,并且似乎不会导致 Chrome 或 Firefox 中出现不需要的水平滚动条。为什么不直接使用“calc(100% - 100vw)”而不是乘以“-1”? (2认同)

Mar*_* T. 17

body {
  scrollbar-gutter: stable both-edges;
}
Run Code Online (Sandbox Code Playgroud)

新的 css 规范将有助于滚动条重新定位: https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-gutter


小智 13

我不知道这是否是一个旧帖子,但我有同样的问题,如果你想垂直滚动,你应该尝试 overflow-y:scroll


Bja*_*ted 13

概括

我看到了三种方法 - 每种方法都有自己的怪癖:

这是StackBlitz 演示

按“切换高度”即可查看内容的变化。

滚动条装订线

支持有限,但通过@support媒体查询,我们可以使用此和的组合overflow-y: scroll

html {
  overflow-y: scroll;
}

@supports (scrollbar-gutter: stable) {
  html {
    overflow-y: auto;
    scrollbar-gutter: stable;
  }
}

Run Code Online (Sandbox Code Playgroud)

这样内容就永远不会改变。

这个解决方案的“问题”是滚动条总是有固定的空间。

溢出:覆盖 有限的支持,它显然隐藏了它覆盖的任何内容。需要特别小心,以确保没有隐藏任何重要内容(也包括缩放和文本大小更改)。

可以与滚动条装订线结合使用:

html {
  overflow-y: scroll;
}

@supports (scrollbar-gutter: stable) {
  html {
    overflow-y: auto;
    scrollbar-gutter: stable;
  }
}

@supports (overflow-y: overlay) {
  html {
    overflow-y: overlay;
    scrollbar-gutter: auto;
  }
}
Run Code Online (Sandbox Code Playgroud)

可以做一些负边距,overflow-x: hidden但这在某些情况下有隐藏重要内容的风险。小屏幕、自定义字体/缩放大小、浏览器扩展等。

计算(100vw - 100%)

这可以通过 RTL 支持来完成,如下所示:

html[dir='ltr'] main {
  padding-left: calc(100vw - 100%);
}

html[dir='rtl'] main {
  padding-right: calc(100vw - 100%);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下<main>,将是居中内容的容器。

只要居中容器小于 ,此处的内容就不会移动<main>。但一旦达到容器的 100%,就会引入填充物。请参阅 StackBlitz 演示并单击“切换宽度”。

此解决方案的“问题”是,您需要媒体查询来防止“小屏幕”上的填充,并且即使在小屏幕上(当滚动条应该可见时)也会发生一些移动,因为没有空间容纳 100% 的内容和滚动条。

结论 使用滚动条装订线或者与覆盖相结合。如果您绝对不想要空白,请尝试calc使用媒体查询的解决方案。


小智 11

如果更改大小或加载一些数据后,它会添加滚动条,然后您可以尝试跟随,创建类并应用此类.

.auto-scroll {
   overflow-y: overlay;
   overflow-x: overlay;
}
Run Code Online (Sandbox Code Playgroud)

  • 根据 [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow),firefox 不支持“overflow:overlay”。“仅在基于 WebKit(例如 Safari)和基于 Blink(例如 Chrome 或 Opera)的浏览器中受支持。” (2认同)

Has*_*req 7

@kashesandr 的解决方案对我有用,但为了隐藏水平滚动条,我为正文添加了另一种样式。这是完整的解决方案:

CSS

<style>
/* prevent layout shifting and hide horizontal scroll */
html {
  width: 100vw;
}
body {
  overflow-x: hidden;
}
</style>
Run Code Online (Sandbox Code Playgroud)

JS

$(function(){
    /**
     * For multiple modals.
     * Enables scrolling of 1st modal when 2nd modal is closed.
     */
    $('.modal').on('hidden.bs.modal', function (event) {
      if ($('.modal:visible').length) {
        $('body').addClass('modal-open');
      }
    });
});
Run Code Online (Sandbox Code Playgroud)

仅 JS 解决方案(当从第一个模式打开第二个模式时):

/**
 * For multiple modals.
 * Enables scrolling of 1st modal when 2nd modal is closed.
 */
$('.modal').on('hidden.bs.modal', function (event) {
  if ($('.modal:visible').length) {
    $('body').addClass('modal-open');
    $('body').css('padding-right', 17);
  }
});
Run Code Online (Sandbox Code Playgroud)


Bar*_*nax 5

像这样简单地设置容器元素的宽度就可以了

width: 100vw;
Run Code Online (Sandbox Code Playgroud)

这将使该元素忽略滚动条,并使用背景颜色或图像。