在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分。这四个部分占有的空间中,有的部分可以显示相应的内容,而有的部分只用来分隔相邻的区域。4个部分一起构成了css中元素的盒模型。其结构如下图所示:
下面介绍一下关于盒模型的常见知识点:
1.盒模型共有两种:W3C盒模型和IE盒模型。
两者的区别为W3C盒模型元素的宽度为content-box的宽度,而IE盒模型的元素宽度为content+padding+margin的宽度。
CSS3中新增属性box-sizing
:initial 默认值,即content-box
:inherit 继承父元素的值
:content-box 元素的宽度 = content(即CSS中设置的width)+padding+border
:border-box 元素的宽度 = width(CSS中设置的width)
calc(支持百分比和像素的混合计算)
如width:-webkit-calc(40% - 30px);
注:使用calc需加上前缀,运算符加减(+、-)与数值之间应有空格,否则会认为非法,乘除(*、/)不需要。
2.对于行内元素与块元素
块元素
可以设置盒模型的各个属性值。块元素border和padding取负值非法,而margin可以。
块元素之间的距离根据margin-top和margin-bottom的取值分为如下几种:
a.都是正数:距离取margin-top和margin-bottom的最大值
b.都是负数:取最小值
c.一正一负:正负相加
行内元素
不可以设置宽(width),高(height),对于margin和padding在水平方向设置有效而垂直方向无效,即margin-left与margin-right有效,margin-top和margin-bottom无效,padding也如此。
3.对于块级元素的盒模型
元素的宽度
使用js获取盒模型各属性值。若CSS样式为内联样式,可通过element.style.marginLeft获取到;若不是行内元素,style无法获取,IE浏览器和Opera可以使用currentStyle属性获取定义在外部的样式,其他浏览器可通过window.getComputedStyle来获取。
function getCurrentStyle(element){
var currentStyle = null;
if(element.currentStyle){
currentStyle = element.currentStyle;
}
else{
currentStyle = window.getComputedStyle(element);
}
return element.currentStyle;
}
指定了宽度width
1、getCurrentStyle(box).width 得到值为设置的width
2、box.clientWidth 得到的值为width+padding
3、box.offsetWidth 得到的值为width+padding+border
jQuery:$("#box").width();
$("#box").css('width');
两个得到的值均为设置的width值,区别为上面得到的是数字,下面得到的是字符串(如“100px”);
未指定宽度
1、什么都未指定,则占满父元素
2、指定margin值,宽度=父元素宽度-margin
3、若设置了display:inline-block或float或position:absolute时,宽度为包裹内容的宽度
background属性的覆盖区域
a.background-color背景色
为border-box覆盖的区域
b.background-image背景图片
默认填充padding-box,即左上方从padding-box开始填充,右下角会超出到border-box,但不会到margin-box。
CSS3新属性background-origin:border-box
padding-box
content-box
来设置背景图片填充范围。
overflow:hidden
隐藏padding-box以外的部分
left/top定位
a.left/top值为默认值(auto),元素在紧贴父元素的content-box区域的左上侧
b.left/top为指定值,参照父元素padding-box左上角定位
c.元素自身定位初始点为最外围的margin-box