> For the complete documentation index, see [llms.txt](https://lewiszlw.gitbook.io/notebooks/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lewiszlw.gitbook.io/notebooks/blogs/history/css-ding-wei.md).

# CSS定位

定位的基本思想很简单，它允许你定义元素框相对于其正常位置应该出现的位置，或者相对于父元素、另一个元素甚至浏览器窗口本身的位置。

## CSS定位概述

### 一切皆为框

div、h1 或 p 元素常常被称为块级元素。这意味着这些元素显示为一块内容，即“**块框**”。与之相反，span 和 strong 等元素称为“行内元素”，这是因为它们的内容显示在行中，即“**行内框**”。

可以使用 display 属性改变生成的框的类型。这意味着，通过将 display 属性设置为 block，可以让行内元素（比如 \<a> 元素）表现得像块级元素一样。还可以通过把 display 设置为 none，让生成的元素根本没有框。这样的话，该框及其所有内容就不再显示，不占用文档中的空间。

但是在一种情况下，即使没有进行显式定义，也会创建块级元素。这种情况发生在把一些文本添加到一个块级元素（比如 div）的开头。即使没有把这些文本定义为段落，它也会被当作段落对待：

```html
<div>
some text
<p>Some more text.</p>
</div>
```

在这种情况下，这个框称为**无名块框**，因为它不与专门定义的元素相关联。

### CSS定位机制

CSS 有三种基本的定位机制：普通流、浮动和绝对定位。

除非专门指定，否则所有框都在普通流中定位。也就是说，普通流中的元素的位置由元素在 (X)HTML 中的位置决定。

块级框从上到下一个接一个地排列，框之间的垂直距离是由框的垂直外边距计算出来。

行内框在一行中水平布置。可以使用水平内边距、边框和外边距调整它们的间距。但是，垂直内边距、边框和外边距不影响行内框的高度。由一行形成的水平框称为**行框（Line Box）**，行框的高度总是足以容纳它包含的所有行内框。不过，设置行高可以增加这个框的高度。

### CSS position属性

position 属性规定元素的定位类型。

说明： 这个属性定义建立元素布局所用的定位机制。任何元素都可以定位，不过绝对或固定元素会生成一个块级框，而不论该元素本身是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。

position属性值

* static：默认值。没有定位，元素出现在正常的流中（忽略 top, bottom, left, right 或者 z-index 声明）。元素框正常生成。块级元素生成一个矩形框，作为文档流的一部分，行内元素则会创建一个或多个行框，置于其父元素中。
* relative：元素框偏移某个距离。元素仍保持其未定位前的形状，它原本所占的空间仍保留。
* absolute：元素框从文档流完全删除，并相对于其包含块定位。包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭，就好像元素原来不存在一样。元素定位后生成一个块级框，而不论原来它在正常流中生成何种类型的框。相对于 static 定位以外的第一个父元素进行定位。
* fixed：元素框的表现类似于将 position 设置为 absolute，不过其包含块是视窗本身。
* inherit：规定应该从父元素继承 position 属性的值。

注意：相对定位实际上被看作普通流定位模型的一部分，因为元素的位置相对于它在普通流中的位置。

JavaScript 语法： object.style.position="absolute"

CSS定位属性：

* position 把元素放置到一个静态的、相对的、绝对的、或固定的位置中。
* top 定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
* right 定义了定位元素右外边距边界与其包含块右边界之间的偏移。
* bottom 定义了定位元素下外边距边界与其包含块下边界之间的偏移。
* left 定义了定位元素左外边距边界与其包含块左边界之间的偏移。
* overflow 设置当元素的内容溢出其区域时发生的事情。
* clip 设置元素的形状。元素被剪入这个形状之中，然后显示出来。
* vertical-align 设置元素的垂直对齐方式。
* z-index 设置元素的堆叠顺序。

## CSS相对定位

如果对一个元素进行相对定位，它将出现在它所在的位置上。然后，可以通过设置垂直或水平位置，让这个元素“相对于”它的起点进行移动。

例如：

```css
#box_relative{
		position: relative;
		left: 30px;
		top: 20px;
}
```

效果： ![CSS定位1](http://ofolh8dcq.bkt.clouddn.com/CSS%E5%AE%9A%E4%BD%8D1.PNG)

## CSS绝对定位

设置为绝对定位的元素框从文档流完全删除，并相对于其包含块定位，包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭，就好像该元素原来不存在一样。元素定位后生成一个块级框，而不论原来它在正常流中生成何种类型的框。

绝对定位使元素的位置与文档流无关，因此不占据空间。这一点与相对定位不同，相对定位实际上被看作普通流定位模型的一部分，因为元素的位置相对于它在普通流中的位置。

例如：

```css
#box_absolute{
		position: absolute;
		left: 30px;
		top: 20px;
}
```

效果： ![CSS定位2](http://ofolh8dcq.bkt.clouddn.com/CSS%E5%AE%9A%E4%BD%8D2.PNG)

绝对定位的元素的位置相对于最近的已定位祖先元素，如果元素没有已定位的祖先元素，那么它的位置相对于最初的包含块。通俗地讲，用绝对定位时，父元素要求有position属性才行，否则将依据父的父，父的父的父，......，直至body。

注意：因为绝对定位的框与文档流无关，所以它们可以覆盖页面上的其它元素。可以通过设置 z-index 属性来控制这些框的堆放次序。

z-index定义和用法： z-index 属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。 说明： 该属性设置一个定位元素沿 z 轴的位置，z 轴定义为垂直延伸到显示区的轴。如果为正数，则离用户更近，为负数则表示离用户更远。 注释： 元素可拥有负的 z-index 属性值。Z-index 仅能在定位元素上奏效（例如 position:absolute;）！

***

> 参考文档：[www.w3school.com.cn](http://www.w3school.com.cn/css/css_positioning.asp)
