页面滚动条形成宽度减少的场景很常见了,因为div
块级元素的流动性,其宽度默认为100%的body
宽度,可是当容器的高度超过视口宽度时候,页面就会出现滚动条,这个滚动条的宽度就会挤压body
的可用宽度,也就是会挤压咱们的容器的宽度,形成页面晃动的现象,很不友好,下面就来探讨下如何解决这个滚动条的问题。css
既然要解决滚动条形成的问题那么首先须要了解滚动条,即scrollbar
的信息主要就是他的宽度,咱们把页面的overflow
置为scroll
,那么滚动条就会默认占据了空间,下面代码就能够很容易获得其宽度了:html
CSS: 先把body的间距置为0chrome
* { margin: 0; padding: 0; } html { overflow-y: scroll; }
JS: 用视口的innerWidth
减去body
就是滚动条的宽度浏览器
console.log('chrome下滚动条的宽度', window.innerWidth - document.body.clientWidth)
能够得出chrome浏览器下,宽度为17px,我在jsfiddle
中写的话打印出来是16px,我没有在全部浏览器都去验证,可是各浏览器的值可能略有不一样,但都是一个固定的值。以chrome来讲,就是在触发页面滚动条时候,会挤压掉17px的空间,那咱们就能够从不一样角度考虑去解决了。wordpress
首先来说下最原始的方法,其思想是既然在触发滚动条时候会挤压空间,那么直接在没有滚动条的时候也触发不就能够了么,也就是咱们上面算宽度时候的设置:工具
html { overflow-y: scroll; }
这样不论何时都有滚动宽度占据空间,不存在挤压的问题了...可是这样作有点蠢,毕竟在不须要滚动条的时候也有那么个丑丑的条子放在右边。可是他的优势在于方便并且没有兼容性的问题,其实不少大网站有时候也就这样用了。。。布局
chrome下overflow
有个新的属性值overlay
,这个属性简直就是为了这个问题而生,他和auto
有点像,可是区别就是在触发滚动条时候并不挤压空间,说得直白点就像是移动端的悬浮滚动条,惟一的区别就是不会像手机上那样自动出现自动消失了,滚动条会遮盖住容器17px的空间。眼见为实用下面代码看一下就知道。
高度还未触发滚动条时候:网站
* { margin: 0; padding: 0; } html { overflow-y: overlay; } .container { height: 200px; padding: 17px; background-color: #00b83f; text-align: right; } <div class="container"> <h1>我是容器内容</h1> </div>
效果图以下:spa
而后修改容器高度,触发滚动条:3d
.container { height: 2000px; padding: 17px; background-color: #00b83f; text-align: right; }
效果图以下:
能够看到虽然出现了滚动条可是并未挤压容器的宽度,而是遮住了17px的空间,其实本质上就至关于实现了移动端的滚动条表现。
可是很是遗憾,这个属性值目前只有chrome支持,要是ff/ie都支持,后面也就不用写了,可是听说之后都会加上去支持的,能够说是很是好用了,后面的方法也只是用其余方法实现这个效果而已。
由于100vw是window
的宽度,其实就是window.innerWidth
, 而容器的宽度100%就是除了滚动条的可用宽度,所以在没有滚动条时候calc(100% - 100vw)
就是0,触发滚动条时候其值为负的滚动条宽度,咱们将其赋值给容器的margin-right
,便可巧妙补偿这个宽度的挤压,在滚动条存在的状况下容器宽度仍然占据整个视口的宽度。
* { margin: 0; padding: 0; } html { overflow-y: auto; overflow-x: hidden; } .container { height: 2000px; margin-right: calc(100% - 100vw); padding: 17px; background-color: #00b83f; text-align: right; }
效果如同方法二,很完美,而且兼容性还不错,起码高版本的ie和ff都没问题了。
连接在此,这个利用了绝对定位,保证了body的宽度一直保持完整空间。
html { overflow-y: scroll; //这是为了兼容ie8,不支持:root, vw } :root { overflow-y: auto; overflow-x: hidden; } :root body { position: absolute; } body { width: 100vw; overflow: hidden; }
上面是针对浏览器视口的滚动条方案,可是假如在一个普通div
容器中也有如此的需求改怎么办呢?所以此时并无像100vw这样的值直接获取容器的宽度,只能使用js的方法来检测计算而后再用margin-right
作补偿,原理都是同样的,可是我强烈不推荐也不喜欢用js来计算布局...所以在这种状况下勉强委屈下用上面的第一种方法了,若是是chrome下用第二种方法。
.wrap { overflow-y: scroll; overflow-y: overlay; }
固然你坚定不能忍的话也能够用js去算吧...本质也是同样的,这里给个连接做为参考。
方法主要就是上面的几种,你们根据需求自由选用便可,最重要的是在使用某些新属性的时候多加思考,不少问题的本质并没什么区别,只是用新的工具去作而已。
都在文中了