CSS定位

226 阅读4分钟

Div分层

div的分层结构是:由下到上分别是,backgroundborder,块级元素,浮动元素,内联元素。后面添加的的浮动元素会覆盖之前的内联元素

层叠上下文

层叠上下文(stacking context),是HTML中一个三维的概念。在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的X轴,Y轴以及表示层叠的Z轴。一般情况下,元素在页面上沿XY轴平铺,我们察觉不到它们在Z轴上的层叠关系。而一旦元素发生堆叠,这时就能发现某个元素可能覆盖了另一个元素或者被另一个元素覆盖。

注意事项

  • 每个层叠上下文就是一个新的小世界(可以理解为作用域)
  • 这个小世界里面的z-index只和同在小世界的z-index进行比较,跟外界的z-index无关
  • MDN文档中可以找到不正交的属性创造层叠上下文
  • 需要注意的有z-index/flex/opacity/transform
  • CSS应该单独创建一个属性做这个事

Position定义

定位允许您从正常的文档流布局中取出元素,并使它们具有不同的行为,例如放在另一个元素的上面,或者始终保持在浏览器视窗内的同一位置。 本文解释的是定位的各种不同值,以及如何使用它们。

postion属性

  • static
  • relative
  • absolute
  • fixed
  • sticky

static属性

该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时top, right, bottom, leftz-index属性无效。(默认值,待在文档流里)

relative属性

该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relativetable-*-group, table-row, table-column, table-cell, table-caption元素无效。(相对定位,不脱离文档流,改变在文档流中的位置)

使用场景

  • 用于做位移
  • 用于设置absolute的祖先元素

配合z-index

  • z-index:auto默认值,不创建层叠上下文
  • z-index: 0/1/2
  • z-index: -1/-2

注意事项

  • 学会管理z-index
  • 不写z-index: 9999

absolute属性

元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。(绝对定位,定位基准是祖先里的非static)

使用场景

  • 脱离原来的位置,创建新的一层,例如对话框的关闭按钮
  • 鼠标提示

注意事项

  • 不要认为absolute是相对于relative定位的
  • 某些浏览器不写topleft会位置错乱
  • 学会使用left: 100%
  • 学会使用left: 50%; 加负margin

fixed属性

元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed属性会创建新的层叠上下文。当元素祖先的transform,perspectivefilter属性非none 时,容器由视口改为该祖先。(固定定位,定位基准是Viewport)

使用场景

  • 烦人的广告
  • 回到顶部的导航栏或者按钮

注意事项

  • 尽量不在移动端上用这个属性,很多问题
  • 例如transform: scale(1.1)会造成fixedBuG

sticky属性

元素根据正常文档流进行定位,然后相对它的最近滚动祖先(nearest scrolling ancestor)和 containing block (最近块级祖先 nearest block-level ancestor),包括table-related元素,基于top, right, bottom, 和 left的值进行偏移。偏移值不会影响任何其他元素的位置。 该值总是创建一个新的层叠上下文(stacking context)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflowhidden,scroll,auto, 或 overlay时),即便这个祖先不是真的滚动祖先。这个阻止了所有sticky行为。(粘滞定位)

注意事项

  • 如果写了absolute,一般都需要补一个relative
  • 如果写了absolute或者fixed,必须要补topleft
  • sticky兼容性很差

更多信息

CSS position MDN中文

CSS position属性

CSS定位详解

层叠代码

负z-index逃不出小世界

CSS 层叠

张鑫旭的博客

CSS 层叠详解

CSS absolute详解