暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

我终于把 CSS Position 定位弄清楚了

前端新世界 2022-02-16
791
喜欢就关注我们吧


如果你想真正地擅长CSS,那么对CSS position
属性的理解就非常重要。但是,对于初学者来说,这可能是难点之一。

本文将为大家介绍CSS的position
属性,以帮助大家轻松学习CSS position
属性的每个值是如何工作的,从而真正擅长CSS。

要了解position
属性和关联的值,我们首先需要确保我们了解元素在网页上是如何定位的。

流式布局

元素在页面上默认的定位布局方式是流式布局。默认情况下,这就是元素在页面上显示的方式。基本上,HTML文档流是页面上所有协同工作的元素的集合。

CSS将每个HTML元素都视为盒子,你可能已经听说过这种被称为盒子模型的盒子。默认情况下,块级元素(例如标题,段落或div
之类的东西)从新行开始,而内联元素(图像或span
)与周围的内容位于同一行。这种方式下元素的默认布局称为文档的默认流式布局,但是CSS在position
属性中为我们提供了一个功能强大的工具来覆盖默认流式布局。

首先让我们看看position
属性的作用。

position属性

CSS position
属性设置如何在文档中定位元素。我们可以用它来确定如何根据给position属性提供的值来定位各个元素。

position属性有五个值。

Static
Relative
Absolute
Fixed
Sticky

本文将涵盖所有这5个值,但是在此之前,我们需要了解placement
属性以及这个属性是如何影响定位的。

placement属性

就其本身而言,position
属性并没有多大作用。我们需要使用placement
属性(并非官方称谓哦)精确地告诉文档应该将元素放置在何处。为此有四个主要属性。

Top
Left
Right
Bottom

每一个属性都定义了元素的位置应从其默认值调整多少,以及往哪个方向调整。

position属性值

静态定位

静态定位是position
属性的默认值。即页面上的元素按默认布局流预期的顺序显示。placement
属性top
left
bottom
right
不会影响具有position: static
的元素。

position
属性设置为static
通常也很有用,即使这就是position
属性的默认值。例如当你想覆盖在其他位置设置的position
值时,可能就会需要执行此操作。

下面有一个例子可以说明position static
对具有此属性的元素没有影响。

<div class="parent-box">
  <div class="box-original">
    <div class="box-1"> </div>
  </div>

  <div class="box-original">
    <div class="box-2"> </div>
  </div>

  <div class="box-original">
    <div class="box-3"> </div>
  </div>
</div>

在上面的示例中,一个具有box-original
类的父容器中包含三个div

让我们在box-2
类中添加position: static
,并且给top
left
设置一些值。

.box-2 {
  position: static;
  top10px;
  left10px;
  border1px solid black;
  background-color: mediumpurple;
  width100px;
  height100px;
  text-align: center;
  display: inline-block;
  align-self: center;
  margin-left: -1px;
  margin-top: -1px;
}

以下是设置完成后的结果:

看到了没?即使我们使用了position
属性和placement
值,对元素也没有影响。所以,static
值是默认值,并且placement
值不影响具有position: static
的元素。

那么,现在让我们看一下会影响元素在文档流中位置的第一个值。

相对定位

相对位置是指元素在常规布局流中相对于其原始位置进行定位。仅将元素设置为position: relative
不会发生任何变化。我们需要使用placement
属性来更改元素相对于其原始位置如何定位。

基本上,当你将HTML元素设置为position: relative
时,它将保留在布局流中。但是,通过使用placement
属性,你可以移动元素。让我们通过一个例子来加深对相对定位的理解。

我们用position: relative
替换position: static

.box-2 {
  position: relative;
  top10px;
  left10px;
  border1px solid red;
  background-color: mediumpurple;
  width100px;
  height100px;
  text-align: center;
  align-self: center;
  margin-left: -1px;
  margin-top: -1px;
}

更改后的结果如下:

你可以看到紫色正方形元素相对于其最初放置的灰色正方形而定位。在上面的示例中,它原本在常规布局流中的位置应该是距顶部10px
,距左侧10px
。但是,元素保留在文档的常规布局流中,并且相对于其原始位置应用了偏移。在继续讨论其他position
值时,请务必记住这一点。

绝对定位

绝对定位的元素将从常规文档流中删除,并且该元素最初占用的空间不再为该元素保留。

当元素被赋予position: absolute
时,所有其他元素的行为就像该元素不再在文档中一样。因此,在页面布局中没有为该元素保留的空间。如此一来,这就成为了移动HTML元素的强大工具。

有一个重点也是难点,具有position: absolute
的元素相对于其最近位置的祖先元素进行定位。这意味着要使绝对定位正常工作,父元素必须具有除默认static
值以外的position
属性值。

这是要注意的关键点,因为如果最接近的父元素不具有position
属性,则具有绝对位置的元素将相对于下一个具有position
属性值的父元素进行定位。如果没有元素有position属性值,则元素将相对于html
viewport
元素定位。如果不知道这一点就在文档中定位元素,则会引起很多麻烦。

通过使用placement
属性,我们可以像其他任何CSS position属性一样移动绝对定位的元素。通过top
left
bottom
right
属性,可以确定在具有默认position: static
以外的position属性的层次结构中,元素相对于第一个父元素的放置位置。

让我们回过头再看例子。现在,我们将第二个box
元素的position属性更改为position: absolute
。在查看更改后的结果之前,先检查一下parent-box
元素的位置。

.box-2 {
  position: absolute;
  top30px;
  left150px;
  border1px solid red;
  background-color: mediumpurple;
  width100px;
  height100px;
  text-align: center;
  align-self: center;
  margin-left: -1px;
  margin-top: -1px;
}

更改后的结果如下:

这里你可以看到在文档中没有为该元素创建任何空间。实际上,空间已经瓦解,其他元素表现得就像这个元素甚至不在页面上一样。这正是因为该元素现在相对于父box元素而定位。

固定位置

固定定位的工作原理与absolute定位类似,从常规文档流中删除,并且元素原来所占用的空间不再为该元素保留。

固定定位的元素相对于视口定位。这意味着当你向下滚动页面时,该元素将保留页面上的原始位置。这通常用于导航栏,这样无论用户在页面上的何处滚动,导航栏保持在页面顶部始终可见。

我们将box-2
的位置从position: absolute
更改为position: fixed
。我们还将将top
属性的值更改为0
并删除left
属性值。再添加其他的一些边框,以便在滚动时显示效果。

.box-2 {
  position: fixed;
  top0px;
  border1px solid red;
  background-color: mediumpurple;
  width100px;
  height100px;
  text-align: center;
  align-self: center;
  margin-left: -1px;
  margin-top: -1px;
}

更改后的结果如下:

正如从示例中看到的,紫色框元素现在固定在页面顶部,就像构建了导航栏一样。这是因为我们将position
属性设置为fixed
,并将其从页面的top
设置为0。

当使用具有fixed
值的CSS position属性时,需要特别注意的是,它会占用用户停留页面的整个时间中所指定的视口空间。这可能会影响用户体验,尤其是在屏幕空间有限的移动设备上。因此,使用时要慎重。

粘性定位

粘性定位值根据文档的常规流进行定位,混合了relative定位和fixed定位。也就是说,在页面到达设置的滚动点之前,它都将充当相对定位的元素,之后再充当fixed定位元素。

看一个新示例,当元素到达页面上的某个位置时,它会变为fixed定位元素。我们将为dt
标签赋予position
sticky
,并为属性top
赋予3px
的值,这意味着距页面顶部3px。

dt {
  background#007FFF;
  border-bottom1px solid yellow;
  border-top1px solid yellow;
  color: yellow;
  margin0;
  padding2px 0 0 12px;
  position: sticky;
  top: -1px;
}

下面就是粘性定位的效果:

在上面的示例中,你可以看到dt
标签(蓝色的)一直停留在页面上直到下一个dt
标签到达为止。一旦到达这个点,下一个dt
标签将变为粘性元素。因此,dt
元素定位在页面的常规流中,但是如果在滚动时到达其位置,则位置将变为固定。然后会一直保持在该位置上,直到随着滚动下一个dt
标签占据固定位置为止。

小心sticky
定位属性,因为到写这篇文章的时候为止,并不是所有浏览器都支持这个属性。

使用z-index

z-index
是一种CSS属性,可用于设置定位元素的z
顺序。这意味着,你使用除static
以外的其他position
属性值设置的任何元素都可以沿着z-index
平面放置。

基本上,z-index
可用于控制这些元素的排序方式以及如何相互重叠。所以本质上,是由你决定哪些元素应该出现在前面,哪些元素应该出现在后面。

具有较大z-index
属性值的元素显示在具有较小z-index
属性值的元素前面。

让我们看下面的示例,我将展示HTML顺序以便说明,如果我们使用z-index
,则顺序无关紧要,我们可以从前到后确定它们的位置。

<div class="parent-box">

    <div class="box box-1">z-index:4</div>
    <div class="box box-2">z-index:1</div>
    <div class="box box-3">z-index:2</div>
    <div class="box box-4">z-index:5</div>
    <div class="box box-5">z-index:3</div>

</div>

然后,我们为每个box
类赋予fixed
,这就允许我们更改每个box
元素的z-index
。这样做的结果如下所示:

从结果中可以看到,大的z-index
元素在前面,小的z-index
元素在后面。

结论

总结一下,CSS position属性是一个功能强大的工具,允许我们通过确定元素如何在页面上放置来更改文档的常规布局流。

其中你需要用到5个position属性。

  • Static
  • Relative
  • Absolute
  • Fixed
  • Sticky

你可以通过使用top
left
bottom
right
属性和指定元素应移动多少距离来设置元素的位置。

你也可以在z-index
上设置元素的位置,如果为元素提供了position
属性值(默认static
除外)的话。值越大显示在越前面,值越小显示在越后面。

最后说一句,要想彻底掌握CSS position属性,只靠自己多用多练。感谢阅读。

每日分享前端插件干货,欢迎关注!

点赞和在看就是最大的支持❤️

文章转载自前端新世界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论