你还怕被问到Position属性吗?

235 阅读3分钟

Position有以下属性值:

static

  • 默认值,没有定位,元素出现在正常的文档流中
  • 忽略 top, bottom, left, right 或者 z-index 声明

relative(相对定位)

  • 相对于自身原本位置进行定位
  • 其不影响元素本身特性:无论是内联元素还是块级元素都会保留其原来的特性,比如内联元素设置宽高依然是无效的
  • 不会使元素脱离文档流:元素原本的位置会被保留,并不会被后面的元素所填充

absolute(绝对定位)

  • 元素会完全脱离文档流,在文档流中也不在占位,后面的元素将会填充上去
  • 改变内联元素的特性,内联元素可以设置宽高
  • 改变块级元素的特性,块级元素在未设置宽度时由内容撑开宽度
  • 相对于static定位以外的一个父元素进行定位(若其父元素没有定位则逐层上找,直到document

fixed(固定定位)

  • 相对于浏览器窗口进行定位,元素的位置在屏幕滚动时不会改变
  • 其它特性和绝对定位相似,元素会脱离文档流,同样会该变内联元素和块级元素的特性

sticky(粘性定位)

因为是新的属性值,很多同学可能没有用过,所以我们重点来讲一下这个属性

  • 其是CSS3新增的属性值,粘性定位可以被认为是相对定位和固定定位的混合。元素在跨越特定阈值前为相对定位,之后为固定定位
  • 该特性兼容性较差,部分IE 版本不支持 sticky 定位

注意事项:

  • sticky元素仅在父元素内生效
  • 必须指定topbottomleftbottom四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同
  • 设定为 position:sticky 元素的任意父节点的 overflow 属性必须是 visible(默认值),否则 position:sticky 不会生效

我对该sticky属性值的理解就是:在达到设置的阈值之前,它的行为就像 position:relative(不完全等价),因为无论你有没有设置偏移量,它都发生不会偏移;在滚动过程中,设置了postition:sticky属性的元素距离viewport达到或小于sticky粘性定位的要求时(比如top:100px);position:sticky这时的效果相当于fixed定位(也不完全等价),固定到适当位置,但原先的位置依然像relative属性一样不会被占用。所以sticky属性更像是结合了relativefixed这个属性值所得的产物

使用场景:

在网页开发中经常会碰到需要这样一种情况 —— 网站滚动到一定高度的时候,让一部分内容作为navbar,也就是置顶显示,我们一般会使用js监听scroll事件来实现,但是新增的css属性position:sticky却可以帮助我们轻松实现

示例:

<style>
.tab-control{
  position: sticky;
  top: 44px;
}
</style>
<tab-control class="tab-control" :titles="['流行','新款','精选']"></tab-control>

效果:

inherit

  • 规定从父元素继承position属性的值