一. 盒子模型
1. 认识盒子
生活中,我们经常会看到各种各样的盒子

2. HTML每个元素都是盒子
事实上, 我们可以把
HTML每一个元素看出一个个的盒子
3. 盒子模型(Box Model)
HTML中的每一个元素都可以看做是一个盒子,如右下图所示,可以具备这4个属性内容(
content)- 元素的内容
width/height
- 元素的内容
内边距(
padding)- 元素和内容之间的间距
边框(
border)- 元素自己的边框
外边距(
margin)元素和其他元素之间的间距

4. 盒子模型的四边
因为盒子有四边, 所以
margin/padding/border都包括top/right/bottom/left四个边
5. 在浏览器的开发工具中

6. 内容 - 宽度和高度
设置内容是通过宽度和高度设置的
- 宽度设置:
width - 高度设置:
height
- 宽度设置:
注意:对于行内级非替换元素来说,设置宽高是无效的
宽高不设置的时候,默认是
auto(即交给浏览器决定)- 块级元素,
width默认auto,是独占父元素的一行 - 行内级非替换元素,
width默认auto,是根据内容来决定的 - 行内级替换元素,如
img,宽高默认auto,浏览器会根据图片自身的宽高来显示的
- 块级元素,
另外我们可以设置如下属性:
min-width:最小宽度,无论内容多少,宽度都大于或等于min-widthmax-width:最大宽度,无论内容多少,宽度都小于或等于max-width- 移动端适配时,可以设置最大宽度和最小宽度
下面两个属性不常用:
min-height:最小高度,无论内容多少,高度都大于或等于min-heightmax-height:最大高度,无论内容多少,高度都小于或等于max-height
7. 内边距 - padding
设置盒子的内边距,通常用于设置边框和内容之间的间距
padding包括四个方向,有如下的取值:padding-top:上内边距padding-right:右内边距padding-bottom:下内边距padding-left:左内边距
设置百分比相对的是包含块的宽度
padding单独编写是一个简写属性:padding-top、padding-right、padding-bottom、padding-left的简写属性padding缩写属性是从零点钟方向开始,沿着顺时针转动的,也就是上右下左
padding并非必须是四个值,也可以有其他值值个数 例子 代表的含义 4 padding: 10px 20px 30px 40px;top: 10px,right: 20px,
bottom: 30px,left: 40px3 padding: 10px 20px 30px;缺少 left,left使用right的值2 padding: 10px 20px;缺少 left,使用right的值,
缺少bottom,使用top的值1 padding: 10px;top/right/bottom/left都使用10
8. 边框 - border
border用于设置盒子的边框
边框相对于
content/padding/margin来说特殊一些边框具备宽度
width,样式style,颜色color设置边框的方式
- 边框宽度
border-top-width、border-right-width、border-bottom-width、border-left-widthborder-width是上面4个属性的简写属性(border-width本身不能设置百分比)
- 边框颜色
border-top-color、border-right-color、border-bottom-color、border-left-colorborder-color是上面4个属性的简写属性
- 边框样式
border-top-style、border-right-style、border-bottom-style、border-left-styleborder-style是上面4个属性的简写属性
- 边框宽度
边框的样式设置值
边框的样式有很多,可以了解如下的几个
groove:凹槽, 沟槽, 边框看上去好象是雕刻在画布之内ridge:山脊, 和grove相反,边框看上去好象是从画布中凸出来
同时设置的方式
如果我们相对某一边同时设置 宽度 样式 颜色, 可以进行如下设置:
border-topborder-rightborder-bottomborder-leftborder:统一设置4个方向的边框
边框颜色、宽度、样式的编写顺序任意

圆角 -
border-radius设置盒子的圆角

- 常见的值:
- 数值:通常用来设置小的圆角,比如
6px - 百分比:通常用来设置一定的弧度或圆形
- 百分比的计算值是相对于
boder-box,即内容 + 内边距 + 边框宽度组成 - 水平半轴相对于盒模型的宽度,垂直半轴相对于盒模型的高度,负值无效
- 百分比的计算值是相对于
border-radius补充是一个简写属性
- 将这四个属性
border-top-left-radius、border-top-right-radius、border-bottom-right-radius,和border-bottom、left-radius简写为一个属性 - 开发中比较少见一个个圆角设置
- 将这四个属性
如果一个元素是正方形, 设置
border-radius大于或等于50%时,就会变成一个圆
9. 外边距 - margin
设置盒子的外边距, 通常用于元素和元素之间的间距
margin包括四个方向, 所以有如下的取值:margin-top:上内边距margin-right:右内边距margin-bottom:下内边距margin-left:左内边距
margin单独编写是一个缩写属性:margin-top、margin-right、margin-bottom、margin-left的简写属性margin缩写属性是从零点钟方向开始, 沿着顺时针转动的, 也就是上右下左margin的其他值值个数 例子 代表的含义 4 margin: 10px 20px 30px 40px;top: 10px,right: 20px,bottom: 30px,left: 40px3 margin: 10px 20px 30px;缺少 left,left使用right的值2 margin: 10px 20px;缺少 left,使用right的值,
缺少bottom,使用top的值1 margin: 10px;top/right/bottom/left都使用10
注意:
- 设置值为百分比时,是相对于该元素的包含块的宽度(可以理解为:父元素)
- 对不可替换内联元素设置
margin-top、margin-bottom无效 - 初始值都是
0 - 从语义化的角度来说:
margin设置的应该是兄弟元素之间的间距的padding设置的应该是父子元素之间的间距的
10. 上下margin的传递
margin-top传递- 如果块级元素的顶部线和父元素的顶部线重叠(边框紧挨着的时候),那么这个块级元素的
margin-top值会隐式的传递给父元素
- 如果块级元素的顶部线和父元素的顶部线重叠(边框紧挨着的时候),那么这个块级元素的
margin-bottom传递- 如果块级元素的底部线和父元素的底部线重叠(边框紧挨着的时候),且父元素的高度是
auto,那么这个块级元素的margin-bottom值会传递给父元素
- 如果块级元素的底部线和父元素的底部线重叠(边框紧挨着的时候),且父元素的高度是
- 为什么会出现传递现象?
W3C在制定标准的时候,考虑到子元素和父元素顶部线重叠的时候,开发者设置相对于父元素的margin-top,可能是写错了,应该是设置父元素的margin-top,而子元素和父元素之间的间距,应该用padding设置的,所以就出现上下margin传递现象
- 如何防止出现传递问题?
- 给父元素设置
padding-top/padding-bottom(推荐) - 给父元素设置
border,boder不能为0 - 触发
BFC:设置overflow为auto,让该元素无法将margin传递出去
- 给父元素设置
- 建议
margin一般是用来设置兄弟元素之间的间距padding一般是用来设置父子元素之间的间距
11. 上下margin的折叠
垂直方向上相邻的2个
margin(margin-top、margin-bottom)有可能会合并为1个margin,这种现象叫做**collapse(折叠)**水平方向上的
margin(margin-left、margin-right)永远不会collapse为什么会出现
collapse折叠现象?W3C在制定标准的时候,考虑到如果垂直方向上相邻的两个元素设置margin-top、margin-bottom,觉得没必要,只要设置一个即可,开发者可能写错了,所以就帮我们折叠成一个margin,导致出现上下margin折叠现象
折叠后最终值的计算规则
- 两个值进行比较,取较大的值
如何防止
margin collapse?- 只设置其中一个元素的
margin
- 只设置其中一个元素的
上下
margin折叠的出现情况两个兄弟块级元素之间上下
margin的折叠父子块级元素之间
margin的折叠
12. margin: 0, auto;让块级元素居中的原理
- 因为块级元素的
width默认值是auto,且块级元素是独占父元素的一行,独占一行时,就没有居中不居中的说法了 - 即使你给块级元素设置一定的宽度,块级元素仍然是占据父元素的一行的
- 对于块级元素(
block box)独占一行时,块级元素的宽度是等于內部box的宽度+padding+border+margin(padding、border、margin默认都为0)- 当内部块级元素独占父元素一行时,可以得出一个公式:
- 父元素宽度 = 内部块级元素宽度 + 内部块级元素
margin-left+ 内部块级元素margin-right
- 父元素宽度 = 内部块级元素宽度 + 内部块级元素
- 当内部块级元素独占父元素一行时,可以得出一个公式:
- 而当块级元素有一定的宽度但小于父元素一行的宽度时,浏览器会发现该元素无法占据一行了
- 这个时候,浏览器会优先让我们内部
box的宽度设置生效,而父元素一行的宽度减去内部box的宽度,剩下的距离会分配给该元素对应的margin,如果该元素在父元素最左(右)端,即剩下的距离会全部分给子元素的margin-right(left) - 所以我们设置该元素左右
margin为auto即可,浏览器会自动平分剩余的空间给左右的margin
注意:
- 当某个元素的左右
margin为auto,且该元素的宽度大于视口的宽度时,浏览器会让该元素的margin-right为负值来使得上面的公式保持成立
13. 外轮廓 - outline
表示元素的外轮廓
- 不占用空间
- 默认显示在
border的外面
相关属性有:
属性 含义 outline-width外轮廓的宽度 outline-style取值跟 border的样式一样,比如solid、dotted等outline-color外轮廓的颜色 outline`outline-width 应用实例
- 去除
a元素、input元素的focus轮廓效果
- 去除
14. 盒子阴影 - box-shadow
设置一个或多个阴影
- 每个阴影用
<shadow>表示 - 多个阴影用
,隔开,从前到后叠加
- 每个阴影用
<shadow>的常见格式如下
- 第1个
<length>:offset-x,水平方向的偏移,正数往右偏移 - 第2个
<length>:offset-y,垂直方向的偏移,正数往下偏移 - 第3个
<length>:blur-radius,模糊半径 - 第4个
<length>:spread-radius,延伸半径 <color>:阴影的颜色,如果没有设置,就跟随color属性的颜色inset:外框阴影变成内框阴影
- 第1个
我们可以通过一个网站测试盒子的阴影:
15. 文字阴影 - text-shadow
设置文字的阴影效果
<shadow>的常见格式如下
- 相对于
box-shadow,它没有spread-radius的值
- 相对于
我们可以通过一个网站测试文字的阴影:
16. 行内非替换元素注意事项
设置
width、height无效
设置
padding-top、padding-bottom,上下会被撑起来,但不占据空间
设置
border-top-width、border-bottom-width,上下会被撑起来,但不占据空间
设置
margin-top、margin-bottom不会生效
为什么行内非替换元素在使用盒子模型这些属性的时候,会有这些问题呢?
W3C在制定标准的时候,考虑到行内元素一般都是一行一行的呈现,如果你给某一个行内非替换元素设置垂直方向的上下margin,border,padding这些的时候,会破坏整个段落的美感,所以就对这些元素设置这类属性的时候不生效- 即:行内非替换元素设置垂直方向的上下
margin、border、padding这类属性的时候不生效
17. 背景色和前景色设置的是哪些
- 背景色有设置到
border下面- 设置范围:
content+padding+border
- 设置范围:
border在没有设置颜色的情况下,会使用前景色,如果没有设置(继承)前景色,则会使用默认的颜色,如果**border颜色设置为透明transparent的情况下,就能看到border下的背景色了**
18. CSS属性 - box-sizing
设置盒子模型中宽高的行为
content-box(默认值)设置的
width、height,只是content内容的宽高padding、border都布置在width、height外边元素实际占用宽 / 高 =
border + padding + width / height
border-box设置的
width、height,是元素实际占用的宽高padding、border都布置在width、height里边
border-box即IE盒子模型(IE8以下浏览器),又叫怪异盒模型
注意:
box-sizing生效的前提是,有明确的设置宽度和高度
19. 元素的水平居中方案
- 在一些需求中,需要元素在父元素中水平居中显示(父元素一般都是块级元素、
inline-block) - 行内级元素(行内非替换元素、行内替换元素、
inline-block)- 水平居中:在父元素中设置
text-align: center;
- 水平居中:在父元素中设置
- 块级元素
- 水平居中:
margin: 0 auto;
- 水平居中:
二. CSS设置背景
1. background-image
- 设置元素的背景图片
- 盖在(不是覆盖)
background-color的上面
- 盖在(不是覆盖)
- 可以设置多张图片
- 设置的第一张显示在最上面,其他图片按顺序层叠在下面
注意:
- 元素如果没有具体的宽高,背景图片是不会显示出来的
2. background-repeat
- 设置背景图片是否要平铺
- 常见的值有
repeat(默认值):平铺no-repeat:不平铺repeat-x:只在水平方向平铺repeat-y:只在垂直方向平铺
3. background-size
- 设置背景图片的大小
auto(默认):以背景图自身大小显示contain:缩放背景图,保持宽高比的情况下,缩放至完全装入背景区(容器)cover:缩放背景图,保持宽高比的情况下,缩放至完全覆盖铺满背景区(容器),超出部分裁剪<percentage>:百分比,相对于背景区(background position area)length:具体的大小,如100px
4. background-position
设置背景图片在水平、垂直方向上的具体位置
可以设置具体的值:如
20px 30px水平方向可以设值:
left、center、right垂直方向可以设值:
top、center、bottom如果只设置了一个方向,另一个方向默认是
center
5. background-attachment
- 决定背景图像的位置是在视口内固定,或是随着包含它的区块滚动
- 可以设置的值:
scroll(默认):表示背景相对于元素本身固定,而不是随着它的内容滚动local:表示背景相对于元素的内容固定。如果一个元素拥有滚动机制,背景将会随着元素的内容滚动fixed:表示背景相对于视口固定。即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动
6. background
是一系列背景相关属性的简写属性
background-size可以省略,如果不省略,/background-size必须紧跟在background-position的后面其他属性也都可以省略,顺序任意

7. backgroun-image 与 img 对比
利用
background-image和img都能够实现显示图片的需求,在开发中该如何选择?imgbackground-image性质 HTML元素CSS样式图片是否占用空间 ✔ ❎ 浏览器右键直接查看地址 ✔ ❎ 支持 CSS Sprite❎ ✔ 更有可能被搜索引擎收录 ✔(结合 alt属性)❎
总结:
img,作为网页内容的重要组成部分,比如广告图片、LOGO图片、文章配图、产品图片
background-image,可有可无。有,能让网页更加美观。无,也不影响用户获取完整的网页内容信息
