position 层叠上下文 z-index

304 阅读3分钟

Background指的是哪一块?

代码示例

Div的分层结构

什么叫标准文档流?

就是在页面中所有元素都没有人为设置的情况下的排列方式,block元素会按照从上到下顺序排列,而inline元素会按照从左到右顺序排列

position的5种取值

默认取值为static

  • absolute 与 fixed 脱离文档流
    • 关于absolute,为什么我们常说父元素relative 子元素absolute,
    • absolute是相对于祖先元素中最近的非static元素定位的
  • relative 的意思是相对于自身的定位,需要配合方向一起使用

relative 的意思是相对于自身的定位

  • 使用relative+方向属性造成的对象偏移现象并不会改变对象在文档中占位的空间,但是如果再配合margin和padding则会有影响
    • 经测试,margin会影响relative对象在文档中占位的空间,而padding属性在border-box模型下会影响relative对象在文档中占位的空间,这也很好理解。 代码示例
position:relative;
top:20px;
  • 可以用于做对齐,但已不再这么做,最低端的做法,现在都用flex了
    代码示例

absolute

  • absolute是相对于祖先元素中最近的非static元素定位的
  • absolute一定要把top/left这类属性一起写,因为如若不然,某些浏览器会出错
  • 善用top/bottom/left/top:100% 代码示例

fixed 固定在相对于视口的定位

  • 如果fixed遇到transform属性会失效
  • 移动端不要用这个属性,太多bug

sticky

特别适合顶部的导航栏,一旦页面过长,下滚后,导航栏会粘在视口顶部,但是兼容性太差了,几乎没法用,只能用于面试.

css中的层叠上下文(stacking context)

  • 默认最基础的SC是由根元素html标签默认创建的
  • 子代SC只能在父代SC之上玩耍,无法穿透父代这个托盘

如何理解子代SC无法穿透父代SC这个托盘呢?

深入理解-即使是负的z-index也无法穿透到托着它的那一层层叠上下文的下面 Div层级结构/非static定位下层级结构

z-index

  • 对于一个已定位dom(即 position≠static)z-index 属性才会生效
  • 默认值为auto,不会创建层叠上下文
  • index取值auto≠0,auto不能与position共同创建层叠上下文,而0可以;
  • z-index=-1,-2,-3...的元素都会存在于background的下面,见上图
  • z-index要慎用;只有处于同一个SC中的z-index才能比较

如何创建层叠上下文呢?主要5种,自行查看mdn文档

  • 'position:relative/absolute' && 'z-index≠默认值auto(0,1,2,3....-1...都可)'
  • position:fixed
  • 'flex容器内的子元素' && 'z-index≠默认值auto'
  • opacity 属性值小于 1 的元素
  • transform≠none
    层叠上下文MDN

z-index:10与z-index:5哪个在上面呢

  • 没有单独创建SC的情况下(即z-index:10与z-index:5的两个元素处于同一SC的情况下)10的高于5
    代码示例
  • 但若z-index:10的元素外层包着一层z-index=4的独立SC的话,那么10与5不是同一层的了,5就与4比较了,5>4,但表象是5的高于10
    代码示例

position水平居中的两个案例

代码示例