盒模型
# 盒模型
# 行级元素 - inline
- 内容决定元素占的位置
- 不可以通过 css 改变宽高 span\ strong \ em\ a\ del
# 块级元素 block
- 独占一行
- 可以通过 css 改变宽高 div \ p\ ul \ li \ ol \ form \ address
# 行级块元素 inline-block
- 内容决定大小
- 可以通过 css 改变宽高 img
凡是 inline、inline-block 类型 的标签都存在文字特性
# 盒模型的计算
border + padding + width
# margin 塌陷问题
假设我们现在有这样一个结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 100px;
height: 100px;
}
.parent {
background-color: #000;
}
.content {
width: 50px;
height: 50px;
background-color: #f00;
}
</style>
</head>
<body>
<div class="parent">
<div class="content"></div>
</div>
</body>
</html>
然后我们移动父子位置
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 100px;
height: 100px;
}
.parent {
background-color: #000;
margin-left: 100px;
margin-top: 100px;
}
.content {
width: 50px;
height: 50px;
background-color: #f00;
margin-left: 50px;
margin-top: 50px;
}
</style>
我们发现 子盒子(content)的margin-top 并没有生效。父盒子确实带着子盒子动了。 只有当我们的子盒子的 margin-top 大于父盒子的margin-top 的时候 子盒子的 margin-top 才生效。 这个时候新的问题又出现了,父盒子又随着子盒子一起跑偏了。
# BFC
Block Format Content(块级元素格式化文档流) 如何触发一个盒子的 BFC
- position:absolute
- display:inline-block
- float:left/right
- overflow:hidden
方式很多但是要找好场景使用。
# margin 合并
指两个兄弟层级的标签当设置 margin 的时候两个发生合并。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 100px;
height: 100px;
}
.demo1 {
background: #000;
margin-bottom: 100px;
}
.demo2 {
background: #f00;
margin-bottom: 100px;
}
</style>
</head>
<body>
<div class="demo1"></div>
<div class="demo2"></div>
</body>
</html>
解决方式: 通过计算的方式将 margin 放到同一个盒子上
margin-bottom:200px;
通过 BFC 的方式使其中一个盒子处于BFC 的规则之下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
html,body{
height: 100%;
}
div {
width: 100px;
height: 100px;
}
.demo1 {
background: #000;
margin-bottom: 100px;
}
.wrapper {
overflow: hidden;
width: 200px;
height: 200px;
}
.demo2 {
background: #f00;
margin-top: 100px;
}
</style>
</head>
<body>
<div class="demo1"></div>
<div class="wrapper">
<div class="demo2"></div>
</div>
</body>
</html>
注意:一般我们这种bug 不解决,为什么呢? 因为BFC需要增加新的 html,我们可以通过其他的方式来绕过这个问题。
# 浮动 float
浮动元素产生了浮动流 所有产生了浮动流的元素,块级元素看不到 产生了bfc的元素和文本类属性的元素以及文本都能看到浮动元素。 文本类属性就是(inline/inline-block/text)
假设我们有这样一个结构:父盒子由子盒子撑开内容区,当我们给子盒子设置 float 的时候产生了“浮动流”,此时父盒子将失去内容区。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
}
div {
background: #000;
}
.parent {
border: 1px solid #f00;
background: transparent;
}
.parent div {
width: 100px;
height: 100px;
float: left;
}
</style>
</head>
<body>
<div class="parent">
<div class="demo1"></div>
<div class="demo2"></div>
<div class="demo3"></div>
</div>
</body>
</html>
解决: 1、通过直接给盒子设置宽高,但是这样如果盒子的数量超过了父盒子的高度将不适用 2、通过在父盒子末尾添加一个新的标签,通过 clear 清除改标签周围的浮动。
<style>
.parent p {
clear: both|left;
}
</style>
<div class="parent">
<div class="demo1"></div>
<div class="demo2"></div>
<div class="demo3"></div>
<p></p>
</div>
如果我们将 p 标签的clear 设置为 right 意味着我们将会清除 p 标签周围 float:right 的浮动,但是没有 所以失效,并没有什么体现。 但是如果这样解决我们的结构就变得不合理
3、通过伪元素清除浮动
.parent::after {
content: "";
display: block;
clear: both;
}
注意:如果我们不设置display:block的话没有生效,原因是因为 clear 属性必须作用在块级元素上。 4、将父盒子设置为 bfc 元素
.parent {
border: 1px solid #f00;
background: transparent;
/* float: left; */
/* position: absolute; */
/* display: inline-block; */
}
注意:position:absolute; float:left/right;在内部会将元素转换成 inline-block