前言

你知道position定位有哪些值吗?常规static,绝对定位fixed、absolute,相对定位relative。好吧,这些是个前端都知道。今天要记录的是个不常见的、还在实验阶段的、兼容性不怎么完美的一个值。是的,正如标题提到的,它就是粘性定位sticky。你之前是否听说过呢?当我知道这个定位值后,我震惊了,卧槽,我是个假的前端吧,学前端一年多竟然不知道定位还有个粘性定位。然后我就试了一下这个定位的效果,哇哦,真的很好用,遗憾的是兼容性不够完美,但是现代主流浏览器的较新版本都已经兼容了。

position:sticky

  • 描述
    根据MDN上的解释,它首先会按照常规定位方式布局于文档流中,然后再根据文档BFC和最近的containing block(最近的块级祖先元素)定位。它后续的定位不会对后面的元素产生影响。该定位依赖于自身的top、left、bottom、right阀值,所以必须设置其中之一的值sticky才会有效,否则表现为相对定位。
  • 我的理解
    元素在视口没有滚动到设定的阀值时,它会表现为static定位(MDN上好像解释说是表现为relative,写的demo上发现top等值并没有表现出相对自身的移动,如理解错误,请千万指出,感谢),当元素被滚动到阀值时,它不会越过阀值,而是表现为fixed定位。
    举个🌰,假设设定了position:sticky; top:20px; 那么该元素初始布局时会按static定位,如果初始的定位在视口的top值小于20px,则它立马就会表现为top:20px的fixed定位;或者初始布局的视口top值大于20px,它正常布局,当滚动窗口时,一旦使它top值到达或者小于20px时,它表现为top:20px的fixed定位,直到它的父元素的底部和它自生底部重合,它就会黏在父元素底部被滚动走。
  • 适用场景
    1.随着屏幕滚动,需要一直在视口中的顶部导航
    2.局部的title
    3.其他暂时不知道

测试的示例

// APP.jsx

constructor(props) {
    super(props);
    this.state = {
      todo: {
        A: ["apple", "animal", "approve", "action", "active"],
        B: ["binary", "battle", "boss", "because", "become"],
        C: ["client", "cool", "call", "come", "cake", "case"],
        D: ["decomand", "disappoint", "disagree", "decide", "delay", "date"]
      }
    };
}

render() {
    return (
      <div>
        {Object.keys(this.state.todo).map(key => (
          <div key={key}>
            <div className="letter-head">{key}</div>
            {this.state.todo[key].map(item => (
              <p key={item}>{item}</p>
            ))}
          </div>
        ))}
      </div>
    );
}
/*APP.css*/
.letter-head{
  width: 400px;
  background-color: darkorange;
  position: sticky;
  position: -webkit-sticky;
  top: 0px;
}

这个示例是局部title的使用场景。它在ie下是完全不能工作的,不过根据sticky定位的描述,其实是可以通过js监听窗口滚动,动态调整元素的postion定位,一开始布局表现为static,滚动到阀值表现为fixed定位,到达父元素底部表现为相对于父元素的absolute,bottom为0的定位。然而我自己宾没有尝试去实现这样的模拟哈哈哈哈哈哈哈,可以看看stickybits库的实现,应该是比较类似的。


用户bPbopXz
67 声望0 粉丝