我有一个中心对齐的DIV网站。现在,有些页面需要滚动,有些则不需要。当我从一种类型移动到另一种类型时,滚动条的外观会将页面移动几个像素到一侧。如果没有在每个页面上明确显示滚动条,有没有办法避免这种情况?
答案 0 :(得分:239)
溢出-y:滚动是正确的,但你应该将它与html标签一起使用,而不是正文,否则你在IE 7中得到一个双滚动条
所以正确的CSS将是:
html {
overflow-y: scroll;
}
答案 1 :(得分:44)
我有同样的问题,但我有一个好主意:
将可滚动元素的内容包装到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
。在左侧创建该宽度的填充将模拟第二个滚动条,将居中的内容向右移回。
请注意,这仅在可滚动元素使用页面的整个宽度时才有效,但这在大多数情况下应该没有问题,因为只有少数其他情况下您有可居中的可滚动内容。
答案 2 :(得分:43)
我想不是。但使用body
样式overflow: scroll
应该可以。但你似乎知道这一点。
答案 3 :(得分:31)
总是显示滚动,可能不适合布局。
尝试使用css3
限制身体宽度body {
width: calc(100vw - 34px);
}
vw
是视口的宽度(有关解释,请参阅this link)
calc
在css3中计算
34px
代表双滚动条宽度(如果您不信任固定尺寸,请参阅this修正或this to calculate)
答案 4 :(得分:18)
html {
overflow-x: hidden;
margin-right: calc(-1 * (100vw - 100%));
}
Example。点击&#34;更改最小高度&#34;按钮。
使用calc(100vw - 100%)
,我们可以计算滚动条的宽度(如果没有显示,则为0)。想法:使用负边距,我们可以将<html>
的宽度增加到此宽度。您将看到一个水平滚动条 - 它应该使用overflow-x: hidden
隐藏。
答案 5 :(得分:13)
我不知道这是否是一个旧帖子,但我有同样的问题,如果你想垂直滚动,你应该尝试overflow-y:scroll
答案 6 :(得分:7)
如果更改大小或在加载某些数据后添加滚动条,则可以尝试关注,创建类并应用此类。
.auto-scroll {
overflow-y: overlay;
overflow-x: overlay;
}
答案 7 :(得分:4)
像这样简单地设置容器元素的宽度就可以解决问题
width: 100vw;
这将使该元素忽略滚动条,并且可以处理背景颜色或图像。
答案 8 :(得分:3)
我已经在我的一个网站上解决了这个问题,方法是在javascript中通过视口大小减去滚动条的宽度来显式设置主体的宽度。我使用基于jQuery的函数记录here来确定滚动条的宽度。
<body id="bodyid>
var bodyid = document.getElementById('bodyid');
bodyid.style.width = window.innerWidth - scrollbarWidth() + "px";
答案 9 :(得分:3)
延长Rapti's answer,这也应该可以正常工作,但它会在body
的右侧增加更多的保证金,并将其隐藏为负html
页边距,而不是添加额外的填充可能会影响页面的布局。这样,实际页面上没有任何变化(在大多数情况下),代码仍然有效。
html {
margin-right: calc(100% - 100vw);
}
body {
margin-right: calc(100vw - 100%);
}
答案 10 :(得分:2)
如果表格的宽度不变,则可以设置包含滚动条的元素(例如tbody)的宽度> 100%(为滚动条留出额外的空间),并将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>
答案 11 :(得分:2)
使用calc(100vw - 100%)发布的解决方案在正确的轨道上,但是存在一个问题:即使您调整窗口大小,您也将永远在滚动条的左侧留有余量这样内容就会填满整个视口。
如果你试图通过媒体查询解决这个问题,你会有一个尴尬的捕捉时刻,因为当你调整窗口大小时,边距不会逐渐变小。
这是一个解决方案,AFAIK没有任何缺点:
而不是使用保证金:自动将内容居中,请使用:
body {
margin-left: calc(50vw - 500px);
}
将500px替换为内容最大宽度的一半(因此在此示例中,内容最大宽度为1000px)。内容现在将保持居中和边距将逐渐减小,直到内容填充视口。
为了在视口小于最大宽度时阻止边距变为负数,只需添加媒体查询,如下所示:
@media screen and (max-width:1000px) {
body {
margin-left: 0;
}
}
Etvoilà!
答案 12 :(得分:2)
使用此扩展答案:
body {
width: calc(100vw - 17px);
}
一位评论员建议添加左边填充以保持居中:
body {
padding-left: 17px;
width: calc(100vw - 17px);
}
但是,如果您的内容比视口宽,那么事情看起来不正确。要解决此问题,您可以使用媒体查询,如下所示:
@media screen and (min-width: 1058px) {
body {
padding-left: 17px;
width: calc(100vw - 17px);
}
}
1058px =内容宽度+ 17 * 2
这使得水平滚动条可以处理x溢出,并在视口宽度足以包含固定宽度内容时保持居中内容居中
答案 13 :(得分:2)
我尝试修复可能由twitter bootstrap .modal-open
类应用于body
引起的同一问题。解决方案html {overflow-y: scroll}
无济于事。我找到的一种可能解决方案是将{width: 100%; width: 100vw}
添加到html
元素。
答案 14 :(得分:1)
我的方法是让轨道透明。滚动条拇指颜色为 #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;
}
答案 15 :(得分:1)
@kashesandr's solution对我有用,但是为了隐藏水平滚动条,我为主体添加了另一种样式。这是完整的解决方案:
CSS
<style>
/* prevent layout shifting and hide horizontal scroll */
html {
width: 100vw;
}
body {
overflow-x: hidden;
}
</style>
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');
}
});
});
仅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);
}
});
答案 16 :(得分:0)
我尝试了溢出滚动,但对我的情况不起作用。滚动条仍然添加了某种(白色)填充。有效的是将宽度从 100vw 更改为 100%,但对于高度,可以使用 100vh。所以这个:
const Wrapper = styled.div`
min-height: 100vh
`
const Parent = styled.div`
width: 100%
`
const Children = styled.div`
width: 100%
`
编辑 我已经设置了两次宽度,因为父组件有一个侧边栏,还有子组件。根据您的用例,您可以设置一次。
答案 17 :(得分:0)
在尝试了以上大部分在我的案例中都不起作用的基于 CSS 或基于 JS 的解决方案后,只想加起来。 我的解决方案适用于滚动条必须在事件中消失的情况(例如,单击按钮,因为您刚刚打开了一个应阻止页面滚动的全屏菜单)。
当以下样式应用于将 array([[ True, True, False, True],
[ True, False, True, True]])
变为 overflow-y
的元素(在我的例子中是 hidden
标记)时,这应该有效:
body
说明:您的 body {
overflow-x: hidden;
width: 100vw;
margin-right: calc(100vw - 100%);
}
标签的 width
是 body
(因此它包括滚动条的宽度)。
通过设置 100vw
,只有当您的垂直滚动条可见时才会应用边距(因此您的页面内容实际上不在滚动条下方),这意味着页面内容不会重新定位一次 margin-right
改变了。
注意:此解决方案仅适用于不可水平滚动的页面。
在 Chrome 89.0、Firefox 87.0、Safari 14.0.3 上测试
更新:不幸的是,它只适用于不占 100% 宽度的居中容器 - 否则滚动条会覆盖右侧的内容。
答案 18 :(得分:0)
我用来解决这个问题,但修复它的简单方法就是这个(这对我有用):
CSS文件类型:
body{overflow-y:scroll;}
就这么简单! :)
答案 19 :(得分:-3)
@media screen and (min-width: 1024px){
body {
min-height: 700px
}
}
答案 20 :(得分:-3)
我用了一些jquery来解决这个问题
$('html').css({
'overflow-y': 'hidden'
});
$(document).ready(function(){
$(window).load(function() {
$('html').css({
'overflow-y': ''
});
});
});
答案 21 :(得分:-3)