BFC是什么
定义:BFC(Block formatting context)直译为”块级格式化上下文”。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
BFC的布局规则
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
- 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算。
如何创建BFC(*)
- float的值不是none。
- position的值不是static或者relative。
- display的值是inline-block、table-cell、flex、table-caption或者inline-flex。
- overflow的值不是visible。
BFC的作用
1.利用BFC避免margin重叠。
一起来看一个例子:
1 |
|
页面生成的效果就是这样的:
根据第二条,属于同一个BFC的两个相邻的Box会发生margin重叠,所以我们可以设置,两个不同的BFC,也就是我们可以让把第二个p用div包起来,然后激活它使其成为一个BFC
1 |
|
2.自适应多栏布局
根据:
- 每个盒子的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
1 |
|
页面:
又因为:
- BFC的区域不会与float box重叠。
所以我们让right单独成为一个BFC
1 |
|
页面:
right会自动的适应宽度,这时候就形成了一个两栏自适应的布局。
扩展:同理,也可以实现三栏布局,甚至是多栏布局。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.left {
float: left;
width: 300px;
height: 300px;
background-color: #0b58a2;
}
.center {
height: 800px;
background-color: #0bbeba;
overflow: hidden;
}
.right {
float: right;
width: 300px;
height: 600px;
background-color: #0a0a0a;
}
</style>
</head>
<body>
<div class="left"></div>
<div class="right"></div>
<div class="center"></div>
</body>
</html>
3.清除浮动
当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清楚浮动。
比如这样:
1 |
|
页面:
这个时候我们根据最后一条:
- 计算BFC的高度时,浮动元素也参与计算。
给父节点激活BFC
1 |
|
页面:
总结
以上例子都体现了:
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。
手写防抖节流
1 |
数组扁平化
1 |
浏览器中的宏任务,微任务,时间循环机制与node环境有何不同
输入域名到页面呈现,浏览器执行了哪些操作?用到了哪些应用层协议?
webpack有哪些loader,作用是什么?插件的作用是什么?
url-loader:将小于limit的图片转成base64来减少http请求,如果大于就用http请求
vue-loader:解析和转换.vue文件并提取其中的script,style,template然后由对应的loader去处理
vue-template-compiler:把template编译成可执行的js代码
css-loader:打包css文件和处理css文件
style-loader:负责将css-loader加载到的css样式动态的添加到html -> head -> style标签中,style-loader尽量与css-loader结合使用
babel-loader:把高级写法编译成浏览器所认识的普通写法(也就是es6转换成es5)
postcss-loader:编写css的样式时,postcss-loader会自动帮我们加上兼容不同浏览器的前缀,比如-webkit
sass-loader:加载sass/scss文件并且编译成css文件
less-loader:加载less文件并且编译成css文件
mini-css-extract-plugin: 将css提取为独立的文件
optimize-css-assets-webpack-plugin:用于优化压缩css资源,它会在webpack构建时找到css资源,并且优化压缩
clean-webpack-plugin:每次构建代码的时候清理之前的/dist文件夹,也可以清楚一些日志
html-loader:在html中去加载另一个html文件
html-minify-loader:压缩html文件
下面推荐一篇关于这个的博客:Webpack 高频面试题汇总
babel-polyfill:babel只是默认转换新的javascript语法,不能转换新的api,babel-polyfill能够转换新的api
技术要求
webpack+vue+typescript+nodejs
本文链接: http://www.ionluo.cn/blog/posts/8debc8f4.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!