重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏, 天天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的能够加入winter的专栏学习【原文有winter的语音】,若有侵权请联系我,邮箱:kaimo313@foxmail.com。
正常流的排版行为:依次排列,排不下了换行。
在正常流基础上,有float
相关规则,使得一些盒占据了正常流须要的空间,能够把float
理解为文字环绕
。
有
vertical-align
相关规则规定了如何在垂直方向对齐盒。基线、文字顶 / 底、行顶 / 底等概念。
一、参考文章:CSS中margin折叠问题记录css
二、块级格式上下文Block Formatting Context
(简称 BFC)html
Web页面的一种布局方式,通俗点说,也是指页面上一个渲染区域,里面的元素按文档流中的顺序垂直排列,而且发生垂直方向上的
margin折叠
,同时这个区域内的元素布局不会对外面的元素有任何影响。
三、产生一个BFC:当元素知足一下任何一个条件前端
float
属性取值不是 none
overflow
属性取值不是 visible
display
的值为 table-cell, table-caption, inline-block
中的任何一个position
的值不为 static 或 relative
中的任何一个四、BFC 内部垂直方向上的 margin折叠面试
能够用https://codepen.io/pen/测试:算法
<div id="father"> <div id="first-child">box1</div> <div id="second-child">box2</div> <div id="three-child">box3</div> </div>
*{ margin: 0; padding: 0; } #father{ width: 2000px; height: 400px; background: #0016d9; } #first-child{ margin-top: 20px; background: chocolate; width: 60px; height: 60px; } #second-child{ background: chartreuse; width: 60px; height: 60px; margin-bottom: 20px; } #three-child{ margin-top:40px; background: fuchsia; width: 60px; height: 60px; }
这段代码渲染出来的结果:浏览器
能够看出 box1 距离 body 上边 20px,而 box2 和 box3 之间距离 40px,就是由于发生了折叠。body就是一个BFC,里面元素会发生margin折叠。布局
五、折叠现象去除学习
<!-- 添加一个层级加上overflow: hidden以及float: left --> <div id="father"> <div id="first-child">box1</div> <div style="overflow: hidden"> <div id="second-child">box2</div> </div> <div style="float: left"> <div id="three-child">box3</div> </div> </div>
/* 添加overflow: hidden; */ #father{ overflow: hidden; }
这样就能够获得咱们想要的效果:测试
在 CSS 标准中,规定了如何排布每个文字或者盒的算法,这个算法依赖一个排版的当前状态
,CSS 把这个当前状态称为格式化上下文(formatting context)
。
格式化上下文 + 盒 / 文字 = 位置 formatting context + boxes/charater = positions
排版须要分别为它们规定了块级格式化上下文和行内级格式化上下文。
一、块级格式化上下文顺次排列元素:spa
二、行内级格式化上下文顺次排列元素:
三、正常流中的一个盒或者文字排版,须要分红三种状况处理
一、采用百分比宽度解决
<div class="outer"> <div class="inner"></div> <div class="inner"></div> <div class="inner"></div> </div> .inner { width:33.33%; height:300px; display:inline-block; outline:solid 1px blue; }
二、上面 1 的代码每一个 div 并不是紧挨,中间有空白,由于为了代码格式加入的换行和空格被 HTML 看成空格文本,跟 inline 盒混排了的缘故。
<!-- 去掉空格和换行 --> <div class="outer"><div class="inner"></div><div class="inner"></div><div class="inner"></div></div>
三、上面 2 的作法影响代码可读性
/* 解决方案:设置 outer 中的字号为 0 */ .inner { width:33.33%; height:300px; display:inline-block; outline:solid 1px blue; font-size:30px; } .outer { font-size:0; }
四、在某些浏览器中,由于像素计算精度问题,仍是会出现换行
/* 解决方案:给 outer 添加一个特定宽度 */ .inner { width:33.33%; height:300px; display:inline-block; outline:solid 1px blue; } .outer { width:101px }
五、这个代码在某些旧版本浏览器中会出现换行
/* 解决方案:给最后一个 div 加上一个负的右 margin */ .outer { width:101px } .inner { width:33.33%; height:300px; display:inline-block; outline:solid 1px blue; } .inner:last-child { margin-right:-5px; }
自适应宽(一个元素固定宽度,另外一个元素填满父容器剩余宽度)是个经典的布局问题。
一、如何使用正常流来解决?
<!-- div.fixed是固定宽度的,须要添加css让div.auto填满剩余宽度 --> <div class="outer"> <div class="fixed"></div> <div class="auto"></div> </div>
.fixed { width:200px; } .fixed, .auto { height:300px; outline:solid 1px blue; }
二、利用负 margin
.fixed { display:inline-block; vertical-align:top; } .auto { margin-left:-200px; width:100%; display:inline-block; vertical-align:top; }
这样作会致使 auto 中的内容位置不对,还须要使用 padding 把内容挤出来,最终完整代码以下:
.fixed { display:inline-block; vertical-align:top; } /* 给 auto 添加 padding-left 和 box-sizing 两个属性 */ .auto { margin-left:-200px; padding-left:200px; box-sizing:border-box; width:100%; display:inline-block; vertical-align:top; }
好像BFC是前端面试题的常客。。。