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


当前回答

与公认的答案相反,即使内容没有溢出屏幕,也建议在浏览器窗口上使用永久滚动条,我更喜欢使用:

html{
  height:101%;
}

这是因为如果内容溢出,滚动条的外观更有意义。

这个比这个更有意义。

其他回答

与公认的答案相反,即使内容没有溢出屏幕,也建议在浏览器窗口上使用永久滚动条,我更喜欢使用:

html{
  height:101%;
}

这是因为如果内容溢出,滚动条的外观更有意义。

这个比这个更有意义。

如果表格的宽度不会改变,你可以设置包含滚动条> 100%的元素(比如tbody)的宽度(允许滚动条的额外空间),并将overflow-y设置为“overlay”(这样滚动条保持固定,并且当它出现时不会将表格向左移动)。同时为带有滚动条的元素设置一个固定的高度,这样一旦超过高度,滚动条就会出现。像这样:

tbody {
  height: 100px;
  overflow-y: overlay;
  width: 105%
}

注意:你必须手动调整宽度%,因为滚动条占用的空间%将相对于你的表格宽度(即:更小的表格宽度,更多的%需要适合滚动条,因为它的像素大小是恒定的)

一个动态表的例子:

function addRow(tableID) { var table = document.getElementById(tableID); var rowCount = table.rows.length; var row = table.insertRow(rowCount); var colCount = table.rows[0].cells.length; for(var i=0; i<colCount; i++) { var newRow = row.insertCell(i); newRow.innerHTML = table.rows[0].cells[i].innerHTML; newRow.childNodes[0].value = ""; } } function deleteRow(row) { var table = document.getElementById("data"); var rowCount = table.rows.length; var rowIndex = row.parentNode.parentNode.rowIndex; document.getElementById("data").deleteRow(rowIndex); } .scroll-table { border-collapse: collapse; } .scroll-table tbody { display:block; overflow-y:overlay; height:60px; width: 105% } .scroll-table tbody td { color: #333; padding: 10px; text-shadow: 1px 1px 1px #fff; } .scroll-table thead tr { display:block; } .scroll-table td { border-top: thin solid; border-bottom: thin solid; } .scroll-table td:first-child { border-left: thin solid; } .scroll-table td:last-child { border-right: thin solid; } .scroll-table tr:first-child { display: none; } .delete_button { background-color: red; color: white; } .container { display: inline-block; } body { text-align: center; } <!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="test_table.css"> </head> <body> <h1>Dynamic Table</h1> <div class="container"> <table id="data" class="scroll-table"> <tbody> <tr> <td><input type="text" /></td> <td><input type="text" /></td> <td><input type="button" class="delete_button" value="X" onclick="deleteRow(this)"></td> </tr> </tbody> </table> <input type="button" value="Add" onclick="addRow('data')" /> </div> <script src="test_table.js"></script> </body> </html>

总结

我认为有三种方法——每一种都有自己的特点:

Markus T.提到的滚动条槽。 溢出:kunalkamble提到的覆盖 添加间距与calc(100vw - 100%)提到的Rapti

以下是《StackBlitz》的演示版本

按“Toggle height”可以看到内容的移动。

滚动条男孩

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

html {
  overflow-y: scroll;
}

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

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

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

溢出:覆盖 有限的支持,它显然隐藏了它覆盖的任何东西。需要特别注意的是,确保没有重要的东西被隐藏(也包括缩放和文本大小的变化)。

可与滚动条槽结合使用:

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

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

Calc (100vw - 100%)

这可以在RTL支持下完成,如下所示:

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

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

在本例中,<main>是居中内容的容器。

只要居中的容器小于<main>,这里的内容就不会移动。但一旦它是100%的容器填充将被引入。查看StackBlitz演示,点击“切换宽度”。

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

结论 使用滚动条槽也许结合覆盖。如果你绝对不想要空空格,尝试使用媒体查询的calc解决方案。

由于我还没有找到我的解决方案,我想补充它:

我不想要一个永久的滚动条(已接受的解决方案),我也决定不使用负边距。他们没有(立即)为我在chrome浏览器工作,我也不希望有内容可能消失在滚动条下面。

这是一个填充解决方案。

我的网页由三部分组成:

标题(内容左对齐) MainContent(内容居中) 页脚(内容左右对齐)

因为左边填充会让标题看起来很糟糕,而且logo应该留在页面的角落,所以我保持它不变,因为滚动条的出现在大多数情况下不会影响它(除非窗口宽度非常小)。

因为均匀的填充对于MainContent和footer都是可以接受的,我只对这两个容器使用下面的css:

.main-content, .footer {
    /*
     * Set the padding to the maximum scrollbar width minus the actual scrollbar width.
     * Maximum scrollbar width is 17px according to: https://codepen.io/sambible/post/browser-scrollbar-widths 
     */
    padding-right: calc(17px - (100vw - 100%));
    padding-left: 17px;
}

这将保持MainContent在正确的中心,也适用于所有滚动条宽度不超过17px的滚动条。可以为具有覆盖滚动条的移动设备添加一个媒体查询,删除这些填充。 这个解决方案类似于只添加左侧填充,并设置宽度为“width: calc(100vw - 17px);”。但我不能说它是否在所有情况下都一样。

我的方法是使轨道透明。滚动条拇指颜色为#C1C1C1,以匹配默认的滚动条拇指颜色。你可以做任何你喜欢的东西:)

试试这个:

html {
    overflow-y: scroll;
}

body::-webkit-scrollbar {
    width: 0.7em;
    background-color: transparent;
}

body::-webkit-scrollbar-thumb {
    background: #C1C1C1;
    height:30px;
}

body::-webkit-scrollbar-track-piece
{
    display:none;
}