CSS布局重点(上)
我是knockkey, 这是我坚持更新博客第2天. 这篇博客的目的是解决: 谁会觉得布局不重要吗? 这篇博客将介绍四个基本点:
- 盒模型宽度的计算
- margin纵向重叠问题
- margin负值问题
- BFC理解与应用
不懂这四个点, 后面我介绍双飞翼布局和圣杯布局的时候, 你将崩溃
1. 什么是盒模型?
盒模型用来指定标签如何显示以及元素间相互关系.这个盒子由内容(content)+内边距(padding)+边框(border)+外边界(margin)组成
2. 盒子的实际大小
盒子宽度 = 两个外边距+两个内边距+两个边框+内容宽度
boxsize=margin*2+padding*2+border*2+width
盒子高度 = 略
3. css中的一个属性 -> box-sizing
盒模型有两种:
W3C的标准盒子模型
相当于width指的是content内容的宽度
box-sizing:content-box
IE的盒子模型
相当于width指的是border+padding+content
box-sizing: border-box
4.margin的负值问题(同样, 会了这道题你就知道了, 自己动手试试! 必须理解)
对 margin 的 top left right bottom 设置负值, 有何效果?
- margin-top 和 margin-left 负值, 元素向上, 向左移动, 会影响自身的值
- margin-right负值, 右侧元素左移, 自身不受影响
- margin-bottom负值, 下方元素上移, 自身不受影响
5. BFC理解
什么是BFC? (翻译,作用,相关代码)
- Block format context, 块级格式化上下文
- 一块独立渲染区域, 内部元素的渲染不会影响边界以外的元素
6. BFC的布局规则
- 内部的Box会在
垂直方向,一个接一个地放置。 - Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生
重叠 - BFC的区域不会与float box重叠。
- 计算BFC的高度时,浮动元素也参与计算。
6.1 margin纵向重叠问题, 理解这道题, 你就会了
如下代码, AAA 和 BBB 之间的距离是多少?
css代码
p {
font-size: 16px;
line-height: 1;
margin-top: 10px;
margin-bottom: 15px;
}
html代码
<p>AAA</p>
<p></p>
<p></p>
<p></p>
<p>BBB</p>
现象:
- 相邻元素的
margin-top和margin-bottom会发生重叠 - 空白内容的
<p></p>也会重叠
正确答案:15
6.3 形成BFC的常见条件
- flaot的值不是none
- position是absolute或fixed(即不能是static或者relative)
- overflow不是visible
- display是 flex & inline-block & table-cell & inline-flex & table-caption
7. BFC常见应用
7.1 利用BFC避免margin重叠
改之前现象: p之间的垂直距离15px
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>防止margin重叠</title>
</head>
<style>
*{
margin: 0;
padding: 0;
}
p {
color: #f55;
background: yellow;
width: 200px;
line-height: 100px;
text-align:center;
margin: 30px;
}
</style>
<body>
<p>看看我的 margin是多少</p>
<p>看看我的 margin是多少</p>
</body>
</html>
改之后现象:p之间的垂直距离30px
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>防止margin重叠</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
p {
color: #f55;
background: yellow;
width: 200px;
line-height: 100px;
text-align: center;
margin: 30px;
}
div {
overflow: hidden;
}
</style>
<body>
<p>看看我的 margin是多少</p>
<div>
<p>看看我的 margin是多少</p>
</div>
</body>
</html>
7.2 自适应两栏布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
body {
width: 100%;
position: relative;
}
.left {
width: 100px;
height: 150px;
float: left;
background: rgb(139, 214, 78);
text-align: center;
line-height: 150px;
font-size: 20px;
}
.right {
/* 布局规则:BFC的区域不会与float box重叠 */
overflow: hidden;
height: 300px;
background: rgb(170, 54, 236);
text-align: center;
line-height: 300px;
font-size: 40px;
}
</style>
<body>
<!-- 每个盒子的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。 -->
<div class="left">LEFT</div>
<div class="right">RIGHT</div>
</body>
</html>
7.3 清楚浮动
- 当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清楚浮动。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>清除浮动</title>
</head>
<style>
.par {
border: 5px solid rgb(91, 243, 30);
width: 300px;
/* 布局规则: 计算BFC的高度时,浮动元素也参与计算 */
overflow: hidden;
}
.child {
border: 5px solid rgb(233, 250, 84);
width:100px;
height: 100px;
float: left;
}
</style>
<body>
<div class="par">
<div class="child"></div>
<div class="child"></div>
</div>
</body>
</html>
因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。