刚接触CSS时经常听到看到一个词"文档流",那到底什么是"文档流"呢?然后会看到"绝对定位和浮动定位能脱离文档流",从这句可以看到文档流和绝对定位、浮动定位是同一个范畴的概念,再后来在W3C标准文档找到关于Absolute positioning和Float的内容,却怎么也找不到Document flow(文档流)的资料。后来终于知道是某位大神将Normal flow翻译为文档流而已。。。。。。而我更偏好它的直译"常规流",或直接引用英文名词就好了。
首先我们从名称入手,Normal flow直译为"常规流",我们可以猜想它有以下几个特点:
作为默认的定位模式;
其他定位模式均以其为基础。
各位都知道与定位系统的CSS属性<code>position:static|relative|absolute|fixed</code>和<code>float:none|left|right</code>,其中position的默认值是static,而float的默认值为none。而<code>position:static|relative</code>均属于Normal flow。
对于IFC和BFC已经有很多资料围绕它们来展开,而且我们也投入很多精力去理解它俩,但往往会忽略一个前提,那就是没有Normal flow就没有IFC、BFC。当我们采用绝对定位或浮动定位时,就没有必要再讨论IFC和BFC了。那么说绝对定位和浮动定位会让元素产生新的BFC又是怎么说呢?
我是这样理解的。首先绝对定位和浮动定位必须产生新的BFC,就想根元素会产生默认的BFC那样,供采用常规流的块级子孙盒子使用。但像Collapsing margins这种由BFC引起的行为特征,由于盒子本身不再受原来BFC的影响,自然就不会出现Collapsing margins了。
其实我有个疑问:那就是为什么一个文档可以有多个BFC,却只有一个IFC呢?
我想大家都试过采用这种方式实现水平居中(IE5.5下无效)
参与BFC的盒子独占一行,我想大家应该没有异议了,但具体是如何独占法呢?看等式吧!
其中margin-left/width/margin-right可为auto,且具有以下规则:
若width为auto,则其他设置为auto的属性的实际值为0,并让width的实际值满足等式;
若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或Float定位模式作为基础之上再叠加一个相对定位,从而实现更灵活的定位操作。
相对定位的最强武器就是<code>top/right/bottom/left</code>4个属性了,好明显它们默认值均是auto。另外所谓基于Normal flow或Float定位模式的相对定位,自然就是以Normal flow或Float定位模式下margin box的4条边作为参考系了。
接下来只要掌握以下规则,就可以运用自如了:
left/right均为auto,则实际值为0;
left/right其中一个为数值,则两者等式left == -right;
left/right均为数值,则根据direction值。若direction为ltr,则left值保留,而right = -left;若direction为rtl,则right值保留,而left = -right。
(top/bottom规则同上)
注意:
叠加相对定位后的盒子不会影响其他盒子的排版,只是会发生重叠的效果而已;
若相对定位后的盒子超出所属containing block的范围,且<code>overflow:auto|scroll;</code>则会导致出现滚动条的情况,从而影响其他盒子的排版。
若有纰漏,请各位指正
<a href="https://www.w3.org/TR/CSS21/visuren.html#relative-positioning">Relative positioning</a>
<a href="https://www.w3.org/TR/CSS21/visudet.html">Visual formatting model details</a>
<a href="http://www.w3help.org/zh-cn/kb/010/">KB010: 常规流( Normal flow )</a>
<a href="http://www.w3help.org/zh-cn/kb/009/">KB009: CSS 定位体系概述</a>
<a href="http://www.css88.com/book/css/properties/layout/display.htm">http://www.css88.com/book/css/properties/layout/display.htm</a>
如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!
<a href="http://home.cnblogs.com/u/fsjohnhuang/">^_^肥仔John</a>
<a href="http://home.cnblogs.com/u/fsjohnhuang/followees">关注 - 85</a>
<a href="http://home.cnblogs.com/u/fsjohnhuang/followers">粉丝 - 707</a>
<a>+加关注</a>
1
<a></a>
<a href="http://www.ucancode.com/index.htm" target="_blank">【推荐】超50万VC++源码: 大型工控、组态\仿真、建模CAD源码2018!</a>
<a href="https://cloud.tencent.com/developer/support-plan?fromSource=gwzcw.710852.710852.710852" target="_blank">【推荐】加入腾讯云自媒体扶持计划,免费领取域名&服务器</a>
<b>最新IT新闻</b>:
<b>最新知识库文章</b>:
<a href="https://github.com/fsjohnhuang" target="_blank">肥仔John@github</a>
当我们以<code>position:absolute</code>之名让元素脱离Normal flow的控制后,以为通过<code>left</code>和<code>top</code>属性值即可让元素得以无限的自由时,却发现还有各种神秘的力量左右着它的来去,于是我们意识到自己力量的微弱,开始迷茫不前。
后来有幸拾到各路前辈高人的秘笈,终于打通任督二脉,记录在案以便日后查阅。请自行联系原作者