css sticky 定义
position:sticky
定义元素为粘性定位元素,根据正常文档流进行定位,然后相对它的临近祖先滚动的元素,基于 top
, right
, bottom
, left
的值进行偏移。
sticky 的元素会创建以一个新的层叠上下文,如果其临近的祖先元素存在 overflow
的值是 hidden
, scroll
,auto
,overlay
值,都会导致 sticky 失效
实战例子
废话不多说,上代码
html
<div class="row content"> <div class="col-lg-9"> </div> <div class="d-none d-md-none d-lg-block col-lg-3 right-column"> <div class="sticky"> sticky </div> </div></div>
css
.content { padding: 100px 0 500px 0; height: 1200px;}.right-column { background-color: #044A56;}.sticky { position: sticky; top: 0; height: 50px; background-color: #2C6E5A; color: #FFF;}
代码很简单,这样就实现了一个右侧滚动固定的功能
See the Pen sticky 固定元素 by kelen (@imkelen) on CodePen.
失效场景以及定位
1. 检测浏览器是否支持
js 检测方法
if (!(CSS && CSS.supports && CSS.supports('position', 'sticky'))) { // 不支持做兼容处理}
css 检测方法
.sticky { position: fixed; top: 0px;}@supports (position:sticky) { .sticky { position: sticky; top: 0; }}
2. 检测父元素是否设置了 overflow 不为 visible 的属性,可以通过下面代码来检测
let parent = document.querySelector('.sticky').parentElement;while (parent) { const hasOverflow = getComputedStyle(parent).overflow; if (hasOverflow !== 'visible') { console.log(hasOverflow, parent); } parent = parent.parentElement;}
3. 检测父元素的高度是否大于 sticky 元素的高度
父元素如果是设置了 flex 布局,如果 sticky 元素设置了 align-self: stretch
属性,只要 sticky 元素大于父元素高度,则无法滚动,可以设置为 flex-start