position
属性
position
属性用于指定一个元素在文档中的定位方式。top,right,bottom 和 left
属性则决定了该元素的最终位置。
注意:
行内元素进行绝对定位/固定定位后会变成inline-block元素,所以虽然对外表现的像是块级元素,但还是可以使用行内元素的line-height
属性实现垂直居中。
不论之前什么类型的元素(display:none
除外),
只要设置了position:absolute/fixed、 float中任意一个,都会让元素以display:inline-block
的方式显示
属性值 | 含义 |
---|---|
absolute | 生成绝对定位的元素,不为元素预留空间。 通过指定元素相对于最近的非 static定位祖先元素的偏移,来确定元素位置。(如果所有父元素都没是默认 position 值则绝对定位相对浏览器窗口进行定位)绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。 |
fixed | 生成固定定位的元素,不为元素预留空间。 相对于浏览器窗口进行定位。 元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。 |
relative | 生成相对定位的元素,相对于其正常位置进行定位。 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。 该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)【即会为元素预留空间】 |
static | 默认值。没有定位,元素出现在正常的流中(此时 top, right, bottom, left 和 z-index 属性无效)。 |
sticky | 基本上是相对位置和固定位置之间的混合,其允许定位的元件像它被相对定位一样动作,直到其滚动到某一阈值点(例如,从浏览器窗口顶部10像素)之后它变得固定。 必须指定 top, right, bottom 或 left 四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。常用于定位字母列表的头部元素 |
默认值static
- 该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时
top, right, bottom, left
和z-index
属性无效。
相对定位relative
- 生成相对定位的元素,文档流中将为元素预留空间。
- 相对定位会相对元素的原始位置对该元素进行移动。
top, bottom, left, right
属性
除默认值static
外,其他属性值都要配合使用top, bottom, left, 和 right
属性值来精确指定要将定位元素移动到的位置。
1 | <body> |
1 | body { |
绝对定位absolute
- 使用
position:absolute;
生成绝对定位的元素,它会相对于第一个非static
的父元素进行定位。 - 生成绝对定位的元素,不为元素预留空间。
- 如果所有的父元素都没有显式地定义
position
属性(即全部是默认值),那么所有的父元素默认情况下position
属性都是static
。结果,绝对定位元素会被包含在初始块容器中。这个初始块容器有着和浏览器窗口一样的尺寸,并且<html>
元素也被包含在这个容器里面。简单来说,绝对定位元素会被放在<html>
元素的外面,并且根据浏览器窗口来定位。(可以通过子绝父相来解决这一问题) - 将上面例子中的
position
值改为absolute
:1
position: absolute;
- 绝对定位元素在HTML源代码中,是被放在
<body>
中的,但是在最终的布局里面,它是离浏览器窗口页面的左边界、上边界有30px的距离。(而不是<body>
)
定位上下文(子绝父相)
- 上面的例子绝对定位元素会被放在
<html>
元素的外面,并且根据浏览器窗口来定位。(可以通过子绝父相来解决这一问题) - 可以通过**设置绝对定位元素的其中一个父元素的定位属性为相对定位
relative
**来使得绝对定位元素不相对初始块容器进行定位,比如下面例子中将body的css样式设为position: relative;
就可以使得body中绝对定位的p元素相对body进行定位。(如果不这么做,子元素就会相对body或浏览器定位,产生不好的效果) - 【子绝父相】:我们可以改变定位上下文(绝对定位的元素的相对位置元素)来使绝对元素相对于我们给定的父元素进行定位,而不是相对于浏览器窗口进行定位。也就是**设置绝对定位元素的其中一个父元素的定位属性为相对定位
relative
**,比如:给父元素body
添加css样式:1
position: relative;
z-index
更改堆叠顺序
- 可以通过修改
z-index
属性值更改元素堆叠顺序。 - 我们使用水平(x轴)和垂直(y轴)坐标来讨论网页,以确定像背景图像和阴影偏移之类的东西的位置。(0,0)位于页面(或元素)的左上角,x和y轴跨页面向右和向下(适合从左到右的语言)。
- 网页也有一个z轴:一条从屏幕表面到你的脸的虚线。
z-index
值影响定位元素位于该轴上的位置;正值将它们移动到堆栈上方,负值将它们向下移动到堆栈中。默认情况下,定位的元素都具有z-index
为auto,实际上为0。 - 注意,
z-index
只接受无单位索引值;你不能指定你想要一个元素是Z轴上23像素。较高的值将高于较低的值,但使用2和3将产生与300和40000相同的效果。
例子
- 当出现多个绝对定位元素时,源顺序中排在后面的元素将出现在排在前面的元素的顶部,比如给上面的例子加上下面代码,使得第一段文字也变成绝对定位(之前是只有第二段文字绝对定位):
1
2
3
4
5
6p:nth-of-type(1) {
position: absolute;
background: lime;
top: 10px;
right: 30px;
} - 可以看到第一段文字绿色绝对定位出现在了第一段文字黄色绝对定位的下方。
- 修改
z-index
值,使得第一段文字绿色绝对定位出现在了第一段文字黄色绝对定位的上方,将以下声明添加到p:nth-of-type(1)
规则中:1
z-index: 1;
固定定位fixed
fixed
与absolute
的工作方式完全相同,只有一个主要区别:父元素都是默认position时,absolute
固定元素是相对于浏览器窗口本身的, 但“子绝父相”,当父元素有相对定位时将相对其最近的相对定位祖先来固定元素。而fixed
固定元素则一直是相对于浏览器窗口本身。- 生成固定定位的元素,也不为元素预留空间。
- 这意味着您可以创建固定的有用的UI项目,如持久导航菜单。
粘性定位sticky
sticky
是一个比其他属性要新一些的属性。这基本上是相对位置和固定位置之间的混合,其允许定位的元件像它被相对定位一样动作,直到其滚动到某一阈值点(例如,从浏览器窗口顶部10像素)之后它变得固定。- 粘性定位常用于定位字母列表的头部元素。标示 B 部分开始的头部元素在滚动 A 部分时,始终处于 A 的下方。而在开始滚动 B 部分时,B 的头部会固定在屏幕顶部,直到所有 B 的项均完成滚动后,才被 C 的头部替代。
- 必须指定
top, right, bottom 或 left
四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30<div>
<dl>
<dt>A</dt>
<dd>Andrew W.K.</dd>
<dd>Apparat</dd>
<dd>Arcade Fire</dd>
<dd>At The Drive-In</dd>
<dd>Aziz Ansari</dd>
</dl>
<dl>
<dt>C</dt>
<dd>Chromeo</dd>
<dd>Common</dd>
<dd>Converge</dd>
<dd>Crystal Castles</dd>
<dd>Cursive</dd>
</dl>
<dl>
<dt>E</dt>
<dd>Explosions In The Sky</dd>
</dl>
<dl>
<dt>T</dt>
<dd>Ted Leo & The Pharmacists</dd>
<dd>T-Pain</dd>
<dd>Thrice</dd>
<dd>TV On The Radio</dd>
<dd>Two Gallants</dd>
</dl>
</div>(完整例子)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31* {
box-sizing: border-box;
}
dl {
margin: 0;
padding: 24px 0 0 0;
}
dt {
background: #B8C1C8;
border-bottom: 1px solid #989EA4;
border-top: 1px solid #717D85;
color: #FFF;
font: bold 18px/21px Helvetica, Arial, sans-serif;
margin: 0;
padding: 2px 0 0 12px;
position: sticky;
top: -1px;
}
dd {
font: bold 20px/45px Helvetica, Arial, sans-serif;
margin: 0;
padding: 0 0 0 12px;
white-space: nowrap;
}
dd + dd {
border-top: 1px solid #CCC
}
另一个例子:
1 | <body> |
1 | .samecon h2{ |
如果没有div将h2与p元素框起来则被滚动过去的标题并不会消失。
position
实例
补充:HTML <section>
元素
<section>
元素表示一个包含在HTML文档中的独立部分,它没有更具体的语义元素来表示,一般来说会有包含一个标题。- 例如,导航菜单应该包含在
<nav>
元素中,但搜索结果列表和地图显示及其控件没有特定元素,可以放在<section>
里。 - MDN 关于
<section>
元素
注意:
- 如果元素的内容作为一个独立的有意义的集合,即元素内容可以分为几个部分的话,应该**使用
<article>
**而不是<section>
。 - 不要把
<section>
元素作为一个普通的容器来使用,这本应该是<div>
的用法(特别是当片段(the sectioning )仅仅是为了美化样式的时候)。 - 一般来说,在文档大纲中应该出现**不少于一个
<section>
**。
补充:HTML <article>
元素
<article>
元素表示文档、页面、应用或网站中的独立结构,其意在成为可独立分配的或可复用的结构。如在发布中,它可能是论坛帖子、杂志或新闻文章、博客、用户提交的评论、交互式组件,或者其他独立的内容项目。- 例如: 阅读器在博客上滚动时一个接一个地显示每篇文章的文本,每个帖子将包含在
<article>
元素中,可能包含一个或多个<section>
。 - 每个
<article>
通常包括标题(<h1>
-<h6>
元素)作为<article>
元素的子元素。 - 当
<article>
元素嵌套使用时,则该元素代表与外层元素有关的文章。例如,代表博客评论的<article>
元素可嵌套在代表博客文章的<article>
元素中。 <article>
元素的作者信息可通过<address>
元素提供,但是不适用于嵌套的<article>
元素。<article>
元素的发布日期和时间可通过<time>
元素的pubdate
属性表示,但请注意<time>
的pubdate
属性不再是W3C HTML5
标准。- MDN 关于
<article>
元素
例子1与例子2
1 |
|
例子3
- 复习
<label>
、<aside>
标签的使用方法。 - 复习:
margin与padding属性值数量 | 含义 |
---|---|
4 | 上 右 下 左 |
3 | 上 左右 下 |
2 | 上下 左右 |
1 | 4个方向 |
1 |
|