position属性用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。

position的取值有static、relative、absolute、fixed、sticky,下面我们将对这几个值进行具体介绍。

这里先提一句,下面演示的效果都是在下面这个 demo 基础上修改的。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .container>div {
      width: 100px;
      height: 100px;
      display: inline-block;
    }
    .left {
      background-color: red;
    }
    .middle1, .middle2 {
      background-color: orange;
    }
    .right {
      background-color: green;
    }
  </style>
</head>
<body>
  <div class="container">
    <p>修改前</p>
    <div class="left"></div>
    <div class="middle1"></div>
    <div class="right"></div>
  </div>
  <div class="container">
    <p>修改后</p>
    <div class="left"></div>
    <div class="middle2"></div>
    <div class="right"></div>
  </div>
</body>
</html>

运行结果如下:

# static

static 是HTML元素的默认值,也就是没有定位,将 position 的值设置为 static 的时候,设置 top、right、bottom、left、z-index 无效。

# relative

将 position 的值设置为 relative 时,这个元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置,也就是相对定位是相对其正常位置的。

.middle2 {
  position: relative;
  top: 20px;
  left: 20px;
}

# absolute

当元素的 position 值设置为 absolute 后,元素会被移出正常文档流,并不为元素预留空间,绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html>

.middle2 {
  position: absolute;
  top: 20px;
  left: 20px;
}

上图演示的是 middle2 父元素没有设置定位,给 middle2 设置绝对定位时是相对 html 标签的。

.container {
  position: relative;
}
.middle2 {
  position: absolute;
  top: 20px;
  left: 20px;
}

上图演示的是给 middle2 父元素设置了定位后, middle2 相对于父元素 container 的定位效果。

# fixed

当 position 的值为fixed时,元素会被移出正常文档流,并不为元素预留空间,此时元素的位置相对于浏览器窗口的固定位置,注意:此时即使窗口是滚动的它也不会移动。

# sticky

粘性定位可以被认为是相对定位和固定定位的混合。元素在跨越特定阈值前为相对定位,之后为固定定位。这个值你在开发中可能没用过。下面我们来举个例子,来展示下它的牛x:

在我们开发的过程中有时会遇到上面的需求,当我们将列表滚动到特定的内容时,它的名称需要悬浮到顶部。有可能你是使用 JS 来实现这个功能的,但是当我们知道了 position 的值可以是 sticky 时,只需要使用这个就可以实现我们上面的需求了。

在给出代码前,我们先来复习个简单的标签 dl

<dl> 标签定义了定义列表,它主要用于结合 <dt> (定义列表中的项目)和 <dd> (描述列表中的项目)。

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

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>粘性定位</title>
  <style>
    * {
      box-sizing: border-box;
    }

    dl {
      margin: 0;
      padding: 24px 0 0 0;
    }

    dt {
      background: orange;
      color: #FFF;
      font: bold 18px/21px Helvetica, Arial, sans-serif;
      margin: 0;
      padding: 2px 0 0 12px;
      position: -webkit-sticky;
      position: sticky;
      top: 0px;
    }

    dd {
      font: bold 20px/45px Helvetica, Arial, sans-serif;
      margin: 0;
      padding: 0 0 0 12px;
      white-space: nowrap;
    }

    dd {
      border-top: 1px solid #CCC
    }
  </style>
</head>

<body>
  <div>
    <dl>
      <dt>电视剧</dt>
      <dd>电视剧1</dd>
      <dd>电视剧2</dd>
      <dd>电视剧3</dd>
      <dd>电视剧4</dd>
      <dd>电视剧5</dd>
      <dd>电视剧6</dd>
      <dd>电视剧7</dd>
      <dd>电视剧8</dd>
      <dd>电视剧9</dd>
      <dd>电视剧10</dd>
      <dd>电视剧11</dd>
      <dd>电视剧12</dd>
      <dd>电视剧13</dd>
    </dl>
    <dl>
      <dt>电影</dt>
      <dd>电影1</dd>
      <dd>电影2</dd>
      <dd>电影3</dd>
      <dd>电影4</dd>
      <dd>电影5</dd>
      <dd>电影6</dd>
      <dd>电影7</dd>
      <dd>电影8</dd>
      <dd>电影9</dd>
    </dl>
    <dl>
      <dt>综艺</dt>
      <dd>综艺1</dd>
      <dd>综艺2</dd>
      <dd>综艺3</dd>
      <dd>综艺4</dd>
      <dd>综艺5</dd>
      <dd>综艺6</dd>
      <dd>综艺7</dd>
      <dd>综艺8</dd>
      <dd>综艺9</dd>
      <dd>综艺10</dd>
    </dl>
    <dl>
      <dt>动漫</dt>
      <dd>动漫1</dd>
      <dd>动漫2</dd>
      <dd>动漫3</dd>
      <dd>动漫4</dd>
      <dd>动漫5</dd>
      <dd>动漫6</dd>
      <dd>动漫7</dd>
      <dd>动漫8</dd>
      <dd>动漫9</dd>
      <dd>动漫10</dd>
    </dl>
  </div>
</body>

</html>

参考:

position (opens new window)