CSS基础之position


position

用于指定一个元素在文档中的定位方式。toprightbottomleft 属性则决定了该元素的最终位置。

定位类型

  • 定位元素(positioned element)是其计算后位置属性为 relative, absolute, fixedsticky 的一个元素(换句话说,除static以外的任何东西)。
  • 相对定位元素(relatively positioned element)是计算后位置属性为 relative的元素。
  • 绝对定位元素(absolutely positioned element)是计算后位置属性为 absolutefixed 的元素。
  • 粘性定位元素(stickily positioned element)是计算后位置属性为 sticky 的元素。

取值

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./index.css">
  <style>
    /* 便于观察固定定位和粘性定位元素(fixed、sticky) */
    body {
      height: 2000px;
    }
  </style>
</head>

<body>
  <div class="wrapper">
    <span class="box"></span>
    <span class="box" id="target"></span>
    <span class="box"></span>
  </div>
</body>

</html>

static

该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时 top, right, bottom, leftz-index属性无效。

.wrapper {
  width: 400px;
  height: 200px;
  border: 1px solid #000;
}
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  border: 5px solid #000;
  margin-right: 10px;
}
#target {
  border-color: #f00;
}

relative

该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。

.wrapper {
  width: 400px;
  height: 200px;
  border: 1px solid #000;
}
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  border: 5px solid #000;
  margin-right: 10px;
}
#target {
  /* 设置 position 属性为 relative */
  position: relative;
  top: 50px;
  left: 50px;
  border-color: #f00;
}

relative 是相对正常文档流的位置进行偏移,原先占据的位置依然存在,也就是说它不会影响后面元素的位置。当left和right同时存在,仅left有效,当top和bottom同时存在仅top有效。relative的偏移是基于自身元素的margin左上侧的。

absolute

元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。

.wrapper {
  position: absolute;
  top: 50px;
  left: 50px;
  /* width: 400px; */
  height: 200px;
  border: 5px solid #00f;
}
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  border: 5px solid #000;
  margin-right: 10px;
}
#target {
  /* 设置 position 属性为 absolute */
  position: absolute;
  top: 50px;
  left: 50px;
  border-color: #f00;
}

当把一个元素 position 属性设置为 absolute 的时候,会发生三件事:

  1. 把该元素往 Z 轴方向移了一层,元素脱离了普通流,所以不再占据原来那层的空间,还会覆盖下层的元素
  2. 元素将变为块级元素,相当于给该元素设置了 display: block;(给一个内联元素,如 <span> ,设置 absolute 之后发现它可以设置宽高了)。
  3. 如果该元素是块级元素,并且没有手动设置宽度,那么元素的宽度由原来的 width: 100%(占据一行),变为了 auto

如果父元素设定了margin,border,padding等属性,那么这个定位点将忽略padding,将会从padding开始的地方(即只从padding的左上角开始)进行定位,这与我们会想当然的以为会以margin的左上端开始定位的想法是不同的。

fixed

元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transform, perspectivefilter 属性非 none 时,容器由视口改为该祖先。

.wrapper {
  width: 400px;
  height: 200px;
  border: 1px solid #000;
}
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  border: 5px solid #000;
  margin-right: 10px;
}
#target {
  /* 设置 position 属性为 fixed */
  position: fixed;
  top: 50px;
  left: 50px;
  border-color: #f00;
}

同 position

sticky

元素根据正常文档流进行定位,然后相对它的最近滚动祖先(nearest scrolling ancestor)containing block (最近块级祖先 nearest block-level ancestor),包括table-related元素,基于top, right, bottom, 和 left的值进行偏移。偏移值不会影响任何其他元素的位置。

该值总是创建一个新的层叠上下文(stacking context)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflowhidden, scroll, auto, 或 overlay时),即便这个祖先不是最近的真实可滚动祖先。这有效地抑制了任何“sticky”行为。

.wrapper {
  width: 400px;
  height: 200px;
  border: 1px solid #000;
}
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  border: 5px solid #000;
  margin-right: 10px;
}
#target {
  /* 设置 position 属性为 sticky */
  position: sticky;
  top: 50px;
  left: 50px;
  border-color: #f00;
}

inherit

规定应该从父元素继承 position 属性的值

.wrapper {
  position: absolute;
  top: 50px;
  left: 50px;
  width: 400px;
  height: 200px;
  border: 5px solid #00f;
}
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  border: 5px solid #000;
  margin-right: 10px;
}
#target {
  /* 设置 position 属性为 inhreit 
     该例即为 position: absolute;
    */
  position: inhreit;
  border-color: #f00;
}

参考

MDN-position

CSS之position详解


评论
 上一篇
CSS基础之flex/grid CSS基础之flex/grid
这篇文章内容来自阮一峰的Flex 布局教程:语法篇和CSS Grid 网格布局教程,在一些微小的地方添加了一些注意事项。写这篇的目的是为了方便自己回顾,所以将图片去掉了,如果想更方便的学习推荐去阮老师的博客。 flex基本概念采用 Fl
2020-08-23
下一篇 
JavaScript基础之原型/继承 JavaScript基础之原型/继承
原型定义 所有的引用类型的数据都有 __proto__ 这个属性,该属性即为隐式原型,所有的函数都有 prototype 属性,该属性即为显式原型。 这两个属性分别是什么?有什么联系? prototype我们从原型的定义上知道所有的函数都
2020-08-19
  目录