绝对定位、相对定位、固定定位:它们有什么区别?

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。从 免费赠送 200 美元! 开始吧。

让我们聊聊 position 属性。我知道初学者对此很感兴趣。我最近收到了一个问题。

我刚开始接触网页设计,还没有掌握元素定位的不同之处。我知道有absolutefixedrelative。还有其他方法吗?它们之间有很大的区别吗?什么时候应该使用哪种方法?

简短回答

还有两种:static,这是默认值,以及sticky,它是一个非常花哨的东西。是的,所有这些都有很大不同!它们都非常有用,您应该使用哪一个当然取决于预期结果。

更详细的回答

首先要理解的一个重要概念是,网页上的每个元素都是一个块。从字面上讲,它是一个像素矩形。当您将元素设置为display: block;或元素默认情况下是块级元素(如<div>)时,这一点很容易理解。这意味着您可以设置widthheight,并且该元素将尊重这些设置。但是,默认情况下为display: inline;的元素(如<span>)也是矩形,它们只是以不同的方式在页面上流动,并尽可能地水平排列。

现在您已经将每个页面元素都想象成一个像素块,我们可以谈论如何使用定位将这些像素块精确地放置在您想要的位置。

.el {
  position: static;
  position: relative;
  position: absolute;
  position: fixed;
  position: sticky;
  position: inherit;
}

static

这是每个页面元素的默认值。不同元素没有不同的定位默认值,它们都以static开始。静态并不意味着什么;它只是意味着元素将按照正常的方式流入页面。您唯一会将元素设置为position: static;的原因是为了强制删除一些超出您控制范围的应用于元素的定位。这种情况很少见,因为定位不会级联。

relative

这种类型的定位可能最令人困惑,使用也最频繁。它的真正含义是“相对于自身”。如果您在元素上设置position: relative;但不设置任何其他定位属性(topleftbottomright),它将不会对它的定位产生任何影响,它将与您将其保留为position: static;时完全一样。但是,如果您确实为它提供了一些其他定位属性,比如top: 10px;,它会将其位置从它正常的位置向下移动 10 个像素。我敢肯定您能想象到,根据元素的常规位置来移动元素的能力非常有用。我发现自己经常使用它来对齐表单元素,这些元素往往不愿意按照我想要的方式对齐。

在元素上设置position: relative;时还会发生另外两件事,您应该注意。一是它引入了对该元素使用z-index的能力,而这在静态定位元素上不起作用。即使您没有设置z-index值,该元素现在也会出现在任何其他静态定位元素的顶部。您无法通过在静态定位元素上设置更高的z-index值来对抗它。

另一件事是它限制了绝对定位子元素的范围。任何作为相对定位元素的子元素的元素都可以被绝对定位在该块内。这带来了一些强大的机会,我在这里讨论过

absolute

这是一种非常强大的定位方式,它允许您将任何页面元素放置在您想要的确切位置。您使用定位属性topleftbottomright来设置位置。请记住,这些值将相对于具有相对(或绝对)定位的下一个父元素。如果不存在这样的父元素,它将默认返回到<html>元素本身,这意味着它将相对于页面本身进行定位。

绝对定位的权衡(也是最重要的是要记住的)是这些元素从页面上元素的流中移除。具有这种定位类型的元素不受其他元素的影响,并且它也不影响其他元素。在每次使用绝对定位时,这都是一个需要认真考虑的事情。过度使用或不当使用它会限制网站的灵活性。

fixed

一个fixed定位元素相对于视窗(或浏览器窗口本身)进行定位。当窗口滚动时,视窗不会改变,因此固定定位元素在页面滚动时会保持在它所在的位置。

这可能用于导航栏,您希望它始终可见,无论页面的滚动位置如何。固定定位的问题是它会导致固定元素覆盖内容,导致内容无法访问。解决的办法是留出足够的空隙以避免这种情况,以及这样的技巧

sticky

粘性定位非常独特!一个sticky元素会像静态元素一样在那里,但是当您滚动经过它时,如果它的父元素有空间(通常:额外的高度),则粘性元素将表现得好像它是fixed,直到该父元素没有空间为止。用语言表达起来很奇怪,但很容易通过演示看到它发生的过程。