css
盒模型
盒模型由四个部分组成:内容content
、内边距padding
、边框border
、外边距margin
- 标准盒模型:
width = content
- IE 盒模型:
width = content + padding + border
盒模型可通过box-sizing
设置,支持到 IE8
box-sizing: content-box
标准盒模型,默认值box-sizing: border-box
IE 的怪异盒模型
padding 特性
- 行内元素的内边距对左、右、下起作用
- 行内元素的外边距只对左、右起作用
- 给行内元素加上绝对定位后,行内元素的内边距和外边距对上下左右均起作用
margin 特性
1、给子元素设置 margin-top 后,父元素也跟着子元素一块向下移动
一个元素如果没有padding-top
和border-top
,那么这个元素的上边距会和其内部文档流中的第一个子元素的上边 距重叠
解决办法:给父元素设置 border-top
或者 padding-top
2、margin: 0 auto;
会让元素水平居中
3、外边距合并
当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。
解决方法:
- 统一设置 margin-top 或者 margin-bottom,不要混合使用
- 设置其中一个元素为 BFC
BFC 规范
块级格式化上下文:block formatting context
CSS 2.1 规范中的一个概念,它是一个独立容器,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。
简单说,BFC 是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定规则进行元素摆放,并且不会影响其它环境中的元素。
BFC 特性和创建条件
让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响
特性:
- 内部的 Box 会在垂直方向,从顶部开始一个接一个地放置
- Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生叠加
- 每个元素的 margin box 的左边,与包含块 border box 的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此
- BFC 的区域不会与 float box 叠加
- BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
- 计算 BFC 的高度时,浮动元素也参与计算
BFC 由以下之一创建:
- 根元素
- 浮动元素 float,值为 left|right|inherit,不能是 none
- 使用
position: absolute;
或position: fixed;
的元素 - 使用 overflow ,值为:hidden|auto|scroll ,不能是 visible
display: flex
display: inline-block
- 表格单元格:
display: table-cell
- 表格标题:
display: table-caption
BFC 作用
- 解决 margin 重叠的问题
同一个 BFC 下的两个相邻的盒子会出现垂直 margin 重叠的问题,通常可以为其中一个盒子添加一个父元素,并使其触发 BFC,即可解决这个问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
.box {
/* 关键点 */
overflow: auto;
}
p {
margin: 30px;
height: 30px;
background-color: #f00;
}
</style>
</head>
<body>
<div class="box">
<p>1</p>
</div>
<p>2</p>
<p>3</p>
</body>
</html>
- 浮动带来的布局问题
在同一个 BFC 下即使有元素浮动,BFC 下元素的最左边边缘总是会与包含它的盒子左边相接触,那么就会出现浮动元素遮盖了其他元素的情况。
试想,在一个 BFC 内如果存在一个 float 元素和一个 div,浮动元素会遮盖住 div,此时,如果给这个 div 构建一个新的 BFC,由于 BFC 特性,内外不相互影响,此时 div 会被 float 元素挤开
比如下面这个例子,绿色盒子会因为浮动遮盖住红色的盒子,但由于两个盒子都在同一个 BFC(body 元素)下,根据 BFC 特性,红色盒子会与包含块相接,此时只要让红色盒子触发 BFC,我们为红色盒子添加一个触发 BFC 的条件overflow:hidden
,此时红色盒子由于 BFC 的特性隔离开绿色,这样就可以通过 float 元素的方式实现两栏布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
body {
position: relative;
}
.green {
width: 30px;
height: 30px;
background-color: #0f0;
float: left;
}
.red {
width: 50px;
height: 50px;
background-color: #f00;
overflow: hidden;
}
</style>
</head>
<body>
<div class="green"></div>
<div class="red"></div>
</body>
</html>
- 清除浮动
在触发 BFC 后,这个盒子的高度将包含浮动元素的高度。当一个父元素中包含了浮动元素,而浮动元素超出了父元素,此时为父元素创建 BFC,那么浮动元素就会包裹进这个 BFC,解决了父元素中高度塌陷的问题
如下示例,两个 div 由于设置了float:left
使其浮动,导致了父元素高度的坍塌,此时给父元素添加一个overflow:hidden
属性值,使其触发 BFC,由于 BFC 下的盒子会包含浮动元素的高度,
因此盒子就被撑了起来
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
.parent {
border: 2px solid #f00;
overflow: hidden;
}
.child {
height: 30px;
border: 1px solid #0f0;
float: left;
}
</style>
</head>
<body>
<div class="parent">
<div class="child">child1</div>
<div class="child">child2</div>
</div>
</body>
</html>
IFC 指的是行级格式化上下文,布局规则:
- 行级上下文内部的盒子会在水平方向,一个接一个地放置
- 当一行不够的时候会自动切换到下一行
- 行级上下文的高度由内部最高的内联盒子的高度决定
CSS 选择器
- 通配符:
*
- id 选择器:
#id
- class 选择器:
.class
- 元素选择器:
p
、a
等 - 后代选择器:
p span
、div a
等 - 一级子元素选择器:选择元素的直接子元素,如
div > span
作用于第一级子元素,而后代选择器会作用于全部子孙元素 - 伪类选择器:
a:hover
等