滚动条导致内容偏移

9

我有: 我有几个网页,它们都具有这个大纲:

<body>
<div id="container">
CONTENT
</div>
</body>

使用CSS:
body{
color:#000000;
background-color:#FFFFFF;
background-image: url(background.jpg);
background-repeat: repeat-x;
font-family: verdana;
letter-spacing: 1px;
}
#container{
margin-left:auto;
margin-right:auto;
margin-top:5px;
width: 700px;
}
问题:所有页面都很短,因此没有出现滚动条,但有一页较长,会显示右侧的垂直滚动条。这第二页会导致容器向左移动一点。

据我所知,常见的解决方法是让所有页面都显示滚动条,但我真的想避免这样做,因为只有其中的一个页面比较长。

问题:是否有一种方法可以在不使所有页面都显示滚动条的情况下,避免容器的移位,并且仍然保持居中?


可能是重复的问题:如何防止垂直滚动条出现时网页内容向左移动?建议总结2017年。原链接:https://dev59.com/XlcO5IYBdhLWcg3wny2- - JBH
4个回答

11

使用大型显示器的人在任何页面上都不会看到滚动条。

使用小型显示器的人在所有页面上都会看到滚动条。

无论显示器大小,人们都可以自由地调整浏览器窗口大小并引起滚动条的出现。

哦,还有那些喜欢添加十几个浏览器工具栏插件的人,使浏览器窗口的内容区域只有可能是它本来高度的一半。

这就是事实,没有静态解决方案可以避免这种情况。更改一个页面的边距并不是一个解决办法,原因如上所述。

如果您坚持要修复某些人已经习惯了的问题,那么它将必须是一个“动态”的JavaScript解决方案,其中您需要计算左边距并添加滚动条的宽度。对于不同的浏览器,滚动条的宽度是不同的,因此您也需要进行计算。

编辑: 正如另一个答案中的某人所说,这是默认的浏览器行为,应该让它保持不变。

编辑2: 如用户dampe在评论中所说,您还需要在用户调整窗口大小后每次触发JavaScript。

这将是您浪费时间的一次史诗级事件。通常,浏览器的默认行为留给浏览器来处理。要考虑的变量太多了,如果没有测试每种情况、皮肤、操作系统、浏览器版本、浏览器品牌、工具栏插件、显示器类型、大小等等,您就有可能错过某些东西。一旦开始让它起作用,您会发现您需要为Explorer进行例外和更正。在您知道之前,您就会得到一个庞大的臃肿代码……而这样做的价值是什么?

起点:百分之百保证在所有浏览器和情况下都有预期的行为。

终点:只能保证在您的显示器/系统上看起来很棒...您将冒险在一个您甚至没有考虑过的系统/场景中看起来像垃圾。

首先搜索预制的JavaScript解决方案或jQuery插件...如果找不到,请问自己为什么?

  • 不切实际
  • 不可能
  • 不值得麻烦(需求低)

编辑3:我进行了一些搜索以满足我的好奇心。我找到了一个带有jQuery解决方案的线程,以及计算滚动条宽度的方法链接。

在我看来,这是浪费时间和资源,但对于任何感兴趣的人,这是链接...

http://expressionengine.com/archived_forums/viewthread/158703/

编辑4:这是我找到的一种CSS解决方案。我没有测试过,但如果它有效的话,那就太棒了。

html {
    overflow-y: scroll;
}

http://haslayout.net/css-tuts/Fixing-Page-Shift-Problem

编辑5:CSS解决方案可以使用,但不是我喜欢的方式。它会为每个页面创建滚动条,但当不需要时,它们会变灰或为空...不够优雅。


@Sparky672:感谢您关注这个问题。我确实尝试了overflow-y:scroll的部分,但正如您所写的,我随后在每个页面上都会得到一个滚动条。我找到了一个暂时适合我的解决方案。我设置了html{overflow-y:hidden},但然后将过长的内容放在另一个<div style="overflow-y:scroll;">Long content</div>中。这样滚动条就不会移动整个页面。唯一需要注意的是,滚动条“处于一切事物的中间”。我将继续努力解决它。 - Thomas
还有一件事:我想我可以重新设计滚动条,使其与网站的整体设计相符。 - Thomas
1
@Thomas:我曾经花了数小时来解决这个问题,但我从未见过一种能够在各种平台和浏览器大小上都能够稳定工作并实现你想要的效果的解决方案。我开始相信最好的解决方案是将overflow-y设置为scroll。如果内容移动确实是一个需要解决的问题,那么我认为你会发现渲染滚动条的好处远远超过微小的美学缺陷。这是一个非常简单的解决方案,你只需要在10秒钟内设置它,然后就可以继续你项目中更重要的事情了。 - Matt Howell
@Thomas:经过大量的谷歌搜索和一些CSS实验,我不得不同意bigmattyh的观点...如果你想避免这种移动,添加那一行CSS并在所有短页面上使用虚拟滚动条(我读到IE 6和7(不是IE 8)似乎默认情况下就是这样做的)...否则就接受这种移动。我找不到任何jQuery或其他类型的JavaScript解决方案。 - Sparky
1
@Thomas:我一直暗自希望有一个简单的CSS解决方案,因为我的问题比你的问题更加严重。我有一个非常短的页面,内容会滑动并突然出现滚动条。我的突然移动不是逐页进行的,而是在动画内容引起滚动条之前就发生了。个人而言,我讨厌持续存在的幽灵滚动条,所以我只接受默认行为。 - Sparky
显示剩余2条评论

10

我不知道是否有纯CSS的解决方案,但是你可以使用JavaScript动态计算并调整左边距的正确宽度(同时通过滚动条的大小使右边距略微变窄)。

顺便说一下,我的看法是:正确的处理方式是保持原样。因为这是默认行为,我不认为用户像你一样担心这个问题。这是我的意见,可能会有不同意见,但是在每个页面上添加滚动条(以解决这个问题)是失败的。:)


1
@dampe:感谢您的回答。我也不喜欢在所有页面上添加滚动条的想法。而且您可能是对的,除了我之外没有人会注意到。我一直试图让我的网站非常简单和优雅。您有使用JavaScript“动态计数”的示例吗? - Thomas
我同意。用户不会对您的网站进行页面对比,更不用说浏览器对比了。 - Sam
@Thomas M:我没有代码示例...但你可以在这里或谷歌搜索。它基本上是关于获取浏览器窗口的尺寸,然后进行一些数学计算(边距=浏览器窗口宽度-内容大小),再进行一些数学计算(左边距=边距/2)和(右边距=边距/2-滚动条宽度)。等等...需要测试和调整,IE可能会让你想撕下头皮 :d - Damb
@Thomas M,请参见我在上面原始答案中的第4次编辑。这是一个简单的、一行纯CSS解决方案,但我尚未在所有浏览器中进行测试。也许你可以尝试一下并回来告诉我们。 :) - Sparky
通常来说,尊重默认的浏览器行为是一个很好的设计原则,但是内容移动是一种情况,这种默认行为实际上可能会削弱用户体验。与其保持默认行为或者拼凑JS方法,通过默认方式呈现一个不活动的滚动条是完全可以接受的。它在所有平台和屏幕尺寸上的表现都很稳定,并且实现起来极为简单。当然,每个设计决策都有其权衡之处,但这已经不是1999年了,你不会找到很多人认为用户不理解滚动条的工作方式。 - Matt Howell
显示剩余7条评论

0

你也可以使用PHP,在长页面上添加左填充值,但是滚动条在不同的浏览器/平台上宽度不同,因此JavaScript将是唯一完美的像素解决方案。


谢谢回复。我想尝试一下看看能否实现这个“像素完美”的解决方案。那么我该如何开始呢?你有任何我可以参考的例子吗? - Thomas
@Thomas,如果你想要完美的像素解决方案,你需要考虑使用JavaScript(或其衍生库)的解决方案。如果你愿意考虑JavaScript,请考虑添加“javascript”标签,并在可能的情况下,提供你愿意使用的库的名称(如果有)。 - David Thomas
基于服务器的解决方案(如使用PHP)无法解决此问题,因为这完全取决于浏览器渲染时发生了什么。 - Matt Howell
@bigmattyh。我同意,除非我只关心FF,我知道FF滚动条宽度为16px,然后我使用php生成我的CSS,检查是否在有问题的页面上,并添加16px填充。(只是为了明确起见,我永远不会这样做,只是说它可以完成。我同意其他人的观点,不要改变默认行为。) - Sam

0
如果您想要一个纯CSS选项,我相信在body内部放置一个绝对定位的div,宽度和高度为100%,overflow设置为auto,右侧填充大于滚动条宽度,就可以替换正常的滚动条而不会在长页面上向左移动内容。
我知道我很久以前使用过这种技术,但我无法记住我必须使用的确切CSS技巧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接