问题
如标题所说,在子元素内容的宽度并没有超过屏幕大小的情况下,设置了width:100%后,再设置 overflow:auto会出现无意义的左右滚动条(如下图)。
又或者设置了overflow:hdden,会出现右边内容显示不全,但左边外边框显示正常的情况。
原因
由于我没有系统的学习过css,参考了其他人的less样式设置,而有些样式我与其他人的不同,导致了此结果。再仔细对比调试过样式后,我找到了导致该问题的重要属性: box-sizing
。
这里引用菜鸟教程里的描述:
box-sizing 属性定义如何计算一个元素的总宽度和总高度,主要设置是否需要加上内边距(padding)和边框等。
例如,假如您需要并排放置两个带边框的框,可通过将 box-sizing 设置为
“border-box”。这样就可以让浏览器呈现出带有指定宽度和高度的框,并把边框和内边距放入框中。默认情况下,元素的宽度(width) 和高度(height)计算方式如下:
width(宽度) + padding(内边距) + border(边框) = 元素实际宽度
height(高度) + padding(内边距) + border(边框) = 元素实际高度
- content-box
默认值。如果你设置一个元素的宽为 100px,那么这个元素的内容区会有 100px 宽,并且任何边框和内边距的宽度都会被增加到最后绘制出来的元素宽度中。 - border-box
告诉浏览器:你想要设置的边框和内边距的值是包含在 width 内的。也就是说,如果你将一个元素的 width 设为 100px,那么这 100px 会包含它的 border 和 padding,内容区的实际宽度是 width 减 去(border + padding) 的值。大多数情况下,这使得我们更容易地设定一个元素的宽高。
注:border-box 不包含 margin。 - inherit
指定 box-sizing 属性的值,应该从父元素继承
正好在我参考的代码中,使用了 box-sizing: border-box
,即元素实际宽度==width,内边距包含在width里面。
自用重置浏览器样式代码
将下面代码内容复制进全局less并引用即可
reset.less
* {
box-sizing: border-box;
}
html {
height: 100%;
font-size: 14px;
}
body {
margin: 0;
}
ul,
h1,
h3,
h4,
p,
dl,
dd {
padding: 0;
margin: 0;
}
a {
text-decoration: none;
outline: none;
}
i {
font-style: normal;
}
img {
max-width: 100%;
max-height: 100%;
vertical-align: middle;
object-fit: cover;
}
ul {
list-style: none;
}