CSS盒子模型

204 阅读7分钟

任何元素都可以看作盒子,css盒子模型本质上是一个盒子,封装周围的HTML元素。每个盒子有自己的大小和位置,并且还影响着 其他盒子的大小与位置。

css盒子模型(Box module)有以下几部分组成

  • content(实际内容)
  • padding(填充)
  • border(边框)
  • margin(边距)

通常情况下我们设置的背景,包含的区域为content+padding+border,margin为透明的,不包含在里面。

元素框的总宽度 = 元素(content)的width + padding的左边距和右边距的值 + margin的左边距和右边距的值 + border的左右宽度

元素框的总高度 = 元素(element)的height + padding的上下边距的值 + margin的上下边距的值 + border的上下宽度

css盒子模型有两种

  • W3C盒子模型(标准盒模型):****box-sizing: content-box; ( 浏览器默认设置 )
  • IE盒子模型(怪异盒模型) : box-sizing: border-box;

W3C盒子模型(标准盒模型)

IE盒子模型(怪异盒模型)

标准模型和IE模型的区别:

计算宽度和高度的不同。
标准盒模型:盒子总宽度/高度 = width/height + padding + border + margin。( 即 width/height 只是内容高度,不包含 padding 和 border 值 )
IE盒子模型:盒子总宽度/高度 = width/height + margin = (内容区宽度/高度 + padding + border) + margin。( 即 width/height 包含了 padding 和 border 值 )

也就是元素的width/高度计算不同

标准盒模型: 

元素width=contentwidth
元素height=contentheight

IE盒子模型

元素width=contentwidth+padding(左右)+border(左右)
元素height=contentheight+padding(上下)+border(上下)

也就是当设置了元素的宽高之后,改变padding+border,标准盒模型的width不会改变,但是IE怪异模型会改变content的宽高(缩放)。

例:

<div class="box">
    content
</div>
.box{
    width: 100px;
    height: 100px;
    border: 5px solid red;
    padding: 0px;
    margin: 20px;}

修改padding为20px后,盒子占总空间的距离缩小,但是content的width没变。

.box{
    width: 100px;
    height: 100px;
    border: 5px solid red;
    padding: 0px;
    margin: 20px;
}

当设置为怪异模型后:content的宽度缩小,被挤压。盒子占据的总空间没变。

.box{
    width: 100px;
    height: 100px;
    border: 5px solid red;
    padding: 20px;
    margin: 20px;
    box-sizing: border-box;
}

JS如何获取盒模型对应的宽和高

(1)dom.style.width/height 只能取到行内样式的宽和高,style 标签中和 link 外链的样式取不到。
(2)dom.currentStyle.width/height (只有IE兼容)取到的是最终渲染后的宽和高
(3)window.getComputedStyle(dom).width/height 同(2)但是多浏览器支持,IE9 以上支持。
(4)dom.getBoundingClientRect().width/height 也是得到渲染后的宽和高,大多浏览器支持。IE9 以上支持,除此外还可以取到相对于视窗的上下左右的距离。
(6)dom.offsetWidth/offsetHeight 包括高度(宽度)、内边距和边框,不包括外边距。最常用,兼容性最好。

补充:行内元素,块级元素,行内块级元素

通过设置display:inline| block| inline-block可以改变元素的显示方式。

1.  对于行内元素(display:inline)元素来说,设置margin-top/margin-buttom/padding-top/padding-buttom是无效的,也就是行内元素设置上面姐属性并不会影响周围元素的属性。但是设置margin-left/margin-right/padding-left/padding-right是可以影响周围元素的。例:

<div id="box"">
    <span class="item item1">test1</span>
    <span class="item item2">test2</span>
    <span class="item item3">test3</span>
</div>

span.item {
    background: black;    padding: 0px;     color: white;}
.item1{
    padding: 10px;
}

2. 对于块级元素**(display:block)**如

元素来说,设置margin/padding,width/height都是有效的。换行

3. 对于行内块级元素**(display:inline-block)**如元素来说,既可以让元素按照行内元素的方式布局(不换行),也可以设置margin/padding/width/height等属性。

边距塌陷:

1. 当上下相邻块级元素,上面元素设置margin-buttom。下面元素设置了margin-top,那两个元素的垂直间隔一般不是margin-buttom+margin-top,而是按照以下规则进行计算:

  • 当两个值都为正数,取最大值。
  • 当两个值其中有负有正,则两个相加
  • 当两个都为负数,取最小值。
  • 当两个相同,则取其中一个。

2. 对于两个嵌套关机的块级元素,若父元素没有设内边距与边框,则父元素的上边距会与子元素上边距发生合并,合并为方式和1类似。即使父元素没设边距.例:

<div class="box">
   <div class="item1">test1</div>
</div>
.box{
    width:300px;
    height:100px;
    margin:0px;
    background: aqua
}
.item1{
     width: 100px;
     height: 50px;
     margin-top: 20px;
     background: bisque;
}

当给父元素设置边框或者padding后,即可避免父子元素外边距塌陷问题,例:

<div class="box">
   <div class="item1">test1</div>
</div>.box{
    width:300px;
    height:100px;
    margin:0px;
    padding:10px;
    background: aqua
}
.item{
     width: 100px;
     height: 50px;
     margin-top: 20px;
     background: bisque;
}

BFC(块级格式化上下文):解决边距塌陷

参考地址

1. BFC基本概念:BFCCSS 布局的一个概念,是一块独立的渲染区域,是一个环境,里面的元素不会影响到外部的元素 。

2. BFC原理(渲染规则|布局规则):

  1. 内部的 Box 会在垂直方向,从顶部开始一个接着一个地放置;
  2. Box 垂直方向的距离由 margin (外边距)决定,属于同一个 BFC 的两个相邻 Boxmargin 会发生重叠;
  3. 每个元素的 margin Box 的左边, 与包含块 border Box 的左边相接触,(对于从左到右的格式化,否则相反)。即使存在浮动也是如此;
  4. BFC 的区域不会与 float Box 重叠(清浮动);
  5. 计算 BFC 的高度时,浮动元素也参与计算。
  6. BFC就是页面中的一个隔离的独立容器,容器里的字标签不会影响到外部标签,反之,外部标签也不会影响BFC内部标签

3. CSS在什么情况下会创建出BFC(即脱离文档流)

  • 根元素,即 HTML 元素(最大的一个 BFC
  • 浮动( float 的值不为 none
  • 绝对定位元素( position 的值为 absolute 或 fixed
  • 行内块( display 为 inline-block
  • 表格单元( display 为 table、table-cell、table-caption、inline-block 等 HTML 表格相关的属性 )
  • 弹性盒( display 为 flex 或 inline-flex
  • 默认值。内容不会被修剪,会呈现在元素框之外(overflow 不为 visible

4. BFC作用(使用场景)

  • 自适应两(三)栏布局(避免多列布局由于宽度计算四舍五入而自动换行) --->根据规则4

两栏布局,左侧固定宽度,右侧栏自适应(浏览器的尺寸变化缩小放大)
三栏布局,左右两栏是固定宽度,中间栏是自适应

  • 防止文字环绕图片排列(根据规则4)

浮动的元素会覆盖不浮动的元素,文字会环绕图片排列,把文字所在的标签设置为BFC,可以避免文字环绕的效果

  • 避免元素被浮动元素覆盖  

给不是浮动元素的标签设置BFC,可以有效解决

  • 清除浮动

可以让父元素的高度包含子浮动元素,清除内部浮动(原理:触发父 divBFC 属性,使下面的子 div 都处在父 div的同一个 BFC 区域之内;计算BFC的高度时,浮动子元素也会参与计算,例如给浮动元素父级添加overflow:hidden)

  • 去除边距重叠现象 (由于规则2导致)

让标签分属于不同的 BFC 时,可以阻止 margin 重叠

 IFC(行内格式化上下文)

preview

IFC原理(渲染规则|布局规则):

  • 内部的 Box 会在水平方向,从含块的顶部开始一个接着一个地放置;
  • 这些 Box 之间的水平方向的 marginborderpadding 都有效;
  • Box 垂直对齐方式:以它们的底部、顶部对齐,或以它们里面的文本的基线(baseline)对齐(默认,文本与图片对其),例:line-heigthvertical-align