那么什么是scrolling box呢?
An HTML scrollbox is basically a box with scrollbars. Usually the scrollbox is made using the HTML <div> tag and the scrollbars are defined using the CSS overflow property. (From https://www.html.am/html-codes/scrollboxes/html-scrollbox.cfm )
姑且理解为
含有滚动条的或者含有overflow属性的皆为scroll box(试了下当设置为auto,overlay,sroll的时候会产生效果,估计就是所谓的scroll box)
实践:
1.设置父元素overflow:auto,子元素设置为sticky且top:10px
可以看到sticky的元素根据距其最近的具备scoll box的父元素计算offset
2.去除overflow:auto
可以看到之前设置的top属性无效了,找不到先祖元素为scrollbox的了,故基于viewport来计算offset:
看到有些文章说设置overflow:auto或者hidden不会生效,特地试了下发现是有效的..很疑惑。
1.auto
2.hidden
可以看到定位属性还是产生了效果。(到底是sticky还在生效还是已经类似于relative效果,待研究)
还是基于父元素为scroll box:
1.对于块级兄弟元素(位于普通文档流中)
前一个节点为block元素,自身为sticky,不会覆盖前面普通文档流中的元素
2.对于块级兄弟元素(脱离文档流::float)
对于脱离文档流的元素(float或者absolute)会直接按祖先元素的顶部开始计算
sticky VS fixed
1.先来看 fixed
2.再来看sticky, 去除父元素overflow(使之根据viewport计算)
可以看到当给其父元素设置固定高度后,sticky元素会受制于父元素的高度,即最多到达父元素的底部
浏览器兼容性:
*仅为个人学习之用
Ref: https://www.w3.org/TR/css-position-3/#sticky-position
sticky属性依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。
position 属性指定了元素的定位类型。它有五个属性,分别是static:HTML 元素的默认值,即没有定位,遵循正常的文档流对象。静态定位的元素不会受到 top, bottom, left, right影响。
relative:相对定位元素的定位是相对其正常位置。
fixed:元素的位置相对于浏览器窗口是固定位置。注:即使窗口是滚动的也不会移动
absolute:绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html>。注:定位使元素的位置与文档流无关,因此不占据空间。定位的元素和其他元素重叠。
sticky:基于用户的滚动位置来定位。粘性定位的元素是依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。它的行为就像 position:relative而当页面滚动超出目标区域时,它的表现就像 position:fixed,它会固定在目标位置。元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。