[toc]
## 1. margin与容器的尺寸
### 1.1 margin与可视尺寸
特性:
- 适用于没有设定width/height的普通block元素
- 只适用于水平方向尺寸
应用:一侧定宽自适应
```html
<img width="150px" style="float:left">
<p style="padding-left:170px;">图片左浮动....</p>
```
![](https://box.kancloud.cn/844550b0915333a41c4088e7c69887c6_1052x520.png)
### 1.2 margin与占据尺寸
特性:
- block、inline-block水平元素均适应
- 与有没有设定width、height值无关
- 适应于水平方向和垂直方向
应用:滚动容器内上下留白
```html
<div style="height:200px;">
<img height="300" style="margin:50px 0;">
</div>
```
## 2. margin与百分比单位
**百分比margin的计算规则**
- 普通元素的百分比margin:都是相对于容器的宽度计算的。比如:`img {margin: 10%;}`
![](https://box.kancloud.cn/04dc2d28330554457804394a435b2156_1014x448.png)
- 绝对定位元素的百分比margin:相对于第一个定位祖先元素(relative、absolute、fixed)
**应用**
宽高2:1自适应矩形
```css
.box { background-color: olive; overflow: hidden; }
.box > div { margin: 50%; }
```
![](https://box.kancloud.cn/63576f20ae88c4ba7b1dd51fd4618d08_696x436.png)
## 3. 正确看待CSS的margin重叠
### 3.1 margin重叠通常特性
1. block水平元素(不包括float和absolute元素)
2. 不考虑writing-mode,只发生垂直方向(margin-top/margin-bottom)
### 3.2 margin重叠的3种情景
1. 相邻的兄弟元素
2. 父级和第一个/最后一个子元素
3. 空的block元素
### 3.3 父子margin重叠其他条件
**margin-top重叠**
|margin-top重叠|解决|
|:-----------------|:----------------|
|父元素非块状格式化上下文元素| 设置父元素overflow:hidden|
|父元素没有border-top设值| 设置父元素border|
|父元素没有padding-top值| 设置父元素padding-top|
|父元素和第一个子元素之间没有inline元素分隔|插入一个内联元素如空格`&bsp;`|
**margin-bottom重叠**
1. 父元素非块状格式化上下文元素
2. 父元素没有border-bottom设置
3. 父元素没有padding-bottom值
4. 父元素和最后一个子元素之间没有inline元素分隔
5. 父元素没有height相关声明
### 3.4 空block元素margin重叠
条件限制:
1. 元素没有border设置
2. 元素没有padding值
3. 里面没有inline元素
4. 没有height、或者min-height
### 3.5 重叠的计算规则
1. 正正取大值
2. 正负值相加
3. 负负最负值
## 4. 理解CSS中的margin:auto
margin:auto的作用机制:自动分配剩余空间
### 4.1 垂直居中方法
**writing-mode**
更改流为垂直方向,但是水平居中失效
```css
.father { height:200px; width:100%; writing-mode:vertical-lr; }
.son { height:100px; width:500px; margin:auto; }
```
![](https://box.kancloud.cn/7a63c72ae3f4db7debd87bf1b2f5760d_1502x346.png)
**绝对定位元素的margin:auto居中**
```css
.father { height:200px; position:relative; }
.son { position:absolute; top:0; right:0; left:0; bottom:0; height:100px; width:500px; margin:auto; }
```
![](https://box.kancloud.cn/85027f4a8db0f86bdab17ea060d2ea68_1516x350.png)
## 5. margin负值定位
### 5.1 margin负值下的两端对齐
利用特性:margin改变元素宽度
![](https://box.kancloud.cn/cfb6f5643f84aa36147411a48d8472fb_1028x776.png)
### 5.2 margin负值下的登高布局
利用特性:margin改变元素占据空间
![](https://box.kancloud.cn/7134b28924d9ff0e3660127b3ac5d056_1498x494.png)
缺点:有副作用,有点:支持IE6
### 5.3 margin负值下的两栏自适应布局
利用特性:元素占据空间跟随margin移动
![](https://box.kancloud.cn/3d79308015bc1d560c9ee5d4419fc16f_1366x730.png)
优点:DOM顺序和最终视觉顺序相符
## 6. margin无效情形解析
**inline水平元素的垂直margin无效**
2个前提:
1. 非替换元素,不是<img>元素
2. 正常书写模式
**margin重叠**
**display:table-cell与margin**
display:table-cell、display:table-row等声明的margin无效!
## 7. 了解margin-start/margin-end属
### 7.1 -webkit-margin-start、-webkit-margin-end
- 正常的流向,margin-start等同于margin-left,两者重叠不累加
- 如果水平流是从右往左,margin-start等同于margin-right
- 在垂直流下(writing-mode:vertical-*;),margin-start等同于margin-top
### 7.2 margin-collaps
```css
-webkit-margin-collaps: <collaps> | <discard> | <separate>
```
- collaps,默认,重叠
- discard,取消重叠,使margin无效
- separate,取消重叠,不合并
- 说明
- CSS与HTML
- BFC的特性及其常见应用
- CSS深入理解之margin
- CSS深入理解之line-height
- CSS盒模型相关知识
- CSS知识总结
- HTML知识总结
- 三栏布局五种方式
- JavaScript内置对象
- 1.循环
- 2.数组方法对比
- 3.字符串实用常操纪要
- JavaScript核心
- var、let、const定义变量
- this 的指向问题详解
- 箭头函数
- ES6部分知识归纳
- ES6的Class
- Promise和Async/await
- 面向对象的概念及JS中的表现
- 创建对象的九种方式
- JS的继承
- 闭包总结
- 构造函数与作用域
- 原型与原型链
- 函数的四种调用模式
- apply、call、bind详解
- JavaScript应用
- 1.JavaScript实现深拷贝与浅拷贝
- 2.函数防抖与节流
- 3.无阻塞脚本加载技术
- DOM
- 如何写出高性能DOM?
- 事件探秘
- 事件委托
- 操作DOM常用API详解
- 重排和重绘
- 运行机制与V8
- 浏览器的线程和进程
- Vue.js
- Vue.js知识点总结
- Vue-Router知识点总结
- 父子组件之间通信的十种方式
- 优化首屏加载
- 关于Vuex
- 前端路由原理及实现
- 在Vue.js编写更好的v-for循环的6种技巧
- 12个Vue.js开发技巧和窍门
- 网络协议
- HTTP缓存机制
- UDP协议
- TCP协议
- HTTPS协议
- HTTPS的背景知识、协议的需求、设计的难点
- HTTPS与HTTP的区别
- 框架与架构
- MVC、MVP、MVVM
- Gulp与Webpack的区别
- Angular React 和 Vue的比较
- 虚拟DOM和实际的DOM有何不同?
- 架构问题
- 工程化
- npm link命令
- npm scripts 使用指南
- 前端工程简史
- 常见的构建工具及其对比
- Webpack基本配置与概念
- 设计模式
- 工厂设计模式
- 单例设计模式
- 适配器模式
- 装饰器模式