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

简介: 前言  刚接触CSS时经常听到看到一个词"文档流",那到底什么是"文档流"呢?然后会看到"绝对定位和浮动定位能脱离文档流",从这句可以看到文档流 和绝对定位、浮动定位是同一个范畴的概念,再后来在W3C标准文档找到关于Absolute positioning和Float的内容,却怎么也找不到D

前言

 刚接触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>
347002-20160407173641484-1235067745.jpg
参与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>

    1. 347002-20160407173655547-619281358.jpg

    总结

    若有纰漏,请各位指正

目录
相关文章
|
Web App开发 前端开发 搜索推荐
CSS Reset & Modern CSS Reset
CSS Reset & Modern CSS Reset
163 1
CSS Reset & Modern CSS Reset
|
前端开发
10、前端开发:CSS知识总结——盒子模型(Box Model)(1)
10、前端开发:CSS知识总结——盒子模型(Box Model)(1)
94 0
10、前端开发:CSS知识总结——盒子模型(Box Model)(1)
|
前端开发
12、前端开发:CSS知识总结——盒子模型(Box Model)(3)
12、前端开发:CSS知识总结——盒子模型(Box Model)(3)
63 0
|
前端开发
11、前端开发:CSS知识总结——盒子模型(Box Model)(2)
11、前端开发:CSS知识总结——盒子模型(Box Model)(2)
103 0
11、前端开发:CSS知识总结——盒子模型(Box Model)(2)
|
前端开发
Normalize.css:CSS reset的替代方案
Normalize.css:CSS reset的替代方案
117 0
|
Web App开发 前端开发 UED
现代 CSS 解决方案:Modern CSS Reset
现代 CSS 解决方案:Modern CSS Reset
175 0
现代 CSS 解决方案:Modern CSS Reset
|
前端开发
CSS 奇思妙想 | Single Div 绘图技巧
CSS 奇思妙想 | Single Div 绘图技巧
103 0
CSS 奇思妙想 | Single Div 绘图技巧
|
Web App开发 容器
css3弹性盒子模型详解( Flexible Box Model)
相信很多人在进行页面布局的时候,经常会使用到float,margin,padding等布局元素,并为了调整细节烦不胜烦,CSS3中新的盒子模型——弹性盒子模型(Flexible Box Model)为大家带来了不一样的新体验。
1134 0
|
Web App开发 JavaScript 前端开发