资讯专栏INFORMATION COLUMN

重学前端学习笔记(二十五)--CSS的正常流

toddmark / 2330人阅读

摘要:一正常流的行为正常流的排版行为依次排列,排不下了换行。在正常流基础上,有相关规则,使得一些盒占据了正常流需要的空间,可以把理解为文字环绕。

笔记说明

</>复制代码

  1. 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com
一、正常流的行为

</>复制代码

  1. 正常流的排版行为:依次排列,排不下了换行。
1.1、float

</>复制代码

  1. 在正常流基础上,有 float 相关规则,使得一些盒占据了正常流需要的空间,可以把 float 理解为文字环绕

1.2、vertical-align

</>复制代码

  1. vertical-align 相关规则规定了如何在垂直方向对齐盒。基线、文字顶 / 底、行顶 / 底等概念。

1.3、margin 折叠

1、参考文章:CSS中margin折叠问题记录

2、块级格式上下文Block Formatting Context(简称 BFC)

</>复制代码

  1. Web页面的一种布局方式,通俗点说,也是指页面上一个渲染区域,里面的元素按文档流中的顺序垂直排列,并且发生垂直方向上的 margin折叠,同时这个区域内的元素布局不会对外面的元素有任何影响。

3、产生一个BFC:当元素满足一下任何一个条件

float 属性取值不是 none

overflow 属性取值不是 visible

display 的值为 table-cell, table-caption, inline-block 中的任何一个

position 的值不为 static 或 relative 中的任何一个

4、BFC 内部垂直方向上的 margin折叠

可以用https://codepen.io/pen/测试:

</>复制代码

  1. box1
  2. box2
  3. box3

</>复制代码

  1. *{
  2. margin: 0;
  3. padding: 0;
  4. }
  5. #father{
  6. width: 2000px;
  7. height: 400px;
  8. background: #0016d9;
  9. }
  10. #first-child{
  11. margin-top: 20px;
  12. background: chocolate;
  13. width: 60px;
  14. height: 60px;
  15. }
  16. #second-child{
  17. background: chartreuse;
  18. width: 60px;
  19. height: 60px;
  20. margin-bottom: 20px;
  21. }
  22. #three-child{
  23. margin-top:40px;
  24. background: fuchsia;
  25. width: 60px;
  26. height: 60px;
  27. }

这段代码渲染出来的结果:

可以看出 box1 距离 body 上边 20px,而 box2 和 box3 之间距离 40px,就是因为发生了折叠。body就是一个BFC,里面元素会发生margin折叠。

5、折叠现象去除

</>复制代码

  1. box1
  2. box2
  3. box3

</>复制代码

  1. /* 添加overflow: hidden; */
  2. #father{
  3. overflow: hidden;
  4. }

这样就可以得到我们想要的效果:

二、正常流的原理

</>复制代码

  1. 在 CSS 标准中,规定了如何排布每一个文字或者盒的算法,这个算法依赖一个排版的当前状态,CSS 把这个当前状态称为格式化上下文(formatting context)
2.1、排版过程

</>复制代码

  1. 格式化上下文 + 盒 / 文字 = 位置
  2. formatting context + boxes/charater = positions
2.2、块级盒和行内级盒排版

</>复制代码

  1. 排版需要分别为它们规定了块级格式化上下文和行内级格式化上下文。

1、块级格式化上下文顺次排列元素:

2、行内级格式化上下文顺次排列元素:

3、正常流中的一个盒或者文字排版,需要分成三种情况处理

当遇到块级盒:排入块级格式化上下文。

当遇到行内级盒或者文字:首先尝试排入行内级格式化上下文,如果排不下,那么创建一个行盒,先将行盒排版(行盒是块级,所以到第一种情况),行盒会创建一个行内级格式化上下文。

遇到 float 盒:把盒的顶部跟当前行内级上下文上边缘对齐,然后根据 float 的方向把盒的对应边缘对到块级格式化上下文的边缘,之后重排当前行盒。

三、正常流的使用技巧 3.1、等分布局问题

1、采用百分比宽度解决

</>复制代码

  1. .inner {
  2. width:33.33%;
  3. height:300px;
  4. display:inline-block;
  5. outline:solid 1px blue;
  6. }

2、上面 1 的代码每个 div 并非紧挨,中间有空白,因为为了代码格式加入的换行和空格被 HTML 当作空格文本,跟 inline 盒混排了的缘故。

</>复制代码

3、上面 2 的做法影响代码可读性

</>复制代码

  1. /* 解决方案:设置 outer 中的字号为 0 */
  2. .inner {
  3. width:33.33%;
  4. height:300px;
  5. display:inline-block;
  6. outline:solid 1px blue;
  7. font-size:30px;
  8. }
  9. .outer {
  10. font-size:0;
  11. }

4、在某些浏览器中,因为像素计算精度问题,还是会出现换行

</>复制代码

  1. /* 解决方案:给 outer 添加一个特定宽度 */
  2. .inner {
  3. width:33.33%;
  4. height:300px;
  5. display:inline-block;
  6. outline:solid 1px blue;
  7. }
  8. .outer {
  9. width:101px
  10. }

5、这个代码在某些旧版本浏览器中会出现换行

</>复制代码

  1. /* 解决方案:给最后一个 div 加上一个负的右 margin */
  2. .outer {
  3. width:101px
  4. }
  5. .inner {
  6. width:33.33%;
  7. height:300px;
  8. display:inline-block;
  9. outline:solid 1px blue;
  10. }
  11. .inner:last-child {
  12. margin-right:-5px;
  13. }
3.2、自适应宽

</>复制代码

  1. 自适应宽(一个元素固定宽度,另一个元素填满父容器剩余宽度)是个经典的布局问题。

1、如何使用正常流来解决?

</>复制代码

</>复制代码

  1. .fixed {
  2. width:200px;
  3. }
  4. .fixed, .auto {
  5. height:300px;
  6. outline:solid 1px blue;
  7. }

2、利用负 margin

</>复制代码

  1. .fixed {
  2. display:inline-block;
  3. vertical-align:top;
  4. }
  5. .auto {
  6. margin-left:-200px;
  7. width:100%;
  8. display:inline-block;
  9. vertical-align:top;
  10. }

这样做会导致 auto 中的内容位置不对,还需要使用 padding 把内容挤出来,最终完整代码如下:

</>复制代码

  1. .fixed {
  2. display:inline-block;
  3. vertical-align:top;
  4. }
  5. /* 给 auto 添加 padding-left 和 box-sizing 两个属性 */
  6. .auto {
  7. margin-left:-200px;
  8. padding-left:200px;
  9. box-sizing:border-box;
  10. width:100%;
  11. display:inline-block;
  12. vertical-align:top;
  13. }
个人总结

好像BFC是前端面试题的常客。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104249.html

相关文章

  • 重学前端学习笔记十五)--CSS正常

    摘要:一正常流的行为正常流的排版行为依次排列,排不下了换行。在正常流基础上,有相关规则,使得一些盒占据了正常流需要的空间,可以把理解为文字环绕。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联...

    dcr309duan 评论0 收藏0
  • 重学前端学习笔记十五)--CSS正常

    摘要:一正常流的行为正常流的排版行为依次排列,排不下了换行。在正常流基础上,有相关规则,使得一些盒占据了正常流需要的空间,可以把理解为文字环绕。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联...

    leap_frog 评论0 收藏0
  • 重学前端学习笔记十五)--浏览器工作解析(五)

    摘要:五绘制把任何位图合成到最终位图的操作称为绘制。个人总结这一节主要讲解了浏览器中的位图操作部分,包括渲染合成和绘制三个部分。作业用实现一个玩具浏览器。。。。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音...

    iliyaku 评论0 收藏0
  • 重学前端学习笔记十五)--浏览器工作解析(五)

    摘要:五绘制把任何位图合成到最终位图的操作称为绘制。个人总结这一节主要讲解了浏览器中的位图操作部分,包括渲染合成和绘制三个部分。作业用实现一个玩具浏览器。。。。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音...

    dongxiawu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<