CSS魔法堂:你一定误解过的Normal flow

时间:2022-09-06 10:23:15

前言

 刚接触CSS时经常听到看到一个词"文档流",那到底什么是"文档流"呢?然后会看到"绝对定位和浮动定位能脱离文档流",从这句可以看到文档流和绝对定位、浮动定位是同一个范畴的概念,再后来在W3C标准文档找到关于Absolute positioning和Float的内容,却怎么也找不到Document flow(文档流)的资料。后来终于知道是某位大神将Normal flow翻译为文档流而已。。。。。。而我更偏好它的直译"常规流",或直接引用英文名词就好了。

Normal flow到底啥意思啊?

 首先我们从名称入手,Normal flow直译为"常规流",我们可以猜想它有以下几个特点:

  1. 作为默认的定位模式;
  2. 其他定位模式均以其为基础。

 各位都知道与定位系统的CSS属性position:static|relative|absolute|fixedfloat:none|left|right,其中position的默认值是static,而float的默认值为none。而position:static|relative均属于Normal flow。

 另外单纯设置position:absolute效果与采用Normal flow是一样的(《CSS魔法堂:Absolute Positioning就这个样》),而浮动定位也是基于Normal flow。所以我认为"脱离常规流"这一说法不完全正确,甚至让人产生误解

 对Normal flow的地位与和其余定位模式的关系有初步认知后,必须是迫不及待地想深入它的特性和行为特征了!这就回到那个耳熟能详的的IFC和BFC了。具体请参考CSS魔法堂:重新认识Box Model、IFC、BFC和Collapsing margins

IFC、BFC的靠山——Normal flow

 对于IFC和BFC已经有很多资料围绕它们来展开,而且我们也投入很多精力去理解它俩,但往往会忽略一个前提,那就是没有Normal flow就没有IFC、BFC。当我们采用绝对定位或浮动定位时,就没有必要再讨论IFC和BFC了。那么说绝对定位和浮动定位会让元素产生新的BFC又是怎么说呢?

 我是这样理解的。首先绝对定位和浮动定位必须产生新的BFC,就想根元素会产生默认的BFC那样,供采用常规流的块级子孙盒子使用。但像Collapsing margins这种由BFC引起的行为特征,由于盒子本身不再受原来BFC的影响,自然就不会出现Collapsing margins了。

其实我有个疑问:那就是为什么一个文档可以有多个BFC,却只有一个IFC呢?

BFC下盒子定位的奥义

我想大家都试过采用这种方式实现水平居中(IE5.5下无效)

<style type="text/css">
.center{
font-size: 30px;
line-height: 2;
text-align: center;
background: #06f; width: 200px;
margin: 0 auto;
}
</style>
<body>
<div class="center">hello world:)</div>
</body>

CSS魔法堂:你一定误解过的Normal flow

 参与BFC的盒子独占一行,我想大家应该没有异议了,但具体是如何独占法呢?看等式吧!

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

其中margin-left/width/margin-right可为auto,且具有以下规则:

  1. 若width为auto,则其他设置为auto的属性的实际值为0,并让width的实际值满足等式;
  2. 若width为数值,而margin-left/right均为auto,且除marin-left/right外其他属性值总和小于containing block的宽度,那么margin-left == margin-right == ('border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width')/2;否则margin-left == margin-right == 0.

Normal flow的小弟——Relative positioning

 我们可以以Normal flow或Float定位模式作为基础之上再叠加一个相对定位,从而实现更灵活的定位操作。

 相对定位的最强武器就是top/right/bottom/left4个属性了,好明显它们默认值均是auto。另外所谓基于Normal flow或Float定位模式的相对定位,自然就是以Normal flow或Float定位模式下margin box的4条边作为参考系了。

接下来只要掌握以下规则,就可以运用自如了:

  1. left/right均为auto,则实际值为0;
  2. left/right其中一个为数值,则两者等式left == -right;
  3. left/right均为数值,则根据direction值。若direction为ltr,则left值保留,而right = -left;若direction为rtl,则right值保留,而left = -right。

    (top/bottom规则同上)

注意:

  1. 叠加相对定位后的盒子不会影响其他盒子的排版,只是会发生重叠的效果而已;
  2. 若相对定位后的盒子超出所属containing block的范围,且overflow:auto|scroll;则会导致出现滚动条的情况,从而影响其他盒子的排版。
<div style="width:100px; height:100px; overflow:auto; border:2px solid blue;">
<div style="width:20px; height:20px; background-color:red; position:relative; top:100px; left:100px;">A</div>
</div>

CSS魔法堂:你一定误解过的Normal flow

总结

若有纰漏,请各位指正

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/5364580.html_肥子John

感谢

Relative positioning

Visual formatting model details

KB010: 常规流( Normal flow )

KB009: CSS 定位体系概述

http://www.css88.com/book/css/properties/layout/display.htm

CSS魔法堂:你一定误解过的Normal flow的更多相关文章

  1. CSS魔法堂:小结一下Box Model与Positioning Scheme

    前言  对于Box Model和Positioning Scheme中3种定位模式的细节,已经通过以下几篇文章记录了我对其的理解和思考.  <CSS魔法堂:重新认识Box Model.IFC.B ...

  2. CSS魔法堂:深入理解line-height和vertical-align

    前言 一直听说line-height是指两行文本的基线间的距离,然后又说行高等于行距,最近还听说有个叫行间距的家伙,@张鑫旭还说line-height和vertical-align基情四射,贵圈真乱啊 ...

  3. CSS魔法堂:Box-Shadow没那么简单啦&colon;&rpar;

    前言  说起box-shadow那第一个想法当然就是用来实现阴影,其实它还能用于实现其他好玩的效果的,本篇就打算说说box-shadow的那些事. 二话不说看效果 3D小球 <style typ ...

  4. CSS魔法堂:重拾Border之——更广阔的遐想

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  5. CSS魔法堂:重拾Border之——不仅仅是圆角

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  6. CSS魔法堂:重拾Border之——图片作边框

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  7. CSS魔法堂:重拾Border之——解构Border

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  8. CSS魔法堂:&quot&semi;那不是bug,是你不懂我&excl;&quot&semi; by inline-block

    前言  每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display:inline;*zoom:1;.然后发 ...

  9. CSS魔法堂:说说Float那个被埋没的志向

    前言  定位系统中第一难理解就是Normal flow,而第二就非Float莫属了,而Float难理解的原因有俩,1. 一开头我们就用错了:2. 它跟Normal flow靠得太近了.本文尝试理清Fl ...

随机推荐

  1. JAVA面试题

    在这里我将收录我面试过程中遇到的一些好玩的面试题目 第一个面试题:ABC问题,有三个线程,工作的内容分别是打印出"A""B""C",需要做的 ...

  2. SQL Server获取自增列下一个Id

    IDENT_CURRENT('TableName')为当前的最大标识值,IDENT_INCR('TableName')为设置的标识值增量, 两者相加即为下一个标识值 SELECT IDENT_CURR ...

  3. 字符串模板替换方法 MessageFormat&period;format

    String content = "ab,cc,{名称},{密码},{日期},dd,ff"; String array[] = {userName, password, forma ...

  4. Android课程---视图组件总结

  5. 2013年各大小IT公司待遇

    2013年各大小IT公司待遇(初版   摘自好网)本人西电硕士,根据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇如下,吐血奉献给各位学弟学妹,公司比较全,你想去的公司不在这里面,基本上是无名 ...

  6. git status对应中文名称

    git status显示出来的中文文档是一串字符码,不能正常识别 git config --global core.quotepath false 这一句代码就可以帮你

  7. Ubuntu上将终端安装到右键上

    Ubuntu上将终端安装到右键上 author:headsen chen    2017-10-12  10:26:12 个人原创,允许转载,请注明作者和出处,否则依法追究法律责任 chen@chen ...

  8. 借助Bodymovin播放svg动画

    svg动画,截取工具有点不忍直视了~~~ 为了实现上面的svg动画,可以使用bodymovin插件,简单配置之后,就可以直接可以实现在 AE(可视化操作,不用码代码)上面导出 svg的json数据,在 ...

  9. UOJ&num;349&period; 【WC2018】即时战略

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ349.html 题解 被cqz D没了.我D cly 关你啥事(逃 首先链的情况直接rand就好了. 期望 ...

  10. weblogic11G 修改密码

    weblogic11的登录密码修改方法: 1. 登陆到weblogic后选中domain structure下的security Realms(如图一)   (图一) 详情如图二: (图二) 2. 双 ...