CSS第三天——盒子模型
1.盒子模型
-
就是把HTML页面中的布局元素看作是一个矩形的盒子, 也就是一个盛装内容的容器。
-
总结:
- 盒子模型有元素的内容、边框(border)、内边距(padding) 、和外边距(margin) 组成。
- 盒子里面的文字和图片等元素是内容区域
- 盒子的厚度我们成为盒子的边框
- 盒子内容与边框的距离是内边距(类似单元格的cellpadding)
- 盒子与盒子之间的距离是外边距(类似单元格的cellspacing)
2.盒子边框(border)
属性 | 作用 |
---|---|
border-width | 定义边框粗细,单位是px |
border-style | 边框样式 |
border-color | 边框颜色 |
-
边框样式(border-style)
- none:没有边框即忽略所有边框的宽度(默认值)
- solid:边框为单实线(最为常用的)
- dashed:边框为虚线
- dotted:边框为点线
-
边框综合性写法
<style> /*边框综合性写法*/ border: 5px dotted red; </style>
-
四条边可以分别指定
border-top-style
,border-left-color:red
,border-bottom:none
… -
eg
<style> input { /* 修改表单输入框的边框 */ border: none; /* 先将原有的边框去掉 */ border-bottom: 1px solid pink; /* 重新设置下边框 *//* 这两行代码不能颠倒,涉及到就近原则 */ } 用户名:<input type="text" /><br /> 密码: <input type="password" /> </style>
-
表格的细线边框
- 之前是通过
cellspacing="0"
(即单元格外边距为0)来实现表格单线效果的 - 但是相邻单元格的边框会出现重叠(只是紧紧靠在一起):
1 + 1 = 2
- 通过css来解决这个问题:
table { border-collapse: collapse; }
- 之前是通过
<style>
table, /* 注意table,th,td一个不能少 *//* "table"只是最外面的一圈 */
td,
th {
border: 1px solid deeppink;
border-collapse: collapse; /* collapse意为"合并",这个属性是专门用于处理单元格交界处的合并问题的 */
}
</style>
3.内边距(padding)
-
属性:padding-left,padding-right,padding-top,padding-bottom
-
指定padding的值后,盒子被撑开了
-
padding连写(有点重载的味道)(★重难点):
内边距 解释 padding: 20px 上下左右都是20内边距 padding: 10px 20px 上下10,左右20 padding: 10px 20px 30px 上10,左右20,下30 padding: 10px 20px 30px 40px 上10,右20,下30,左40(顺时针)
3.1内盒尺寸计算(元素实际大小)
-
盒子实际的大小 = 内容(width,height) + 内边距(padding) + 边框(border)
-
通俗的解释:内边距会撑开内容;边框直接扩充在外围
-
解决方法:在写内容的width和height时,提前做一个减法运算,让他减去多出来的内边距
3.2padding不影响盒子大小情况
特殊情况:如果这个盒子没有宽度,则padding不会撑开盒子
4.外边距
4.1外边距
margin属性用于设置外边距。 margin就是控制盒子和盒子之间的距离
4.2设置
-
margin值的简写(复合写法)代表意思 跟padding完全相同。
-
margin-left
左外边距 右上下同理;
4.3块级盒子水平居中
-
盒子指定宽度;左右外边距设置为auto(
margin: 0 auto;
) -
原理是左auto就是左边被填充,因此盒子右对齐;右auto则盒子左对齐;左右auto则居中;上下auto无效
4.4区分(关于水平居中)
margin: 0 auto;
块级盒子水平居中
text-align: center;
块级盒子内部元素水平居中(如果有多个元素,它们依旧可以自动居中)
4.5区分(插入图片和背景图片)
插入图片(img src="…">)移动位置通过盒模型padding margin
背景图片**(background-image: url())通过background-position**
重点: 插入的图片本身就是一个img标签,本身就是一个行内块元素。对于一个元素,我们当然可以通过其外层的padding和它本身的margin来调整其位置。只是前者会撑开盒子;后者因为没有指定宽度,所以不会
而背景图片不是元素,仅仅是一个属性,无论如何不可能改变盒子的大小,也不可能超出盒子
4.6清除元素默认的内外边距
<style>
*{
padding:0;
margin:0;
}
</style>
注意:
- 行内元素为了照顾兼容性,尽量只设置左右内外边距, 不要设置上下内外边距。
4.7外边距合并
(1)相邻块元素垂直外边距的合并
- 条件:当上下相邻的两个块元素相遇时,如果上面的元素有下外边距margin-bottom,下面的元素有上外边距margin-top,则他们之间的垂直间距不是margin-bottom与margin-top之和
取两个值中的较大者这种现象被称为相邻块元素睡直外边距的合并(也称外边距塌陷) - 解决方案:尽量给只给一个盒子添加margin值
(2)嵌套垂直相邻
- 对于两个嵌套的块元素,如果父元素没有上边框及上边距,父、子元素的上边框会发生合并
合并后的外边距为两者中的较大者(它们会选出一个较大的外边距然后共用!)
<style>
.father {
border-top: 1px solid transparent; /* 为父元素定义上边框 */
padding-top: 1px; /* 为父元素定义上边距 */
overflow: hidden; /* 为父元素添加overflow: hidden *//* 前两种方法都会改变盒子本身的大小,最后一中方法不会 */
}
</style>
5.盒子模型的布局稳定性
-
padding会影响盒子已存在的盒子大小,需要加减计算;
-
margin需要考虑塌陷问题;
-
因而宽度(width)是最稳定的,我们经常使用宽度剩余法、高度剩余法来做
注:本文根据《黑马程序员-web前端》笔记改编