整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端开发:看了就会的CSS盒模型详解

源 | https://juejin.im/post/59ef72f5f265da4320026f76


CSS的盒模型是CSS的基础,同时也是难点,这个问题经常在面试中会被问到,属于经典问题了。很多博客里讲得也很模糊不清,于是,我在这里重新整理一下。
可以认为每个html标签都是一个方块,然后这个方块又包着几个小方块,如同盒子一层层的包裹着,这就是所谓的盒模型。

盒模型分为IE盒模型和W3C标准盒模型。

IE盒模型和W3C标准盒模型的区别是什么?

1. W3C 标准盒模型:

属性width,height只包含内容content,不包含border和padding。

2. IE 盒模型:

属性width,height包含border和padding,指的是content+padding+border。

在ie8+浏览器中使用哪个盒模型可以由box-sizing(CSS新增的属性)控制,默认值为content-box,即标准盒模型;如果将box-sizing设为border-box则用的是IE盒模型。如果在ie6,7,8中DOCTYPE缺失会触发IE模式。在当前W3C标准中盒模型是可以通过box-sizing自由的进行切换的。

content-box(标准盒模型)

width = 内容的宽度

height = 内容的高度

border-box(IE盒模型)

width = border + padding + 内容的宽度

height = border + padding + 内容的高度

谷歌浏览器,按下F12,然后把右边栏的滚动条拉到最下面你就会看到一个东西:

通过代码来对其进行理解,更直观,如下
.box{        width:200px;        height:200px;        background-color:pink;}

此时,盒子大小就是content的大小。
.box{        width:200px;        height:200px;        background-color:pink;        padding:20px;}

此时,盒子的长宽变成了240x240,显然,padding是能够改变盒子的大小的,这时盒子大小就等于content+padding。
.box{        width:200px;        height:200px;        background-color:pink;        padding:20px;        border:10px solid black;}

此时,盒子的长宽变成了260x260,所以这时盒子大小就等于content+padding+border。
.box{        width:200px;        height:200px;        background-color:pink;        padding:20px;        border:10px solid black;        margin-bottom:10px;}.box1{        width: 100px;        height: 100px;        background: green;}
效果图如下:

此时,盒子的长宽仍为260x260,即盒子的大小并未发生变化。

可以看到,盒子的底部产生了10px的空白。

所以说,盒子的大小为content+padding+border即内容的(width)+内边距的再加上边框,而不加上margin。

很多时候,我们会错误地把margin算入,若那样的话,上面这种情形盒子的大小应该是260x270,但实际情况并不是这样的。

css的盒模型由content(内容)、padding(内边距)、border(边框)、margin(外边距)组成。但盒子的大小由content+padding+border这几部分决定,把margin算进去的那是盒子占据的位置,而不是盒子的大小!

我们可以试着给上面的粉色方块设置box-sizing属性为border-box发现,会发现:无论我们怎么改border和padding盒子大小始终是定义的width和height。如下
.box{        width:200px;        height:200px;        background-color:pink;        box-sizing:border-box;        padding:20px;}

我们在编写页面代码时应尽量使用标准的W3C模型(需在页面中声明DOCTYPE类型),这样可以避免多个浏览器对同一页面的不兼容。

因为若不声明DOCTYPE类型,IE浏览器会将盒子模型解释为IE盒子模型,FireFox等会将其解释为W3C盒子模型;若在页面中声明了DOCTYPE类型,所有的浏览器都会把盒模型解释为W3C盒模型。

在前端面试的过程中,CSS盒模型是一道问的频率非常高的问题。目前网上也有很多解释CSS盒模型的文章,看了之后自己也总结了下相关知识点,大家一起来看看吧。

感兴趣的同学可以加下我自己维护的群624-576-634。

CSS

CSS盒模型-What?

我们首先要了解的一个内容就是,什么是CSS盒模型呢?

简单点说我们可以把一个HTML页面看做一个大的方块,在这个大的方块里会嵌套很多小方块(DOM元素),然后小方块又会嵌套其他的小方块,这样一层层的嵌套着就构成了一个盒模型。

既然页面的结构都是由一系列HTML标签构成,为什么还会有不同的盒模型呢?

想当年微软的IE浏览器占据超过80%市场份额的时候,觉得自己财大气粗(是不是有点黑-_-!),想自己独立制定一套浏览器标准,其中就包括IE的盒模型,但是其他诸如Mozilla,Google等公司不同意IE的做法,他们遵循的是W3C的标准来定制浏览器,也就是W3C标准盒模型,因此就造成了现在浏览器不同的CSS盒模型了。

接下来我们具体看看IE盒模型和W3C盒模型有什么具体的不同吧。

对比

  • W3C标准盒模型

元素的width和height属性只包含内容content部分,不包含内边距padding和边框border部分。

  • IE标准盒模型

元素的width和height属性同时包含内容content,内边距padding和边框border部分,即:

width = content + padding + border

使用

那么我们该如何切换两种盒模型的展示呢?

在IE8及以下的浏览器中只支持IE盒模型,在IE8+及其他主流浏览器中,通过CSS新增的box-sizing属性可以设置浏览器的盒模型。box-sizing属性的默认值是content-box,即W3C标准盒模型;而将box-sizing值设置为border-box时,则会更改为IE盒模型。

接下来我们通过代码和界面效果来看看两种盒模型的差异。

效果展示

以下测试都在Chrome浏览器中进行。

  • W3C盒模型

首先定义一个div,有如下CSS属性。

定义一个div

如上所讲,在不设置box-sizing属性的情况下会采用W3C标准盒模型,在页面呈现的结果如下所示。

页面效果

左侧是HTML页面的效果,右侧是通过查看浏览器的style效果。从中可以看出内容宽度(浅蓝色部分)为100px,横向实际占据的空间为content+padding+border,也就是100px+20px*2+10px*2=160px,乘以2是因为有左右两个方向。

  • IE盒模型

同样的元素我们再看看在IE盒模型下是什么样的展示。只需要添加box-sizing: border-box;属性即可。

css样式

其呈现的效果如下图所示。

页面效果

从图中可以看出,width设为100px,其占据的宽度也就是100px,其中实际内容的宽度只有40px大小(浅蓝色部分),padding-left和padding-right各占20px,border-left和border-right各占10px,因此是40+20*2+10*2=100px。

由以上的例子就可以很明显的看出IE盒模型和W3C标准盒模型的区别了。

关于margin

不管是在IE盒模型还是W3C标准盒模型中,margin产生的效果是一样的,都是会占用实际的空间,但是不改变盒子大小。

我们在上面例子的CSS属性中再加入margin: 30px;

首先看看在IE盒模型下效果图如下。

IE盒模型

通过上图可以看出盒子需要占据的空间宽度为100+30*2=160px,而盒子实际宽度仍然为100px。

然后看看在W3C标准和模型下的效果。

W3C盒模型

通过上图可以看出盒子需要占据的空间宽度为100+20*2+10*2+30*2=220px,而盒子的实际宽度为100+20*2+10*2=160px。

总结

今天这篇文章通过图例和代码讲解了CSS中两种不同的盒模型,分别是IE盒模型和W3C标准盒模型,大家都学会了吗?

解盒模型:CSS3 中的盒模型有以下两种:标准盒模型、IE盒子模型(怪异盒模型),盒模型是由4个部分组成,由内向外分别是content(下图蓝色部分)、padding、border、margin盒模型有5个属性:

  • width 元素宽
  • height 元素高
  • border 元素边框线
  • pdding元素内边距
  • margin元素外边距

一张图来理解盒模型的5个属性

父子间间距,通过给父元素设置padding来实现

兄弟间间距,通过给元素设置margin来实现

标准盒模型和 IE盒模型- 两者区别

标准盒模型IE盒模型的区别在于设置 widthheight 属性时,所对应的范围不同:

  • 标准盒模型的 width 和 height 属性的范围只包含了 content内容区。
  • IE盒模型(怪异盒模型)的 width 和 height 属性的范围包含了 border、padding 和 content

案例展示

<style>
     .box {
       width: 100px;
       height: 150px;
       padding: 20px;
       border: 10px;
       margin: 50px;
       box-sizing: border-box;/*怪异地盒子模型*/
    }
   </style>
 <body>
   <div class="box"></div>
 </body>

以上代码,在未添加box-sizing: border-box;和添加后,两者渲染后的效果如下

标准盒模型

标准盒模型下的width:100px;height:150px;只包含了content部分,所以content的宽高为100px和150px;

怪异盒模型

width:100px;height:150px;包含了border、padding、content三部分,则通过计算得出content内容区的高为: 150px-20px*2-10px*2=90px宽为:100px -20px*2 -10px*2=40px

盒模型转换

可以通过修改元素的 box-sizing 属性来改变元素的盒模型:

  • box-sizing: content-box表示标准盒模型(默认值)
  • box-sizing: border-box表示 IE 盒模型(怪异盒模型)

你学会了吗?

为帮助到一部分同学不走弯路,真正达到一线互联网大厂前端项目研发要求,首次实力宠粉,打造了《30天挑战学习计划》,内容如下:

HTML/HTML5,CSS/CSS3,JavaScript,真实企业项目开发,云服务器部署上线,从入门到精通

  • PC端项目开发(1个)
  • 移动WebApp开发(2个)
  • 多端响应式开发(1个)

共4大完整的项目开发 !一行一行代码带领实践开发,实际企业开发怎么做我们就是怎么做。从学习一开始就进入工作状态,省得浪费时间。

从学习一开始就同步使用 Git 进行项目代码的版本的管理,Markdown 记录学习笔记,包括真实大厂项目的开发标准和设计规范,命名规范,项目代码规范,SEO优化规范

从蓝湖UI设计稿 到 PC端,移动端,多端响应式开发项目开发

  • 真机调试,云服务部署上线;
  • Linux环境下 的 Nginx 部署,Nginx 性能优化;
  • Gzip 压缩,HTTPS 加密协议,域名服务器备案,解析;
  • 企业项目域名跳转的终极解决方案,多网站、多系统部署;
  • 使用 使用 Git 在线项目部署;

这些内容在《30天挑战学习计划》中每一个细节都有讲到,包含视频+图文教程+项目资料素材等。只为实力宠粉,真正一次掌握企业项目开发必备技能,不走弯路 !

过程中【不涉及】任何费用和利益,非诚勿扰 。

如果你没有添加助理老师微信,可以添加下方微信,说明要参加30天挑战学习计划,来自头条号!老师会邀请你进入学习,并给你发放相关资料

30 天挑战学习计划 Web 前端从入门到实战 | arry老师的博客-艾编程