javascript – 当垂直滚动条出现时,如何阻止我的Web内容向左移动? 2017年建议汇编
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 当垂直滚动条出现时,如何阻止我的Web内容向左移动? 2017年建议汇编,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7610字,纯文字阅读大概需要11分钟。
内容图文
![javascript – 当垂直滚动条出现时,如何阻止我的Web内容向左移动? 2017年建议汇编](/upload/InfoBanner/zyjiaocheng/713/21ebe170632c40739192b4cdc9e677d3.jpg)
参见英文答案 > Prevent scroll-bar from adding-up to the Width of page on Chrome 12个
> Prevent a centered layout from shifting its position when scrollbar appears 6个
许多程序员已经询问如何停止他们的网页内容 – 特别是他们的中心网页内容(页边距:0自动;) – 当垂直滚动条出现时,水平移动(被推).这对于Ajax用户和像我这样使用隐藏div和标签来组织数据的人来说一直是个问题.
当当前显示的页面改变使得所显示的材料的高度(内窗口高度)突然大于物理窗口高度时,会出现问题.
所有滚动条都不相同的现实加剧了这个问题.不同的浏览器为它们的滚动条赋予不同的宽度,并且不能(或者,至少,不应该)预测该差异.简而言之,理想的解决方案是滚动条宽度无关.
因此,这是一个自我回答的问题,在2017年8月5日之前将所有这些答案与其有用性(在可能的情况下)的评论以及我自己的解决方案汇总到一个答案.我已将其标记为重复我可以找到以前的问题,以便人们可以找到有关该问题的全面讨论.
请注意,这个答案解决了BODY内容转移的问题.如果您的DIV具有固定高度且存在移位问题,则应将DIV宽度设置为固定(px)宽度,以使其滚动条浮动在文本上方并添加一些右侧填充以防止文本落在其下方.贡献者:Hashbrown,
Avrahamcool,
Edward Newsome
解决方法:
在进入个别解决方案之前,应该提到它们分为三类:基于CSS,CSS3和Javascript的解决方案.
CSS解决方案往往是山脊,但非常可预测,并得到很好的支持.
CSS3解决方案的CPU计算成本与Javascript类似,但易于实现.然而,在2017年之前的几年里,他们在浏览器中得到了零星的支持.随着时间的推移,这种情最终,它们可能是最好的解决方案,但我今天的调查已经证明支持仅仅是不够一致,而且,传统的浏览器支持是不存在的.
Javascript解决方案(无论是直接Javascript还是jQuery)需要额外的编码才能使它们健壮,因为它们没有(例如)窗口大小调整的内在支持.然而,它们是最可预测和最向后兼容的,同时仍然保留了页面的美感.我认为旧版浏览器的行在IE6和IE7之间.坦率地说,我对任何仍在使用旧浏览器的人表示哀悼.
请注意,我没有包含以前发布到Stack Exchange的每个CSS3和Javascript解决方案.有些虽然很新颖,却有很多弱点,因此不包括在内.
解决方案#1:CSS解决方案
贡献者:Hive7,koningdavid,Christofer Eliasson,Alec Gorge,Scott Bartell,Shawn Taylor,mVChr,fsn,Damb,Sparky,Ruben,Michael Krelin – hacker,Melvin Guerrero
强制滚动条始终打开.
<style>
html {
overflow-y: scroll;
}
</style>
这种解决方案基本上保证始终有效(有一些例外,但它们非常罕见),但它在美学上却令人不悦.无论是否需要,都会始终看到滚动条.虽然一致意见是在html标签中使用此解决方案,但有些人建议在body标签中使用它.
后果
Microsoft(IE10)已经实现了浮动滚动条,这意味着您的页面可能不像其他浏览器那样居中.但是,这似乎是一个非常小的问题.
当使用FancyBox,Flex-Box或Twitter Bootstrap Modal等结构化接口时,这会导致双滚动条出现,因为这些接口会创建自己的滚动条.
程序员应该避免使用overflow:scroll,因为这会导致出现垂直和水平滚动条.
解决方案#1a:替代方案
贡献者:koningdavid,Nikunj Madhogaria
一个聪明的选择,但只有一个微小的美学差异,是这样做:
<style>
html {
height: 101%;
}
</style>
这将激活滚动条背景,但不会激活滚动条选项卡,除非您的垂直内容实际溢出窗口的底部边缘.然而,它具有相同的缺点,即无论是否需要,滚动条空间都被永久消耗.
解决方案#1b:更现代的解决方案
贡献者:Kyle Dumovic,SimonDos
浏览器开始使用滚动条的叠加值,模仿IE10的浮动滚动条.
<style>
html {
overflow-y: overlay;
}
</style>
此解决方案模仿IE10中的浮动滚动条,但它尚未在所有浏览器中提供,并且仍然存在一些实现怪癖.众所周知,此解决方案不适用于Bootstrap Modal等基础架构环境.
解决方案#2:CSS3解决方案
使用CSS3计算宽度.有很多方法可以做到这一点,各有利弊.大多数缺点是由于(a)不知道实际的滚动条宽度,(b)处理屏幕大小调整,以及(c)CSS正在慢慢变成另一种全功能的编程语言 – 如Javascript – 但是还没有完全演变成这样的.它是否有意义成为这样是另一个问题的辩论.
The argument that users may disable Javascript and so a CSS-only solution is preferable is becoming irrelevant.?Client-side programming has become so ubiquitous that only the most paranoid of people are still disabling Javascript.?Personally, I no longer consider this a tenable argument.
应该注意,一些解决方案会修改边距,而其他解决方案会修改填充.那些修改边距有一个共同的问题:如果你有导航条,标题,边框等使用与页面背景不同的颜色,这个解决方案将暴露不需要的边框.使用保证金的任何解决方案都可能被重新设计为使用填充,反之亦然.
解决方案#2a:基于HTML的解决方案
贡献者:TranslucentCloud,Mihail Malostanidis
<style>
html {
margin-left: calc(100vw - 100%);
margin-right: 0;
}
</script>
解决方案#2b:基于BODY的解决方案
贡献者:Greg St.Onge,Moesio,Jonathan SI
<style>
body {
padding-left: 17px;
width: calc(100vw - 17px);
}
@media screen and (min-width: 1058px) {
body {
padding-left: 17px;
width: calc(100vw - 17px);
}
}
</style>
100vw是视口宽度的100%.
后果
一些用户已经建议这种解决方案在调整窗口大小时产生不希望的屏幕噪声(可能在调整大小过程期间多次发生计算过程).一种可能的解决方法是避免使用margin:0 auto;使您的内容居中,而是使用以下内容(示例中显示的1000px和500px分别代表您的内容最大宽度和一半数量):
<style>
body {
margin-left: calc(50vw - 500px);
}
@media screen and (max-width: 1000px) {
body {
margin-left: 0;
}
}
</style>
这是一个固定滚动条宽度的解决方案,它不依赖于浏览器.要使其与浏览器无关,您必须包含Javascript以确定滚动条的宽度.计算宽度但不重新合并值的示例是:
请注意,下面的代码段已经多次在Stack Exchange和Internet上的其他位置发布,没有公司归属.
function scrollbarWidth() {
var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div>');
// Append our div, do our calculation and then remove it
$('body').append(div);
var w1 = $('div', div).innerWidth();
div.css('overflow-y', 'scroll');
var w2 = $('div', div).innerWidth();
$(div).remove();
return (w1 - w2);
}
解决方案#2c:基于DIV的解决方案
贡献者:Rapti
使用直接应用于容器DIV元素的CSS3计算.
<body>
<div style="padding-left: calc(100vw - 100%);">
My Content
</div>
</body>
后果
与所有CSS3解决方案一样,并非所有浏览器都支持此功能.即使那些支持视口计算的浏览器也没有(截至本文撰写之日)支持其任意使用.
解决方案#2d:Bootstrap模态
贡献者:Mihail Malostanidis,kashesandr
Twitter Bootstrap Modal的用户发现将以下CSS3应用于他们的HTML元素很有用.
<style>
html {
width: 100%;
width: 100vw;
}
</style>
另一个建议是在内容包装器周围创建一个包装器,用于自动检测视口宽度的变化.
<style>
body {
overflow-x: hidden;
}
#wrap-wrap {
width: 100vw;
}
#content-wrap {
margin: 0 auto;
width: 800px;
}
</style>
我没有尝试过这两种方法,因为我不使用Bootstrap.
解决方案#3:Javascript解决方案
这是我最喜欢的解决方案,因为它处理所有问题,并且与传统浏览器合理地向后兼容.最重要的是,它的滚动条宽度独立.
<script>
function updateWindow(){
document.body.style.paddingLeft = (window.innerWidth - document.body.clientWidth);
document.body.onclick=function(){
document.body.style.paddingLeft = (window.innerWidth - document.body.clientWidth);
}
}
window.onload=updateWindow();
window.addEventListener("resize", updateWindow());
updateWindow();
</script>
后果
updateWindow()的最后一个命令;应该在< / body>之前发生标签,以避免动态加载内容的问题,如Facebook Like-Boxes.看起来它对window.onload事件来说是多余的,但并不是每个浏览器都以相同的方式处理onload.有些人等待异步事件.其他人没有.
每次用户在网页中单击时,都会执行该功能.感激不尽,现代计算机足够快,这不是一个问题.仍然….
最后,该函数应在任何div异步更新(AJAX)之后执行.这没有在这个例子中显示,但是将成为就绪状态条件的一部分.例如:
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
if(xmlhttp.responseText == 'false'){
//Error processing here
} else {
//Success processing here
updateWindow();
}
}
}
解决方案#3a:测量滚动条宽度
贡献者:Lwyrn
这是一个不太有价值的解决方案,需要花时间来测量滚动条宽度.
<script>
var checkScrollBars = function(){
var b = $('body');
var normalw = 0;
var scrollw = 0;
if(b.prop('scrollHeight')>b.height()){
normalw = window.innerWidth;
scrollw = normalw - b.width();
$('#container').css({marginRight:'-'+scrollw+'px'});
}
}
</script>
<style>
body {
overflow-x: hidden;
}
</style>
后果
与其他解决方案一样,此解决方案会永久禁用水平滚动条.
内容总结
以上是互联网集市为您收集整理的javascript – 当垂直滚动条出现时,如何阻止我的Web内容向左移动? 2017年建议汇编全部内容,希望文章能够帮你解决javascript – 当垂直滚动条出现时,如何阻止我的Web内容向左移动? 2017年建议汇编所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。