CSS overflow:auto滚动条出现时不跳动的解决办法

当前web届,绝大多数的页面间布局都是水平居中布局,主体定个宽度,然后margin: 0 auto的节奏~

例如,大淘宝的首页:

 


 

然而,这种布局有一个存在一个影响用户体验的隐患。应该都知道,现代浏览器滚动条默认是overflow:auto类型的,也就是如果尺寸不足一屏,没有滚动条;超出,出现滚动条。于是,问题来了:

信息流页面,如新浪微博,是从上往下push渲染的。开始只有头部一些信息加载,此时页面高度有限,没有滚动条;然后,更多内容显示,滚动条出现,占据可用宽度,margin: 0 auto主体元素自然会做偏移——跳动产生。

JS交互,本来默认页面高度不足一屏,结果点击了个“加载更多”,内容超过一屏,滚动条出现,页面主体就会左侧跳动。

结构类似几个页面通过头部的水平导航刷新切换,结果有的页面有滚动条,有的没有。造成的结果就是,导航尼玛怎么跳来跳去!

当前优化这种体验问题,一般有两种解决方法:

高度尺寸不确定的,例如,新浪微博,使用:

body { overflow-y: scroll; }

 


 

高度确定的,例如淘宝网首页。使用CSS把页面尺寸布局骨架搭好,再在里面吐数据。于是,要么没有滚动条,要么滚动条直接出现。不会出现跳动。

 


 

然而,然而,后面的策略只适合一些特殊的定制性很强的页面。你说像知乎这样子,高度随内容而定的页面,显然就无法驾驭;而第1种方法overflow-y: scroll,在页面高度较小的时候,依然会保留一个丑陋的灰色的滚动栏,这其实又回到了IE当道的旧社会时代。现代浏览器做的那些默认视觉优化岂不是白费了,想想就好痛心。

 

 

大师,难道就没有一了百了、两全其美、三生有幸的方法了吗?

 

 

阿弥陀佛,骚年,请看我手中的这盏灯……

CSS3计算calc和vw单位巧妙实现滚动条出现页面不跳动

很简单,只要一行代码就搞定了:

.wrap-outer {
    margin-left: calc(100vw - 100%);
}

或者:

.wrap-outer {
    padding-left: calc(100vw - 100%);
}

然后就可以庆祝放鞭炮啦!!

 

 

首先,.wrap-outer指的是居中定宽主体的父级,如果没有,创建一个(使用主体也是可以实现类似效果,不过本着宽度分离原则,不推荐);

然后,calc是CSS3中的计算,IE10+浏览器支持,IE9浏览器基本支持(不能用在background-position上);

最后,100vw相对于浏览器的window.innerWidth,是浏览器的内部宽度,注意,滚动条宽度也计算在内!而100%是可用宽度,是不含滚动条的宽度。

于是,calc(100vw - 100%)就是浏览器滚动条的宽度大小(如果有,如果没有滚动条则是0)!左右都有一个滚动条宽度(或都是0)被占用,主体内容就可以永远居中浏览器啦,从而没有任何跳动!

标题和下面的妹子都是居中效果。其中,妹子做了本文所述的“滚动无跳动”处理,而标题没有,结果,你会发现,滚动条出现与否会让标题文字跳动,但是,妹子却女神般岿然不动:

 


 

兼容性

支持:IE9+以及其他现代浏览器。

窄屏幕宽度下的处理

上面CSS还是有一点瑕疵的,浏览器宽度比较小的时候,左侧留的白明显与右边多,说不定会显得有点傻。此时,可能需要做点响应式处理会更好一点:

@media screen and (min-width: 1150px) {
   .wrap-outer {
       margin-left: calc(100vw - 100%);
   }
}

时间: 2024-11-14 12:04:05

CSS overflow:auto滚动条出现时不跳动的解决办法的相关文章

Win7系统IE浏览器弹出查看和跟踪下载解决办法

  Win7系统IE浏览器弹出查看和跟踪下载解决办法.IE是微软自带的浏览器,也是很多用户最经常使用的浏览器,最近有用户在打开IE浏览器的时候发现,会有查看和跟踪下载提示窗口弹出来,这是什么情况呢?要怎么解决?下面就让小编一次性来回答你吧. 查看和跟踪下载 解决方法: 1.首先选择打开桌面的开始菜单按钮点击打开栏目,就可以看到我们的IE浏览器Internet Explorer点击右键打开操作栏,在打开的菜单中选择"以管理员方式"打开窗口; 以管理员方式 2.在打开的IE浏览器面板窗口上

js鼠标滑过弹出层的定位IE6bug解决办法_javascript技巧

大家在写div+css的时候经常会用到弹出层,由于IE6的bug,所以当使用多个标签重复写弹出层的时候会遇到后面的层压在了弹出层的上面,这种问题在火狐浏览器下可以用z-index来解决,但是在IE6下面是不起作用的,下面的代码给大家提供了一种此类问题的解决办法,原理如下:用Jquery给弹出层的z轴依次增加高度.代码很简单,效果很显著,吼吼! 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q

【问题解决】BootStrap.css与layDate日期选择样式起冲突的解决办法

转载请注明出处http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 问题如图: 给大家看下正常的layDate年份选择图片: 一开始想到的以为是自己没有将layer.css导入或者layDate.css没有导入出现的这个问题结果发现只要导入layer.css会自动导入layDate.css的所以问题不在这里. 然后通过火狐浏览器去查看样式结果问题出在了BootStrap.css上 * {box-sizing:border-box;}重置了浏览器的盒子

CSS技巧DIV为空时占据空间的解决办法_经验交流

此时在IE中到底是什么在影响着最终的显示,又是如何解析的呢? 可能的影响因素:字体大小(font-size),字体行高(line-height),高度(height),溢出(overflow) 我们对上面的代码逐一添加过滤属性(具体的过程有兴趣的朋友,可以私下里实验一下,"自己动手,丰衣足食"!) 在测试的过程中,你会发现IE6和IE7的解析也不尽相同,比如在给div设置了line-height:0; height:0; 的样式后,IE7中显示正常了,不再占据物理空间了,而IE6却依然

U盘使用时弹出错误提示0x80070570的解决办法

  1.将鼠标移至U盘图标上,然后右键单击,在弹出的选项列表中点击"属性"选项. 2.在弹出的U盘属性窗口中,选择"工具"标签,再点击"开始检查"按钮. 3.然后勾选"自动修复文件系统错误"和"扫描并尝试恢复坏扇区"两项,点击"开始"按钮,进行U盘修复.

CSS透明属性详解及背景透明继承解决办法hack

透明往往能产生不错的网页视觉效果,先奉上兼容主流浏览器的CSS透明代码:  代码如下 复制代码 .transparent_class { filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity: 0.5; opacity: 0.5; } 上面的几个属性分别是: opacity: 0.5; 这是最重要的,因为它是CSS标准.该属性支持Firefox, Safari和 Opera. filter:alpha(opacity=50); 这个

IE6弹出“已终止操作”的解决办法_javascript技巧

在实际的项目中,我的这个js是在头部页面里面,头部被多个页面引用,如果在每个页面的body元素里面加<body onload="函数">,可以解决问题,但是这样做太不符合实际了.毕竟全改的话,到时候布署到外网,要更新太多的文件.于是,在网上找了一下,让这段js最后执行的代码,终于让我找到了.代码如下: 复制代码 代码如下: <scirpt type="text/javascript"> document.onreadystatechange

整理linux编译link出undefined reference’dlclose’错误解决办法

对于linux我持中立态度,而且我认为linux这么多年发展比较慢的原因是因为桌面化做的不好或者不够好,所以我比较偏爱ubuntu. 由于以前项目是makefile的,我个人不是很喜欢makefile,因为他看起来比较费劲,而且编译完成后出现问题调试是个大难题,不是每个人都精通gdb,而且vi上手比较难.所以将工程转为codeblocks的cbp,本来想使用cmake的,但是觉得要写的比较多,于是作罢,毕竟代码不是跨平台的,windows下没法用. 编译完link的时候,报了一句undefine

LG手机收不到/发不出彩信最有效的解决办法

现象 安卓手机无法收发彩信 解决 1. 手机支持彩信功能,但需要网络运营商支持才可以使用(手机卡需开通彩信业务). 2. 如已开通,建议查看手机是否可以上网,建议在菜单[设置]无线和网络移动网络已启用数据勾选开启上网功能尝试. 3. 如上网正常,可能接受彩信文件过大,建议用手机编辑一条彩信发送到自己的手机上查看是否正常. 4. 如接受自己发的正常,则手机彩信功能正常;如还是无法接收,建议换其他电话卡尝试. 5. 仍旧无法正常使用,建议进入菜单[设置]无线和网络(更多)移动网络接入点名称 点触左下