CSS魔法堂:你一定误解过的Normal flow
前言
刚接触CSS时经常听到看到一个词"文档流",那到底什么是"文档流"呢?然后会看到"绝对定位和浮动定位能脱离文档流",从这句可以看到文档流和绝对定位、浮动定位是同一个范畴的概念,再后来在W3C标准文档找到关于Absolute positioning和Float的内容,却怎么也找不到Document flow(文档流)的资料。后来终于知道是某位大神将Normal flow翻译为文档流而已。。。。。。而我更偏好它的直译"常规流",或直接引用英文名词就好了。
Normal flow到底啥意思啊?
首先我们从名称入手,Normal flow直译为"常规流",我们可以猜想它有以下几个特点:
- 作为默认的定位模式;
- 其他定位模式均以其为基础。
各位都知道与定位系统的CSS属性position:static|relative|absolute|fixed
和float: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>
参与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,且具有以下规则:
- 若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的小弟——Relative positioning
我们可以以Normal flow或Float定位模式作为基础之上再叠加一个相对定位,从而实现更灵活的定位操作。
相对定位的最强武器就是top/right/bottom/left
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的范围,且
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>
总结
若有纰漏,请各位指正
感谢
Relative positioning Visual formatting model details KB010: 常规流( Normal flow ) KB009: CSS 定位体系概述 http://www.css88.com/book/css/properties/layout/display.htm
- iOS textfield实现一行的数字限制,超出进行弹框
- android https安全连接
- 第二章 正则表达式位置匹配攻略
- 从网络上下载省份城市名称并存入文件然后进行读取省份城市
- android 应用模式之mvp
- Android网络请求框架之Retrofit实践
- iOS 跳转到应用所在的App Store市场
- 第一章 正则表达式字符匹配攻略
- js最新手机号码、电话号码正则表达式
- iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了
- Android Service学习之本地服务
- iOS .pch文件的使用
- CountDownTimer说明及使用
- UiTextField对输入的长度进行限制并提示用户还可输入的长度
- HTML 教程
- HTML 简介
- html div 标签介绍
- html span 标签介绍
- html a 超链接标签
- HTML Br换行标签介绍
- HTML P段落标签介绍
- HTML br与p标签区别
- Html H 标题标签
- html px em pt长度单位
- HTML form 标签
- HTML radio 单选框
- HTML B 加粗标签
- HTML strong加粗粗体标签
- HTML em 强调标签
- HTML i 斜体标签
- HTML u下划线标签
- HTML s 删除线标签
- Html img 图片标签
- Html上标注sup与下标注sub标签
- HTML nobr 禁止换行标签
- HTML hr 水平线标签
- HTML label 标签
- HTML input 标签
- HTML textarea 标签
- HTML select下拉列表标签
- HTML checkbox 多选框
- HTML font color 标签
- HTML iframe 框架标签
- HTML Table 表格
- HTML dl dt dd 标签
- HTML ol li有序列表标签
- HTML ul li 无序列表标签
- HTML 注释
- CSS 教程
- CSS 简介
- CSS 语法
- CSS Id 和 Class选择器
- CSS 样式的创建
- CSS background 背景介绍
- CSS 文本样式
- CSS font 字体
- CSS A 链接
- CSS ul ol列表样式
- CSS TABLE 样式
- CSS 框模型
- CSS border 边框
- CSS Outlines 轮廓
- CSS 外边距 Margin
- CSS Padding 内边距
- CSS 分组和嵌套选择器
- CSS 尺寸 (Dimension)
- CSS Display 属性
- CSS Position 定位
- CSS Float 浮动
- CSS 水平对齐(Horizontal Align)
- CSS 组合选择符
- CSS 伪类
- CSS 伪元素
- CSS 导航栏
- CSS 下拉菜单
- CSS 图片廊
- CSS 图像透明/不透明
- CSS sprite 图像拼合技术
- CSS 媒体类型
- CSS 属性选择器
- CSS 实例
- 浅谈Mybatis持久化框架在Spring、SSM、SpringBoot整合的演进及简化过程
- 玩转注册表,这几个windowsAPI函数就够了
- 施工专题第11篇:Python 包和模块使用总结
- Node.js-具有示例API的基于角色的授权教程
- 删库时,我后悔没早学会的数据库知识
- SwiftUI:使自定义类型符合 Comparable 协议
- 【CCF】线性分类器
- 计数二进制子串
- 6个实例详解如何把if-else代码重构成高质量代码
- leetcode201场周赛
- ASP.NET MVC+LayUI视频上传
- Linux执行tar解压报错tar: Error is not recoverable: exiting now
- elasticSearch学习(四)
- 在美帝的服务器的prefetch和aspera下载比较
- 全面介绍eBPF-概念