发布日期:2017-03-24 14:05:16

CSS中的定位position理解

页面元素定位,浮动,以及z-index的属性的使用是页面设计中经常使用。正确使用它们可以设计出层次感十足的页面。但是往往在使用中确常有疑惑:

1. 定位时left,top,right,bottom如何设置,设置多大的值为好?百分比设置效果如何?响应式页面中如何使用?

2. 如何正确设置z-index?z-index设置什么情况下设置无效?

3.float,static,和定位之间的层次关系?

4. 在相对定位(position:relative)的情况下设置top时使用百分比有时为什么不工作? https://stackoverflow.com/questions/25851815/relative-positioning-top-with-percentage-doesnt-work-for-in-line-element

5. 对于定位元素,如果同时定义了top和bottom如何定位,如果同时定义了left和right如何定位?

6. abosulte position is always relative to the next parent with an explicitly set position. 定位永远是相对于显式设置了position的祖先元素。没有的话就是针对body的。

这些问题在这篇文章中有很好的描述。

首先摘录一下postion的设置:

Position 值 描述

absolute

(绝对定位)

生成绝对定位的元素,相对于static定位以外的第一个父元素进行定位。这个翻译有点难理解或者理解错误。abosulte position is always relative to the next parent with an explicitly set position. 这个祖先position可以是relative的。

通过left,top,right,bottom来进行定位。

fixed

(固定定位)

生成绝对定位的元素,相对于浏览器窗口进行定位。

通过left,top,right,bottom来进行定位。

relative

(相对定位)

      生成想对定位的元素,相对于其本身正常位置进行定位。注意原先占用的空间还保留着。
static 默认值,没有定位,元素出现在正常的流中。忽略top,bottom,left,right或者z-index的声明。
inherit 规定应该从父元素继承position属性的值。

 

摘录这篇对z-index的解释,更好的理解定位。

 

通常认为HTML页面是二维的,但实际上,CSS还有一个z-index属性,允许层叠元素。

所有的盒模型元素都处于三维坐标系中。 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着“z轴”层叠摆放, 当他们相互覆盖时, z轴顺序就变得十分重要。

默认的摆放规则

假定元素没有指定z-index属性,那么元素按照如下顺序叠放(从底到顶)

  1. 根元素的背景和边界
  2. 普通流(无定位)里的块元素(没有position或者position:static;)按HTML中的出现顺序堆叠
  3. 定位元素按HTML中的出现顺序堆叠

浮动

对于浮动的块元素来说,堆叠顺序变得有些不同。浮动块元素被放置于非定位块元素与定位块元素之间:

  1. 根元素的背景与边框
  2. 位于普通流中的后代块元素按照它们在 HTML 中出现的顺序堆叠
  3. 浮动块元素
  4. 常规流中的后代行内元素
  5. 后代中的定位元素按照它们在 HTML 中出现的顺序堆叠

使用 z-index

如果需要改变默认的摆放顺序,只需给元素指定z-index。z-index必须是整数,体现了元素在z轴的位置:

  • 底层:距离观察者最远
  • ……
  • -3 层
  • -2 层
  • -1 层
  • 0 层 (默认)
  • 1 层
  • 2 层
  • 3 层
  • ……
  • 顶层:最接近观察者

没有指定z-index的时候,所有元素默认在0层渲染。多个元素的z-index属性相同时,将按照上文描述的顺序布局。

使用z-index排序的例子:

注意,div#5的z-index无效,因为未指定position属性。

堆叠上下文

指定z-index属性将构造一个堆叠上下文。

以下元素构成堆叠上下文指:

  • 根元素html
  • 定位元素,且其z-index值不为auto
  • opacity小于1的元素
  • 在移动WebKit、Chrome22+以上,指定position: fixed的元素总是会构造堆叠上下文,即使z-index为auto。

堆叠上下文中的子元素按照前述顺序摆放。堆叠上下文内部的子堆叠上下文的z-index只在父堆叠上下文中有意义。

总而言之:

  • z-index不为auto,opacity小于1的元素会构建堆叠上下文。
  • 堆叠上下文可以嵌入其他堆叠上下文。
  • 每个堆叠上下文和它的同级上下文是独立的。
  • 每个堆叠上下文是自包含的。

发表评论