CSS必学:你需要知道的盒子模型的秘密
作者:
WangMin
格言:努力做好自己喜欢的每一件事
作为前端开发来说,要掌握的CSS基础一定很多,那么CSS中盒子模型肯定是必考必问必掌握的前端知识点,因为它是CSS基础中非常重要的内容,接下来我们就一起来了解一下盒子模型吧!

什么是盒子模型?
CSS 所有的HTML 标签元素在网页中都生成了一个描述该元素在HTML文档布局中所占空间的矩形框,我们可以形象地将它看作是一个盒子,它会把各种html元素按照设计需求包裹起来,将html元素进行封装,就组成了各式各样好看的网页。
简单一点来说,页面中的每一个标签,都可以看作是一个盒子,通过盒子的视角我们可以更直观地进行网页排版布局.
盒子模型的组成以及大小的计算
盒子模型的四个组成属性:内容区域(content)、填充区域(padding)、边框(border)以及 外边距区域(margin)
下面来分别了解一下这四个属性!
内容区(content)
内容区域(content)是盒子模型的中心,它呈现了盒子的主要信息内容,这些内容可以你想要展示的任何东西,例如文本、图片等等多种类型。
这时候你会有一个疑问"内容区的大小如何确定呢?" 那么这里就可以提到width属性和height属性,这两个属性大家应该不陌生吧!
内容区域(content)就是由这两个属性组成的,使用width属性和height属性可以指定盒子内容区域的高度和宽度,如图所示

案例1:
只给元素设置width属性和height属性,我们来看看盒子模型的大小是多少?
<div id="box"></div>
<style>
#box{
width: 300px;
height: 300px;
background:#f00;
}
</style>
结果如图所示:


从上图中我们可以明显地看出盒子模型的大小为200 * 200,正是元素的高度与宽度。
由此可以的出一个结论:当一个元素只有width属性和height属性时,那么这个元素的内容区域的大小就是盒子模型的大小,
即盒子模型的大小=内容区域的大小.
边框(border)
边框是围绕在内容区和填充四周的边界
相信大家对border属性应该十分熟悉吧!border属性其实是 border-style、border-width和border-color 这三个属性的简写方式,
它们分别对应的含义与属性值如下表:
| 属性 | 含义 | 属性值 |
|---|---|---|
| border-style | 指定边框样式,是边框最重要的属性。如果没有指定边框样式,其他的边框属性都会被忽略,边框将不会显示 | dotted(点线)、dashed(虚线)、solid(实线)等等 |
| border-width | 指定边框的宽度 | 任意数值,通常单位为px |
| border-color | 指定边框的颜色 | css中任何一种颜色表示方法都可以 |

案例2:
在案例1的基础上,再给元素设置boder属性,我们来看看盒子模型的大小是多少呢?
<div id="box"></div>
<style>
#box{
width: 300px;
height: 300px;
border:3px solid #000;
background:#f00;
}
</style>
结果如图所示:


从上图中可以明显的看出,我设置的边框宽度明明是3px,为什么浏览器显示的是2.4px呢?大家这时候应该都很疑惑
这里我给大家解答一下:这可能是因为你的浏览器缩放比例不是100%,如果浏览器比例是100%而值还是对的话,那么可能是电脑的缩放比例不是100%,通常电脑比例都是125%,可以让用户视觉上由更好的体验。如果你想要浏览器显示出正确的数值,你可以将电脑的缩放比例改为100%。
那么此时从图中我们也可以看出盒子模型的大小为204.8 * 204.8
盒子模型的宽度=200(宽度)+ 2.4(左边框)+2.4(右边框)= 204.8
盒子模型的高度=200(高度)+ 2.4(上边框)+2.4(下边框)= 204.8
由此可以的出一个结论:当一个元素设置width属性、height属性以及border属性时,
那么这个元素的盒子模型的宽度 = width + 左边框 + 右边框,
元素的盒子模型的高度 = height + 上边框 + 下边框
元素的盒子模型的大小 = 元素的盒子模型的宽度 * 元素的盒子模型的高度
填充区域(padding)
填充区域是内容区域和边框之间的空间,填充区域也可以叫做内边距。
padding属性是padding -top(上内边距)、padding -bottom(下内边距)、padding -left(左内边距)、padding-right(右内边距)这四个属性的简写方式,常见的取值方式如下表:
| 取值个数 | 例子 | 含义 |
|---|---|---|
| 1 | padding:10px | 上右下左四个方向的内边距都设置为10px |
| 2 | padding:10px 30px | 上下方向的内边距设置为10px、左右方向的内边距设置为30px |
| 3 | padding:10px 30px 40px | 上内边距设置为10px、左右方向的内边距设置为30px、下内边距设置为40px |
| 4 | padding:10px 30px 40px 50px | 上内边距设置为10px、右内边距设置为30px、下内边距设置为40px、左内边距设置为50px |

案例3:
在案例1和案例2的基础上,再给元素的上下内边距设置为10px,左右内边距设置为20px,我们来看看盒子模型的大小是多少呢?
<div id="box"></div>
<style>
#box{
width: 300px;
height: 300px;
border:3px solid #000;
padding:10px 20px;
background:#f00;
}
</style>
结果如图所示:


那么此时从图中我们也可以看出盒子模型的大小为244.8 * 224.8
盒子模型的宽度=200(宽度)+ 20 (左内边距) + 2.4(左边框)+ 20 (右内边距) + 2.4(右边框) = 244.8
盒子模型的高度=200(高度)+ 10 (上内边距) + 2.4(上边框)+ 10 (下内边距) + 2.4(下边框) = 224.8
由此可以的出一个结论:当一个元素设置width属性、height属性、border属性以及padding属性时,
那么这个元素的盒子模型的宽度 = width + 左内边距 + 左边框 + 右内边距 + 右边框,
元素的盒子模型的高度 = height + 上内边距 +上边框 + 下内边距 + 下边框
元素的盒子模型的大小 = 元素的盒子模型的宽度 * 元素的盒子模型的高度
外边距区域(margin)
外边距区域位于盒子的最外面,是添加在边框外周围的空间,盒子与盒子之间的距离。外边距区域(margin)使盒子与盒子之间不会紧凑地挨在一起,是CSS 布局的一个很重要的属性。
margin属性跟padding属性类似,是**margin -top(上外边距)、margin -bottom(下外边距)、margin -left(左外边距)、margin-right(右外边距) **这四个属性的简写方式,常见的取值方式如下表:
| 取值个数 | 例子 | 含义 |
|---|---|---|
| 1 | margin:10px | 上右下左四个方向的外边距都设置为10px |
| 2 | margin:10px 30px | 上下方向的外边距设置为10px、左右方向的外边距设置为30px |
| 3 | margin:10px 30px 40px | 上外边距设置为10px、左右方向的外边距设置为30px、下外边距设置为40px |
| 4 | margin:10px 30px 40px 50px | 上外边距设置为10px、右内外距设置为30px、下外边距设置为40px、左外边距设置为50px |

案例4:
在案例1、案例2以及案例3的基础上,再给元素的上下外边距设置为10px,左右外边距设置为30px,我们来看看盒子模型的大小是多少呢?
<div id="box"></div>
<style>
#box{
width: 300px;
height: 300px;
border:3px solid #000;
padding:10px 20px;
margin:10px 30px;
background:#f00;
}
</style>
结果如图所示:


那么此时从图中我们也可以看出盒子模型的大小为244.8 * 224.8,跟案例3的结果一样没有改变。
由此可以的出一个结论::margin属性不会计算到盒子模型的大小里面去,也就是说它不会影响盒子模型的大小,它影响的是盒子与盒子之间的距离
默认宽度的情况下,盒子模型大小的计算
我们在没有设置宽度的情况下,浏览器显示的宽度就是默认宽度。
举个简单的例子来说明一下
<div id="box">今天天气真好啊!</div>
<style>
#box{
height: 100px;
background:#ccc;
}
</style>
结果如图所示:

从上图中可以看到,在没有给元素#box设置宽度的情况下,它的默认宽度是1472px, 会铺满整个父元素,这里#box的父元素是body,而body的宽度是根据你的电脑屏幕大小而定的,所以我这里是#box的默认宽度为1472px。
案例5
当给一个没有宽度的元素设置上下外边距为20px,左右外边距为30px时,也就是margin:20px 30px时,我们来看看盒子模型的大小是多少呢?
<div id="box">今天天气真好啊!</div>
<style>
#box{
height: 100px;
margin:20px 30px;
background:#ccc;
}
</style>
结果如图所示:

从上图中可以看到元素#box的高度没变依旧是100px,默认宽度变为了是1412px,这是为什么呢?那么就跟设置的margin属性有关了。
我们发现刚好1412px=1470px - 30px - 30px,这是因为当我们在没有给元素设置宽度,并且还设置了margin属性的情况下,它会在默认宽度的基础上减去左右外边距才会的到最终呈现在浏览器上的宽度,设置的上下外边距不会对元素的高度产生影响,只会影响元素的上下位置。
也就是说当元素处于默认宽度,但设置了margin属性的情况下时,元素的盒子模型宽度会受左右外边距的影响,元素的盒子模型宽度不会受上下外边距的影响。
此时元素的盒子模型宽度 = 默认宽度 - 左外边距 - 右外边距
元素的盒子模型高度 = height
案例6
当给一个没有宽度的元素分别设置margin:20px 30px,padding:10px,border:3px solid #000;的情况下,我们来看看盒子模型的大小是多少呢?
<div id="box">今天天气真好啊!</div>
<style>
#box{
height: 100px;
margin:20px 30px;
border:3px solid #000;
padding:10px;
background:#ccc;
}
</style>
结果如图所示:

从上图可以看到元素的宽度跟上一个案例的宽度一样没有改变,依旧是1412px,而高度反而变为了124.8px,这是为什么呢?
我明明给元素设置了padding:10px,border:3px solid #000;,按照案例2与案例3盒子模型大小的计算方式,应该会对元素大小有影响,但是这里并没有影响到元素大小,由此可以得到一个结论:当我们在没有给元素设置宽度,但设置了padding属性与border属性的情况下时,左右内边距与左右边框不会影响到元素的默认宽度。这里高度发生了变化,是因为这里给元素高度设置了100px,按照案例2与案例3元素盒子模型大小的计算方式,最终元素盒子模型的高度会加上上下内边距与上下边框,就变成了100+10+2.4+10+2.4=124.8px。
那么此时元素的盒子模型的宽度 = 默认宽度 - 左右外边距(内容区域高度 + 左右内边距 + 左右边框)
元素的盒子模型的高度 = height + 上下边框 +上内边距 +下边框 +下内边距
总结
当一个元素没有设置宽度,也就是默认宽度的情况下,设置的左右外边距会影响到元素的盒子模型的大小,设置的左右内边距和左右边框不会影响到元素的盒子模型的大小。元素的盒子模型的大小会不会受margin属性的影响取决于这个元素有没有设置宽度。
盒子模型的分类
CSS样式中明确将盒子模型分为标准盒子模型与怪异盒子模型。怪异盒子模型也称为IE盒子模型。
其主要的属性为box-sizing,当属性值为:content-box时,该元素的盒子模型为标准盒子模型;
当属性值为:border-box时,该元素的盒子模型为怪异盒子模型;
当未设值box-sizing属性时,该元素的盒子模型也为标准盒子模型。
标准盒子模型
上述案例中所提到的都是标准盒子模型,在标准模式下,盒子模型大小的计算方式如下:
元素的盒子模型的宽度 = width + 左内边距 + 左边框 + 右内边距 + 右边框
元素的盒子模型的高度 = height + 上内边距 +上边框 + 下内边距 + 下边框
元素的盒子模型的大小 = 元素的盒子模型的宽度 * 元素的盒子模型的高度
详细案例可以往上翻阅查看
怪异盒子模型 (IE盒子模型)
案例7:
在上述案例的基础上,再给元素设置上box-sizing属性,并且属性值为border-box时,我们来看看盒子模型的大小是多少呢?
<div id="box"></div>
<style>
#box{
width: 300px;
height: 300px;
border:3px solid #000;
padding:10px 20px;
margin:10px 30px;
box-sizing: border-box;
background:#f00;
}
</style>
结果如图所示:


从上述案例中第二张图中我们可以看出盒子模型的大小为200 * 200,不正是我设置的宽度与长度吗?会从上述案例中第一张图中找到答案。图中左右内边距以及左右边框以及内容区域的宽度是包含在设置的宽度内的,也就是说在怪异模式下,盒子模型的宽度=width(左右内边距+左右边框+内容区域的宽度);图中上下内边距以及上下边框以及内容区域的高度是包含在设置的高度内的,也就是说在怪异模式下,盒子模型的高度=height(上下内边距+上下边框+内容区域的高度)
注意:在标准盒子模型和怪异盒子模型 (IE盒子模型)下,margin属性都不会计算到盒子模型的大小里面去。
以上仅是个人见解,若有不足之处欢迎在下方评论指出,那就先分享到这里!! 后续继续更新!!
CSS必学:你需要知道的盒子模型的秘密的更多相关文章
- form表单 css的选择器和一些属性以及盒子模型,浮动
form表单 <form action='' method='' enctype=''> <input type='text'> input:更下type属性就可以得到对应的效 ...
- css的核心内容 标准流、盒子模型、浮动、定位等分析
1.块级元素:如:<div></div>2.行内元素:如:<span></span>从效果中看块级元素与行内元素的区别: 通过CSS的设置把行内元素转换 ...
- CSS自学笔记(10):CSS3盒子模型
CSS3为CSS技术的升级版本.最新版本. 就CSS而言,它是一个模块,是一个庞大而又复杂的模块,但是在CSS3中,将这一个庞大的模块分解为一个个容易理解的同时又很精简的小模块,同时CSS3中又添加了 ...
- CSS之选择符、链接、盒子模型、显示隐藏元素
<html> <head> <meta charset="utf-8"> <title>选择符.链接.盒子模型.显示隐藏元素< ...
- CSS块级-内联元素,盒子模型
CSS元素 元素分类和区别 常用的块状元素有: <div>.<p>.<h1>~<h6>.<ol>.<ul>.<li> ...
- 后端码农谈前端(CSS篇)第六课:盒子模型
元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外边距,外边距默认是透明的,因此不会遮挡其后的任何元素. 提示:背景应用于由内容和内边距.边 ...
- 003:CSS三大重点之一:盒子模型
目录 1:盒子模型 2:边框: 2.1:合写 2.2:适用于:table系元素.边框合并 3:内边距 4:外边距: 4.1:盒子居中三大条件 4.2:外边距合并.外边距塌陷(父子嵌套)解决方法三种 前 ...
- CSS盒子模型小剖析
前段时间刚刚从C/S过度到B/S,提到B/S就不能说CSS,而说起CSS又不能落下盒子模型.在CSS诞生的时候就有了盒子模型的概念,网页中大部分的元素都能构成一个盒子模型,.盒子模型无非就是描述的元素 ...
- #CSS的盒子模型、元素类型
CSS的盒子模型.元素类型 本文首先介绍了CSS元素的统一内部结构模型,盒子模型:然后介绍了CSS元素基于不同分类标准定义的元素类型,包括基于不同内容设置方式定义的replaced元素和non-r ...
- CSS初识- 选择器 &背景& 浮动& 盒子模型
# CSS初识-目标: > 1. 学会使用CSS选择器 > 2. 熟记CSS样式和外观属性 > 3. 熟练掌握CSS各种基础选择器 > 4. 熟练掌握CSS各种复合选择器 &g ...
随机推荐
- kafka-eagle-2.0.5安装指南
kafka eagle 安装文档 环境介绍 :kafka 三台 版本:2.2.1+cdh6.3.2 管理:ZK kafka-eagle-bin-2.0.5.tar.gz安装包准备 官网 :http:/ ...
- 微服务探索之路06篇k8s配置文件Yaml部署Redis使用Helm部署MongoDB和kafka
1 安装Redis 1.1创建配置文件redis.conf 切换到自己的目录下如本文是放在/home/ubuntu下 cd /home/ubuntu vim redis.conf bind 0.0.0 ...
- Linux 概念:u-boot
U-Boot介绍 参考:https://baike.baidu.com/item/U-Boot/10377075 参考:https://u-boot.readthedocs.io/en/latest/ ...
- 如何在 Windows10 下运行 Tensorflow 的目标检测?
前言 看过很多博主通过 Object Detection 实现了一些皮卡丘捕捉,二维码检测等诸多特定项的目标检测.而我跟着他们的案例来运行的时候,不是 Tensorflow 版本冲突,就是缺少什么包, ...
- Blazor前后端框架Known-V1.2.10
V1.2.10 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...
- 21.1 使用PEfile分析PE文件
PeFile模块是Python中一个强大的便携式第三方PE格式分析工具,用于解析和处理Windows可执行文件.该模块提供了一系列的API接口,使得用户可以通过Python脚本来读取和分析PE文件的结 ...
- .NET Evolve 数据库版本管理工具
.NET Evolve数据库版本管理工具 1.简介 提到数据库版本管理,Java领域开发首先会想到大名鼎鼎的flyway.但是它不适用.NET领域,那么.NET领域也需要做数据库版本管理,该用什么工具 ...
- 产品代码都给你看了,可别再说不会DDD(四):代码工程结构
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- 请大家一定不要像我们公司这样打印log日志
前言 最近接手了公司另一个项目,熟悉业务和代码苦不堪言. 我接手一个新项目,有个习惯,就是看结构,看数据库,搜代码. 其中搜代码是我个人这些年不知不觉形成的癖好,我下面给大家展示下这个小癖好. 正文 ...
- 全景VR KRPano项目打包成安卓APP快速简易教程
有时候,我们可能不想把我们制作的全景VR项目发布到网站上,而是想把它作为一个手机应用来使用或者分享.这样,我们就可以更好地保护我们的作品,也可以更方便地展示给客户或者朋友.本文将介绍一种简单的方法,让 ...