*sticky属性与relative类似但是其offset实根据最近的拥有scrolling box的先祖元素来确定的,如果没有拥有scrolling box的话会根据viewport来计算
那么什么是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;
![](https://img.haomeiwen.com/i4693496/9a06bbaebdb8fd8d.png)
可以看到sticky的元素根据距其最近的具备scoll box的父元素计算offset
2.去除overflow:auto
![](https://img.haomeiwen.com/i4693496/b7ae0ad6c178542d.png)
可以看到之前设置的top属性无效了,找不到先祖元素为scrollbox的了,故基于viewport来计算offset:
![](https://img.haomeiwen.com/i4693496/8fbccec043e2fa65.png)
看到有些文章说设置overflow:auto或者hidden不会生效,特地试了下发现是有效的..很疑惑。
1.auto
![](https://img.haomeiwen.com/i4693496/d6c3a2217a3b118b.png)
2.hidden
![](https://img.haomeiwen.com/i4693496/ecae5e22f90b673c.png)
可以看到定位属性还是产生了效果。(到底是sticky还在生效还是已经类似于relative效果,待研究)
还是基于父元素为scroll box:
1.对于块级兄弟元素(位于普通文档流中)
![](https://img.haomeiwen.com/i4693496/e38c48b0514c21bc.png)
前一个节点为block元素,自身为sticky,不会覆盖前面普通文档流中的元素
2.对于块级兄弟元素(脱离文档流::float)
![](https://img.haomeiwen.com/i4693496/362de400e8163547.png)
对于脱离文档流的元素(float或者absolute)会直接按祖先元素的顶部开始计算
sticky VS fixed
1.先来看 fixed
![](https://img.haomeiwen.com/i4693496/ba142893dbb7026c.png)
2.再来看sticky, 去除父元素overflow(使之根据viewport计算)
![](https://img.haomeiwen.com/i4693496/782c03c2d1e3cdf2.png)
可以看到当给其父元素设置固定高度后,sticky元素会受制于父元素的高度,即最多到达父元素的底部
浏览器兼容性:
![](https://img.haomeiwen.com/i4693496/a58d46d81bee6c75.png)
*仅为个人学习之用
网友评论