CSS基础:块级元素与盒模型
简介
在 HTML4.01 中,元素通常可以分为块级元素( "Block-level element" ) 和内联元素 ( "Inline-level element" ) 两大类。块级元素单独占一行显示,内部可以包含内联元素或其他块级元素;内联元素不换行,内部只能包含其他内联元素,在这篇文章中将只讨论块级元素。
(注:在 HTML5 中并没有块级元素和内联元素的概念,而是通过内容模型( "Content model" )规定了每个元素的分类( "Content categories" )和允许包含的内容( "Permitted content" ),例如:<a> 标签在 HTML4.01 中是内联元素,理论上不能嵌套诸如 <div> 之类的块级元素,但是在 HTML5 中判断是否合法要稍微复杂一点: <a> 标签的分类可能属于流元素( "Flow content" )或短语元素( "Phrasing content" ),交互元素( "Interactive content" ),可触元素( "palpable content" )中的一种或多种,具体情况要根据上下文而定,允许包含的内容是 "transparent",意为透明的,也就是说既可以包含 "Flow content" 又可以包含 "Phrasing content" ,根据父元素决定,如果单独像 "a > div" 这样嵌套,由于 <div> 标签的分类属于 "Flow content",因此这里是合法的,如果像 "p > ins > a > div" 这样嵌套,"a > div" 是否合法要看 "ins > div" 是否合法,由于 <ins> 允许包含的内容也是 "transparent",所以再看 "p > div" 是否合法,由于 <p> 允许包含的内容只能是 "Phrasing content",所以总的来说这里是不合法的)
还需要注意的是:块级元素和 CSS 中 { display: block; } 的元素不是一个概念,例如,<li> 元素默认的 display 值为 list-item,<table> 元素默认的 display 值为 table ,但是它们都是块级元素,具有块级元素的基本特征,在同一个水平流上只能显示一个元素。
块级元素总是被表示为一个矩形的盒子,称为 "盒模型",由 "外边距+边框+内边距+盒子本身宽高" 组成,如图所示:

"盒子本身宽高" 规定的部分称为内容区域 "Content box",在 CSS 中设置的 "width" 和 "height" 就是作用于这个区域;
"盒子本身宽高+内边距" 规定的部分称为内边距区域 "Padding box",在 CSS 中设置的 "background" 就是作用于这个区域;
"盒子本身宽高+内边距+边框" 规定的部分称为边框区域 "Border box";
"盒子本身宽高+内边距+边框+外边距" 规定的部分称为外边距区域 "Margin box";
利用 CSS3 的 "border-sizing" 属性可以更改 "width" 和 "height" 的作用区域,理论上讲有如下四种情况:
{ box-sizing: content-box; } /* 默认 */
{ box-sizing: padding-box; } /* 火狐曾经支持 */
{ box-sizing: border-box; } /* 全部支持 */
{ box-sizing: margin-box; } /* 不支持 */
"border-sizing" 属性被所有现代浏览器支持,IE 家族只有 IE8 以上才支持,并且需要添加各个浏览器的私有前缀。
块级元素的水平格式化
具体表现为:正常流中的块级元素其水平部分的总和等于父容器的宽度,也就是说:左外边距+左边框+左内边距+宽度+右内边距+右边框+右外边距 = 父容器的宽度。这条规则主要涉及到 "margin","padding","border","width" 四个属性,其中 "margin" 和 "padding" 的默认值均为0,"border" 的默认值为 "none","width" 的默认值为 "auto",意为补齐,并且只有 "width","margin" 的值可以设置为 "auto",它们又有以下几种特殊情况:(仅讨论水平方向上,"margin" 仅代表 "margin-left" 和 "margin-right")
"width" 和 "margin" 均固定:这种情况又称为格式化属性过分受限( "overconstrained" ),此时浏览器总会将 "margin-right" 强制为 "auto" 以撑满父容器;
"width" 值固定,"margin-left" 或 "margin-righ" 只有一侧值固定:浏览器表现为将另一侧 "margin" 的值强制为 "auto" 以撑满父容器;
"width" 值为 "auto",两侧 "margin" 值固定:浏览器表现为 "width" 撑满父容器除 "margin" 外的剩余宽度;
"width" 值固定,两侧 "margin" 值为 "auto":浏览器表现为 "margin-right" 和 "margin-left" 平分剩余宽度以撑满父容器,借用这种方法可以使块级元素水平居中;
"width" 和 "margin" 均为 "auto":浏览器表现为 "width" 撑满父容器,"margin" 为0,并且只要 "width" 设置为 "auto",无论是 "margin-left" 还是 "margin-right" 被设置为 "auto",它们最后都会变成0;
根据这一准则,以及创造者背后的意图,我们应该少设置盒子的宽度,避免其丢失流动性。
块级元素的垂直格式化
具体表现为:块级元素的高度会尽可能小,直到可以包裹其中的内容,或者也可以理解为块级元素的高度由它的内容撑开。在垂直方向上,不但 "height" 的表现与 "width" 有区别,垂直方向的 "margin" 设置为 "auto" 时与水平方向的 "margin" 也不同,它将自动计算为0,另外垂直方向的 "margin" 会发生合并现象:
相邻兄弟元素之间上者的 "margin-bottom" 和下者的 "margin-top" 合并,可以通过触发 BFC 或在中间插入一个内联元素阻断,防止合并发生;
父容器和它的第一个子元素的 "margin-top" 合并,可以通过触发 BFC 或在中间插入一个内联元素阻断,防止合并发生,另外也可以设置父容器的 "border" 或 "padding" 进行阻断,因为它们可以将两者的 "margin" 分开,而子元素的就不行;
父容器和它的最后一个子元素的 "margin-bottom" 合并,避免方法同上;
合并的规则是:"正正取最大","负负取最小","正负则相加"。
同样,根据这一准则,我们应该少设置盒子的高度,也是避免其丢失流动性。总的来说就是:页面元素的宽度由外到内自适应,高度由内到外撑开。
关于 width 和 height
上面已经说了,尽量避免将 "width" 和 "height" 的值设置为固定,除此之外,还有一种流动性更好的替代方案,即 "min-width","max-width" 和 "min-height","max-height",并且这四个属性的兼容性非常好,兼容 IE8 以上以及所有现代浏览器,需要注意的是,它们和 "width","height" 之间有一套独立的覆盖规则,与常规的 CSS 优先级无关:
即使 "width" 设置了 "!important" ,如果它超过了最大宽度,依然会被后者覆盖,或者说截断;
当 "max-width" 和 "min-width" 冲突时,"min-width" 的权重更大,与优先级无关;
示例:
.test {
width: 100px !important;
max-width: 50px; /* 最终结果为50px */
}
.test {
width: 100px !important;
min-width: 70px; /* 最终结果为70px */
max-width: 50px;
}
关于 padding
关于 "padding" 要说的只有两点:一是 "padding" 不能设置为负值,二是无论是水平还是垂直方向,"padding" 的百分比值都是基于父容器的宽度计算的。
示例:
<!-- html -->
<div class="father">
<div class="son"></div>
</div>
/* css */
.father {
width: 200px;height: 100px;
background: red;
}
.son {
width: 50px;height: 50px;
padding: 25%; /* 最终结果为50px */
background: green;
}
关于 border
"border-color" 有一个很重要的特性,其默认值是 "transparent",但是当设置了 "color" 后,其计算结果为 "color" 设置的颜色,拥有类似特性的属性还有 "outline","box-shadow","text-shadow" 等。
示例:
.test {
border: solid 1px; /* 边框颜色为红色 */
color: red;
}
关于 margin
和 "padding" 属性一样,"margin" 的百分比值也是基于父容器的宽度计算的,但是 "margin" 的值却可以设置为负值,并且 "-margin" 有着相当大的作用:
一是处于文档流中的元素,当 "margin-top" 和 "margin-left" 设置为负值时,元素向着对应方向移动;当 "margin-bottom" 和 "margin-right" 设置为负值时,元素本身不动,而是将后面的元素拉过来,这时文档流中堆叠顺序总是遵循默认的后来者居上的原则,也就是说后面的元素会覆盖前面的元素。
二是处于文档流中的元素,如果先设置了 "position:relative" 和 "z-index" 改变堆叠顺序,那么覆盖规则由 "z-index" 的大小决定。
三是使用 "position:absolute" 脱离文档流的元素,当 "margin-top" 和 "margin-left" 设置为负值时,元素向着对应方向移动;当 "margin-bottom" 和 "margin-right" 设置为负值时,元素本身不动,对后面的元素也没有影响。
四是使用 "float" 脱离文档流的元素,如果负 "margin" 的方向与浮动方向相同,那么元素向着对应方向移动;相反,那么元素本身不动,而是将前面或者后面的元素拉过来。
五是当元素的 "width" 为 "auto" 时,负 "margin" 可以增大元素的宽度,使其超出父容器的宽度。
CSS基础:块级元素与盒模型的更多相关文章
- HTML+CSS基础 块级元素div分析 文档流 脱离文档流的方法
块级元素div分析 1.外边距 margin 2.内边距 padding 3.边框 border Div的真实宽度=width+margin-left+margin-right+border*2+ ...
- css构造块级元素
css 1. 宽高width:数值;height:数值;也可用百分比!长高的设置不会被后代继承2. 背景(1)背景颜色background-color:颜色值;元素的背景颜色默认为transparen ...
- CSS基础(四):盒模型
CSS盒模型 HTML文档中可以将每个元素都看作是长方形的盒子.而CSS盒模型规定了元素框处理元素内容content.内边距padding.边框border和外边距margin的方式.下图是W3C对于 ...
- CSS 各类 块级元素 行级元素 水平 垂直 居中问题
元素的居中问题是每个初学者碰到的第一个大问题,在此我总结了下各种块级 行级 水平 垂直 的居中方法,并尽量给出代码实例. 首先请先明白块级元素和行级元素的区别 行级元素 一块级元素 1 水平居中: ( ...
- CSS的块级元素和内联元素的概念
三生有幸,偶然之下知道了<CSS世界>这本书,让我产生了探究 CSS 的想法. 这里对 CSS 中的块级元素和内联元素的概念做一个简单的整理. 可能对于我们前端开发人员来讲,一般接触到的元 ...
- css中块级元素、内联元素(行内元素、内嵌元素)
Block element 块级元素 顾名思义就是以块显示的元素,高度宽度都是可以设置的.比如我们常用 的<div>.<p>.<ul>默认状态下都是属于块级元 ...
- CSS的块级元素和内联元素,以及float
说明:之前有一点搞错了,就是float其实是浮动起来,其它元素会位于它的底层. 最近在系统地学习HTML5,感觉补上了好多缺失的知识. 例如: 锚点定位其实可以通过 id 来实现: CSS 使用 !i ...
- css的块级元素和行级元素
块级元素 概念: 每个块级元素都是独自占一行. 元素的高度.宽度.行高和边距都是可以设置的. 元素的宽度如果不设置的话,默认为父元素的宽度(父元素宽度100%) <address>/ ...
- HTML基础 块级元素和内联元素
大多数 HTML 元素被定义为块级元素或内联元素. 块级元素包括:body from select textarea h1-h6 html table button hr p ol ...
随机推荐
- Google Maps API的使用
之前在学习了简单的API调用后,查看了几个知名网站的API调用方法,发现Google的API调用还是相对比较简单的.下面就从API key的获取.googlemaps的安装,再到实际使用做一下说明. ...
- 在Editplus中配置java的(带包)编译(javac)和运行(java)的方法
配置的前提是电脑安装了JDK并且配置好了相关的环境变量(JAVA_HOME,path和classpath). 配置好后在命令行中输入javac和java验证是否配置成功: 如果出现上面的情况则说明配置 ...
- phpstorm激活码生成器地址
http://idea.qinxi1992.cn/ 写在windows/system32/drivers/etc/hosts里 0.0.0.0 account.jetbrains.com 激活码位置: ...
- MongoDb进阶实践之一 如何在Linux(CentOS 7)上安装MongoDB
一.NoSQL数据简介 1.NoSQL概念 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是 ...
- windows下安装Virtualenvwrapper
windows下安装Virtualenvwrapper 我们可以使用Virtualenvwrapper来方便地管理python虚拟环境,但是在windows上安装的时候.....直接 install ...
- python作业03-文件操作&函数
一.文件处理相关 1.编码问题 (1)请说明python2 与python3中的默认编码是什么?答:Python2默认的字符编码是ASCII,默认的文件编码也是ASCII :python3默认的字符编 ...
- C语言--第0次作业
1.你认为大学的学习生活.同学关系.师生应该是怎样?请一个个展开描写. 学习生活 大学是一个过渡时间,它不同于高中与社会.我希望自己可以养成自主学习的习惯,也希望能在大学学习中找到属于自己的节奏,不被 ...
- intellij IDEA配置Tomcat
第一步:点击上方File选项找到Setting,在文本框中输入Tomcat,找到之后点击右下角的OK 第二步:再次找到Setting,在文本框中输入Application Servers找到后,单击 ...
- python读取三维点云球坐标数据并动态生成三维图像与着色
关键步骤: 1.首先通过读取.txt文本数据并进行一系列字符串处理,提取显示所需要的相关数据矩阵 2.然后利用python的matplotlib库来进行动态三维显示 备注:matplotlib在显示2 ...
- CAS 之 Apereo CAS 简介(一)
CAS 之 Apereo CAS 简介(一) Background(背景) 随着公司业务的不断扩展,后台接入子系统不断增多,那么我们将针对不同的平台进行拆分为各自对应的子系统, 权限是不变的,那么我们 ...