我有一个网站与中心对齐的DIV。现在,一些页面需要滚动,一些不需要。当我从一种类型移动到另一种类型时,滚动条的出现将页面移向一侧几个像素。有没有什么方法可以避免这种情况,而不显式地在每个页面上显示滚动条?


当前回答

将可滚动元素的内容包装到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>

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

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

其他回答

使用calc(100vw - 100%)发布的解决方案是正确的,但有一个问题:即使你调整了窗口的大小,使内容充满了整个视口,你也将永远有一个滚动条大小的左边边距。

如果你试图用媒体查询来解决这个问题,你会有一个尴尬的瞬间,因为当你调整窗口大小时,边缘不会逐渐变小。

这里有一个解决方案,AFAIK没有任何缺点:

而不是使用margin: auto来居中你的内容,使用这个:

body {
margin-left: calc(50vw - 500px);
}

将500px替换为内容max-width的一半(所以在这个例子中,内容max-width是1000px)。现在内容将保持居中,边距将逐渐减少,直到内容填满视口。

为了防止边距在视口小于max-width时变为负值,只需添加一个媒体查询,如下所示:

@media screen and (max-width:1000px) {
    body {
        margin-left: 0;
    }
}

就是这样!

在尝试了上述大多数CSS或基于js的解决方案后,这些解决方案在我的情况下都不起作用,只是想把它加起来。 我的解决方案适用于滚动条必须在事件中消失的情况(例如,单击按钮,因为你刚刚打开了一个全屏菜单,这应该会阻止页面的滚动)。

当下面的样式应用于将overflow-y变为hidden的元素时(在我的例子中是body标签),这应该是有效的:

body {
  overflow-x: hidden;
  width: 100vw;
  margin-right: calc(100vw - 100%);
}

说明:你的主体标签的宽度是100vw(所以它包括滚动条的宽度)。

通过设置margin-right,只有当垂直滚动条可见时才应用边缘(因此页面内容实际上不在滚动条下面),这意味着一旦overflow-y发生更改,页面内容将不会重新定位。

注意:此解决方案仅适用于不能水平滚动的页面。

在Chrome 89.0, Firefox 87.0, Safari 14.0.3上测试

更新:不幸的是,它只适用于居中的容器,不采取100%宽度-否则滚动条覆盖在右侧的内容。

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

width: 100vw;

这将使该元素忽略滚动条,并与背景颜色或图像一起工作。

滚动总是显示,可能是不好的布局。

尝试使用css3限制主体宽度

body {
    width: calc(100vw - 34px);
}

Vw是视口的宽度(看这个链接了解一些解释) 在css3中进行Calc计算 34px代表双滚动条宽度(如果你不相信固定大小,请参阅此计算)

@media screen and (min-width: 1024px){
    body {
    min-height: 700px
    }
}