CSS 定位体系概述
三种定位体系简介
框( box )布局影响因素之一,便是定位体系。定位体系也是其最为重要的影响因素。
CSS2.1 中,一个框可以根据三种定位体系布局。CSS2.1 中的定位体系帮助作者使他们的文档更容易理解,并不需要使用标记的手段(如,不可见的图片)达到布局的效果。
常规流( Normal flow )
常规流,是对 "normal flow" 的直译。
之称之为常规流,是因为这是相对于后面的浮动和绝对定位的一个概念,浮动和绝对定位元素都脱离了当前的常规流。
在 CSS2.1中,常规流包括块框( block boxes )的块格式化( block formatting ), 行内框( inline boxes )的行内格式化( inline formatting ),块框或行内框的相对定位,以及插入框的定位。
浮动( Floats )
浮动,顾名思义,相对于常规流来讲,它漂浮在常规流的上方。
在浮动模型中,一个框( box )首先根据常规流布局,再将它从流中取出并尽可能地向左或向右偏移。内容可以沿浮动区的侧面排列。 因为它首先要根据常规布局后才偏移,所以效率较常规流低。
用 'float' 特性声明浮动,特性值可以是:"none"、"left"、"right"。
绝对定位( Absolute positioning )
在绝对定位模型中,一个框整个地从常规流中脱离(它对后续的兄弟元素没有影响),并根据它的包含块1来分配其位置。
注:
- 关于包含块的概念,请参见: W3Help - KB008: 包含块( Containing block )
选择定位方案:'position' 特性
'float' 和 'position' 特性决定了使用哪种 CSS2.1 定位算法来计算框的位置。
'position' 特性介绍表:
| 值 | static | relative | absolute | fixed | inherit |
| 初始值 | static |
| 适用于 | 所有元素 |
| 可否继承 | 否 |
| 百分比值 | N/A |
| 计算值 | 同设定值 |
特性值的含义
static
该框是一个常规框,布局根据常规流。'left' 、'right'、'bottom' 和 'top' 属性不适用。
relative
框的位置根据常规流计算(被称为常规流中的位置)。然后框相对于它的常规位置而偏移。如果框 B 是相对定位的,其后框的定位计算并不考虑 B 的偏移。 table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, 和 table-caption 元素的 'position:relative' 效果没有被定义。
示例代码:
<div style="position:static; width:100px;">
<div id="A" style="">A</div>
<div id="B" style=" position:relative; top:70px; left:50px; ">B</div>
<div id="C" style="">C</div>
</div>
根据标准,B 的位置应该相比自身原位置偏移,而 C 在放置的时候,会认为 B 仍然在原位置。
示意图: 
注意,相对定位的元素处于常规流中,没有脱离常规流。
absolute
框的位置(可能还有它的尺寸)是由'left','right','top'和'bottom'特性决定。这些特性指定了框相对于它包含块1的偏移量。 绝对定位的框从常规流向中脱离。这意味着它们对其后的兄弟元素的定位没有影响。另外,尽管绝对定位框有外边距(margin), 它们不会和其它任何外边距发生折叠(Collapsing margins)2。
示例代码:
<div style="position:absolute; width:300px; border:2px solid yellow;">
<div id="A" style=" height:50px;">A</div>
<div id="B" style="position:absolute; top:70px; left:50px; height:50px; ">B</div>
<div id="C" style=" height:50px;">C</div>
</div>
示意图:

fixed
框位置的计算根据 'absolute' 模型,不过框要额外地根据一些参考而得到固定。跟绝对定位一样,固定定位元素的外边距不会和任何其他外边距发生折叠。
应用于手持终端、投影设备、屏幕、TTY、电视媒体类型时,框相对于可视窗口3固定,滚动时不移动。应用于打印媒介类型时,框被渲染于每一页,
并相对于页框固定,就好象是通过可视窗口查看该页一样(例如,打印预览)。对于其他的媒介类型,表现没有被定义。
对根元素的 'position',用户端(UA)可以视为 "static"。
注:
- 关于包含块的概念,请参见: W3Help - KB008: 包含块( Containing block )
- 关于外边距折叠,请参见 W3Help - KB006: CSS 框模型( Box module ) 的外边距折叠部分。
- 既 viewport,请见 W3Help - KB007: 可视化格式模型( visual formatting model )简介 的视口( viewport )部分。
框偏移: 'top','right','bottom','left'
如果一个元素的 'position' 特性值不是 "static",该元素被称为定位元素。定位的元素生成定位框,其定位基于四个特性:'top','right','bottom','left'。
| 值 | 这四个特性的值1可以是: <length> | <percentage> | auto | inherit 之一
|
| 初始值 | auto |
| 适用于 | 定位的元素,即 'position' 特性的值为非 "static" 的元素。 |
| 可否继承 | 否 |
| 百分比值 | 百分比值基于包含块的高度(top, bottom)或者宽度(left, right) |
| 计算值 | 对于 "position:relative" 参见相对定位;对于 "position:static" 取值 "auto"; 其他情况,如果值为长度,取相应的绝对长度,如果标值为百分比,取指定的值,否则,取 "auto"。 |
| 定位作用的具体位置 | 对于绝对定位元素( absolutely positioned )的框,这四个特性的值表示,元素的外边界( margin 边界)相对于 包含块 的边界的位移。而对于相对定位元素( relatively positioned )的框,偏移量相对于它自己的相应的边界。比如,top 是相对于它的顶边界,right 相对于右边界。 |
注:
- 关于特性的值,请参见: W3Help - KB002: CSS 特性和值
'display'、'position' 和 'float' 的相互关系
总流程图:

转换对应表:
| 设定值 | 计算值 |
|---|---|
| inline-table | table |
| inline, run-in, table-row-group, table-column, table-column-group, table-header-group, table-footer-group, table-row, table-cell, table-caption, inline-block |
block |
| 其他 | 同设定值 |
这一节是为了调和三种布局和框形成的关键特性( display )之间的关系而设。总的来说,可以把它看作是一个类似优先级的机制,
"position:absolute" 和 "position:fixed" 优先级最高,有它存在的时候,浮动不起作用,'display' 的值也需要调整;
其次,元素的 'float' 特性的值不是 "none" 的时候或者它是根元素的时候,调整 'display' 的值;
最后,非根元素,并且非浮动元素,并且非绝对定位的元素,'display' 特性值同设置值。
这从另一个侧面说明了一个问题:浮动或绝对定位的元素,只能是块元素或表格。
1. 'display' 的值为 'none'
如果 'display' 的值为 'none',那么 'position' 和 'float' 不起作用。在这种情况下,元素不产生框。因此浮动和定位无效。
2. 'position' 的值是 'absolute' 或 'fixed'
否则,如果 'position' 的值是 'absolute' 或 'fixed',框就是绝对定位的,'float' 计算后的值应该是 'none',并且,'display' 会被按照下表设置。
框的位置将由 'top','right','bottom' 和 'left' 属性和该框的包含块确定。
也就是说,当元素是绝对定位时,浮动失效,'display' 会被按规则重置。
示例代码:
<script type="text/javascript">
function getStyle(obj, style) {
var _style = (style == "float") ? "styleFloat" : style;
return document.defaultView ? document.defaultView.getComputedStyle(obj, null).getPropertyValue(style) : obj.currentStyle[_style.replace(/-[a-z]/g, function() {
return arguments[0].charAt(1).toUpperCase();
})];
}
window.onload = function() {
document.getElementById("info").innerHTML = "float : " + getStyle(document.getElementById("test"), "float") +
"<br/>display : " + getStyle(document.getElementById("test"), "display");
}
</script>
<div id="test" style="position:absolute; float:left; display:inline;"></div>
<div id="info"></div>
上面代码中有一个既是绝对定位又是浮动的元素,以上代码可取出其 'display' 和 'float' 的计算值1。
IE 中,'float' 值和 'display' 的特性值未发生变化,还是 "float: left; display: inline"。
其他浏览器中计算后的结果是:"float: none; display: block"。
3. 'float' 的值不是 "none"
如果 'float' 的值不是 "none",该框浮动并且 'display' 会被按照转换对应表设置。
<!DOCTYPE html>
<script type="text/javascript">
function getStyle(obj, style) {
var _style = (style == "float") ? "styleFloat" : style;
return document.defaultView ? document.defaultView.getComputedStyle(obj, null).getPropertyValue(style) : obj.currentStyle[_style.replace(/-[a-z]/g, function() {
return arguments[0].charAt(1).toUpperCase();
})];
}
window.onload = function() {
document.getElementById("info").innerHTML = "display : " + getStyle(document.getElementById("test"), "display");
}
</script>
<span id="test" style="width:100px; height:100px; border:1px solid red; float:left;">float span</span>
<div id="info"></div>
按照规则,SPAN 是行内元素,因此不能够设置其宽度和高度。但是浮动后,'display' 值按照转换对应表设置后,成为块级元素。
IE 中截图:

其他浏览器中:

4. 元素是根元素
如果元素是根元素,'display' 的值按照转换对应表设置。
5. 否则,应用指定的 'display' 特性值。
CSS 定位体系概述的更多相关文章
- CSS 定位 (Positioning)概述
div.h1 或 p 元素常常被称为块级元素. 这意味着这些元素显示为一块内容,即“块框”. 与之相反,span 和 strong 等元素称为“行内元素”,这是因为它们的内容显示在行中,即“行内框”. ...
- CSS中的定位体系
一.概述 1.什么是定位体系 视觉格式化模型规定,定位体系共有三种 a.常规流(normal flow) b.浮动(float) ...
- CSS定位(CSS定位概述、相对定位、绝对定位、浮动)
CSS 定位属性 CSS 定位属性允许你对元素进行定位. 属性 描述 position 把元素放置到一个静态的.相对的.绝对的.或固定的位置中. top 定义了一个定位元素的上外边距边界与其包含块上边 ...
- html5--6-33 CSS定位是什么
html5--6-33 CSS定位是什么 一.总结 一句话总结: 1.常规文档流是一套体系,浮动是另外一套体系. 2.标签清除浮动之后会跑到常规文档流它本来的地方. 3.浮动是否占据常规文档流:应该不 ...
- CSS定位——浮动定位
CSS定位机制Ⅱ——浮动定位 float属性:进行浮动定位 left,right clear属性:清除浮动 left,right,both ㈠ float属性 1.概述 ⑴div实现横向多 ...
- web前端学习(三)css学习笔记部分(2)-- css定位+盒子操作
3.CSS定位 3.1定位 1.CSS定位: 改变元素在页面上的位置 2.CSS定位机制 普通流:元素按照其在HTML中的位置顺序决定排布的过程 浮动 绝对布局 属性 描述 position 把元素放 ...
- 【CSS进阶】CSS 颜色体系详解
说到 CSS 颜色,相比大家都不会陌生,本文是我个人对 CSS 颜色体系的一个系统总结与学习,分享给大家. 先用一张图直观的感受一下与 CSS 颜色相关大概覆盖了哪些内容. 接下来的行文内容大概会按照 ...
- css定位
文档流 所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素.脱离文档流即是元素打乱了这个排列,或是从排版 ...
- 常用的CSS定位,XPath定位和JPath定位
CSS定位 举例 描述 div#menu id为menu的div元素 div.action-btn.ok-btn class为action-btn和ok-btn的div元素 table#emailLi ...
随机推荐
- NRF52811-QCAA 蓝牙5.1芯片资料解析
为了满足市场需求Nordic 宣布推出nRF52811系统级芯片(SoC),这个全功能无线连接解决方案支持蓝牙5.1 测向(Direction Finding)功能和一系列流行低功耗无线协议,用于智能 ...
- 2 ~ express ~ 模板引擎的配置与使用
一,创建应用 (一),创建应用,监听端口 var express = require('express') // 创建app应用 var app = express() app.listen(3000 ...
- 短网址资料-nginx非root用户启动-systemctl启动脚本-分割root权限
https://www.cnblogs.com/aspnethot/articles/3492191.htmlhttps://www.cnblogs.com/aspnethot/articles/34 ...
- django-替代为自定义的User model
https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model Subs ...
- Fiddler 自动响应
使用目的:提前设置接口返回规则 便于前端联调 不用每次断点修改数据 操作:
- VS2013的工程移植到VS2008
VS2013的工程完成后,用VS2008创建一个名称一样的工程(大小写也一样). 具体过程参考http://blog.csdn.net/sz76211822/article/details/42775 ...
- 14. react 基础 redux 的编写 TodoList 功能
1. 安装 redux 监听工具 ( 需要翻墙 ) 打开 谷歌商店 搜索 redux devtool 安装第一个即可 2. 安装 redux yarn add redux 3. 创建 一个 store ...
- phpmyadmin拿网站shell
开门见山 1. 找到一个赌博网站,发现存在php探针界面,在下面输入密码尝试用弱口令进行连接,尝试是否成功 失败的结果是这样. 2. 成功! 3. 连接成功的,点击phpMyAdmin管理,进行弱口令 ...
- import torch 报错
1.进入官网 https://pytorch.org/ 2.复制command到anaconda环境,即可
- MySQL--基础SQL--DML
1.插入记录 INSERT INTO tablename (fields1, fields2, ..., fieldsn) VALUES (value1, value2, ..., valuen) 例 ...
对于绝对定位元素( absolutely positioned )的框,这四个特性的值表示,元素的外边界( margin 边界)相对于 包含块 的边界的位移。