移动端的项目不会出现这个问题,因为移动端没有滚动条的概念(除非刻意去弄一个)
摘要
Windows 系统中的滚动条是会占据视口空间的。在 MacOs 系统中,当不滚动页面时,滚动条默认是隐藏的。它们也不占据任何的视口空间,这就表示 100% 的
body
宽度等于 100% 的屏幕宽度。在 Windows 系统中,滚动条的宽度会从窗口的宽度中减掉(一般是17px
宽)。vw 单位忽视了滚动条占据视口空间(滚动条是不会影响
vw
单位计算的),还是计算整个视口的宽度。
问题描述
当页面突然出现滚动条的时候,页面会突然被挤压,因为滚动条也需要占位。如果元素设置为width:100vw;
并且有一个垂直滚动条,元素的宽度将等于视口加上滚动条的宽度。
解决方法
解决思路:滚动条出现,但是内容位置不变。
1、新属性 overlay
chrome 下 overflow
有个新的属性值 overlay
,这个属性简直就是为了这个问题而生,它和auto
有点像,但是区别就是在触发滚动条时候并不挤压空间。但是非常遗憾,这个属性值目前只有chrome支持。
html {
overflow-y: overlay;
}
2、margin-right: calc(100% - 100vw)
100vw
相对于浏览器的window.innerWidth
,是浏览器的内部宽度,注意,滚动条宽度也计算在内!而100%
是可用宽度,是不含滚动条的宽度。没有滚动条的时候,相当于 margin-right:0,没什么影响;有滚动条的时候就相当于margin-right:-17px(17px就是滚动条的宽度啦),被滚动条占据了17px后,内容再重新往右延伸了17px,效果如同overflow:overlay,很完美,并且兼容性还不错,起码高版本的 ie 都没问题了。
* {
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;
}
3、绝对定位
:root选择器:对于 HTML 来说,:root
表示 <html> 元素,除了优先级更高之外,与 html
选择器相同。
html {
overflow-y: scroll; //这是为了兼容ie8,不支持:root, vw
}
:root {
overflow-y: auto;
overflow-x: hidden;
}
:root body {
position: absolute;
}
body {
width: 100vw;
overflow: hidden;
}