所有浏览器中的所有元素都以默认定位值static
开始。您很少会在实际样式表中看到它,因此这个词可能并不熟悉。这也没什么大不了的,这个词本身对理解它的含义并没有什么帮助。您可能会认为它使元素变得粘性,就像您将气球摩擦在头上并粘在墙上一样(静电)。实际上,这意味着元素将像往常一样落入文档流中,这与其他可以将元素从自然文档流中移除的定位值不同。
现在假设您将某个元素处于其默认的静态状态,并将其设置为position: relative;
。会发生什么?仅通过更改/设置该值本身,什么也不会发生。它出现在更改之前完全相同的位置。发生变化的是以下三件事
- 您现在可以使用 top/right/bottom/left 值来微调元素的位置。但是,元素的原始位置仍将被元素占据(就像仍然存在一个原始元素的“幽灵”占用空间)。
- 元素现在将遵循 z-index 属性,该属性控制在重叠情况下哪个元素应该显示在顶部。
- 如果元素具有绝对定位的子元素,则这些子元素现在将相对于此元素绝对定位。
因此,相对定位启用了一些功能和属性,但本身并没有做太多事情。那么,如果所有元素都以position: relative;
而不是position: static;
开始会怎样呢?
优点
如果所有元素都以相对定位开始,那么以上三点您将自然而然地拥有。您的 top/right/bottom/left 值将按您预期的那样开箱即用。Z-index 也“正常工作”。定位上下文始终限制在下一个父元素,这在逻辑上是有道理的。
我认为总体而言,CSS 的可理解性得到了提升。
缺点
最值得注意的是,始终将定位上下文限制在父元素上是有限制的。假设您希望将元素定位在页面右上角,而不管元素在标记中出现的位置。如果元素嵌套在层次结构中,这将很困难。您需要为每个父元素重置该定位上下文。这意味着将它们重置回position: static;
,并在此过程中丢失相对定位的所有好处。=(
如果自然相对位置成为现实,我认为我们需要一种不同的方法来处理定位上下文。可能像
/* Not real code */
#parent-element {
context: inherit | pass | accept;
}
如今的做法
将意味着
* {
position: relative;
}
所以……
这可能不会发生。这将是一个非常糟糕的重大更改,其收益有限/存疑。也很难说我们最终会平均做更多的事情:设置相对位置或重置定位上下文。我只是认为这是一个值得思考的有趣话题。
这是一个有趣的思考。正如您所说,它将消除大多数关于 z-index 不起作用的问题,我知道在我刚开始网页设计时,它本来可以节省我一些时间来思考为什么有些东西不起作用。尝试用这种方式编写一个网站将会很有趣。
我希望我误解了你的意思,但是
position: absolute
难道不应该仍然将某个东西定位在页面的右上角吗?不,它会将其定位在父元素的右上角
.abs{
position: absolute;
right: 0px;
top: 0px;
z-index: 999;}
{div style=”position: relative”}
{div style=”position: relative”}
{div style=”position: relative”}
{div style=”position: relative”}
{div style=”position: static”}
{div class=”abs” }
{/div (X6)}
这样可以吗?对吧?
我没有阅读规范,但是是否允许询问
position: fixed;
的作用?我记得它被用于此类目的……或者它与“absolute”有什么区别?
@ danieldalu position fixed 将元素附加到浏览器窗口。这意味着
.fixed {position:fixed; top:0; right:0;
}即使用户滚动,也将始终显示在窗口的右上角。
@danieldalu
我同意 Jonathan 的观点,fixed position 将使元素保持在顶部,即使鼠标滚动,您也可以看到 stackoverflow 网站的顶部栏
这篇文章使我重新审视了 http://www.w3.org/TR/CSS2/visuren.html#propdef-position
position:relative 的定义不如您提到的三件事清晰。这就像说 CSS 的创建是为了让人们猜测每个 CSS 属性的作用,并自己弄清楚。
我实际上喜欢 CSS 的这一点。它不断提醒我 12 岁时开始学习 HTML 时的情况,并且还在学习如何编写新的编程语言。每天我都会摆弄它,发现 CSS 和 DOM 的新事物,这也很有趣。它就像一个底部没有的魔法宝箱。
有趣的思考
如果这是您的顾虑,
position: fixed
可能会绕过相对父元素。当然,您可能不希望该项目像那样固定在视口中。在大多数移动 WebKit 浏览器(Android、iOS)上,您甚至可以获得 fixed 与 absolute 行为相同的好处(?),这归因于视口实现的方式。(顺便说一句,这让我抓狂)。:P
如果您想同时拥有语义标记蛋糕并吃掉它,也可以使用 JavaScript 将项目移出其相对父元素。
非常有趣的讨论。我认为这指出了 z-index 的一个缺陷。
感谢 Chris。当我第一次学习 CSS 时,这确实让我很困惑。“为什么我需要 position: relative?” 因此您可以绝对定位子元素并使用 z-index。“好吧……为什么我不能默认这样做?”
感谢您的见解。
我宁愿这样做
* {position:relative;}
然后,如果需要,将‘position: static’声明给父元素,或‘z-index:99’…
未经测试的想法:如果您想访问“在相对定位的父元素内部绝对定位到窗口位置”的理论,您不能只使用 javascript 删除元素,然后将其重新附加到 body 吗?样式会保留吗?或者这也需要清除然后重新应用?
现在是凌晨 12:36,我可能对整件事的思考方式都错了,但感谢 Chris 的这篇文章,以及现在大家的不眠之夜!;-)
晚安……我希望如此!
是的,我也这样做……
我宁愿这样做
然后,如果需要,将
position: static
声明给父元素,或z-index:99
…我一直使用此方法来启动我的项目
div、ul、li { position: relative; }
如果其他一些元素需要设置为相对定位,我会手动设置。
这个帖子上面的小笑脸/哭脸图标是什么?它们应该有什么作用?
我喜欢不根据标记中元素出现的顺序来定位它们。HTML中的行号影响页面布局似乎很随意。所以是的,我坚持将position: relative设置为一个有意请求,以保留静态定位。
或者可能只是我习惯了这样做。这是一个有趣的事情需要思考。只有在css-tricks上才能找到这样的东西。
既然我正在留下评论,我突然想到你以前使用Intense Debate或Disqus进行评论。你为什么回到WP评论?只是好奇。
我相信它们分别代表“精选”和“隐藏”评论。
是的,我之前想过这个问题,在对每个网站上90%的块级元素都声明position:relative感到厌烦之后。
我个人认为这完全是个人观点,我个人很少使用position absolute来将某个东西定位到其父div范围之外,因此默认情况下将所有div都设置为Position: relative对我来说将节省时间。
话虽如此,我意识到其他人可能会遇到比我更多的问题。所以,随心所欲吧。
我一开始使用
* {position:relative;}
但我发现它在旧版浏览器中会导致问题(特别是IE6完全无法滚动)。
从那时起,我开始使用
body * {position: relative;}
保持html标签为静态似乎大大提高了跨浏览器兼容性。
如果这是最初的规范,我们都会习惯它,但如前所述,将某个东西定位到屏幕的左上角将比需要困难得多,并且在某种程度上,当前的规范确实照顾到了几乎所有情况……提供像Anna建议的那样,
body * { position: relative; }
到你的代码中并非不可行。
我个人不喜欢重置样式表,所以不会这样做,但我可以看到这可能有什么好处……如果只是为了阻止* { float: left; }出现在样式表中!*颤抖*
注意那些IE bug!在overflow: auto内部使用position relative会将其变成fixed,并且当float遇到相对div时,有时你会遇到一个若隐若现的bug!
有趣的想法。我喜欢它,因为我认为让一个元素出现在布局中而不考虑其父元素非常令人困惑。例如,如果你没有非静态祖先,则position:absolute元素相对于(令人困惑的术语)body进行定位。因此,它在DOM中的位置实际上并不重要,你可以将其作为body的直接子元素,也可以将其嵌套得尽可能深。
我认为最佳实践是将绝对定位的块作为用于建立其定位上下文的节点的直接子元素放置。也许其他人不同意,但这个想法会鼓励这样做,所以我给它竖起大拇指。
对我来说,使用“position: relative”没有必要,因为事情必须始终简单。
不错的概念。
假设我们有一个系统,其中所有元素默认都获得position:relative。
我们无法将子元素放置到页面左上角,并使用position:absolute,因为默认情况下其位置受限于父元素的边界。
如果我们可以在所有元素中添加一个行为,即如果将position:static应用于子元素,则它们可以从所有父元素的相对容器中脱离出来!
你觉得呢?
想象一下没有静态,如果你尝试一下很容易。我们下面没有,上面也没有,只有{样式}。
意思是“我们下面的div”,但它消失了。
.pos{position:relative}
从不扭曲设计,在不需要时也不会干扰。所以我们可以始终使用它,可能代替
.pos{position:static}
。.pos{position:fixed}
具有其自身的重要性。没有替代品(据我所知)。有一个更简单的版本(代码)。我希望更容易理解。
http://cl.ly/05272M0M1O3s370V1J3q
是的,这完全更容易理解=)
我认为我的问题是,直到后来我才想到将音频元素直接插入菜单项中,所以我所有关于使用数据保存引用的垃圾,因此理论上你可以将它们附加到body上,它们仍然可以工作。
嗯,非常有趣。谢谢!我将把它用于我们的网站!收藏了你的网站!
很棒的文章,我断断续续地设计网站大约5年了,大约2个月前又认真地开始设计,从那时起已经做了大约六个网站,现在正在做一个,我花了大约两个小时玩弄每个元素的position:标签,看看它们的作用等等,很难记住事情的顺序,例如:绝对到相对或相对到绝对等等,总之我总是搞混!
好吧,我真的很喜欢你的网站,它非常有信息量,我从中学到了很多东西!
Ashley
我个人认为这完全是个人观点,我个人很少使用position absolute来将某个东西定位到其父div范围之外,因此默认情况下将所有div都设置为Position: relative对我来说将节省时间。
与其将
position: relative
作为默认情况,不如让我们能够为即使是position: static
元素也应用z-index。这样,我们就可以获得z-index的好处,同时仍然避免重置定位上下文,如果默认值为position: relative
。