探究 position-sticky 失效问题
CSS 的 position 值中,有一个非常有用的值 -- position: sticky
,通常会被用于各种吸顶,吸底,吸边的效果中。
如果你对 sticky
还不太熟悉,可以先看看我的这篇文章:使用 position:sticky 实现粘性布局,当然,这篇文章里面有稍微探讨 position: sticky
生效或者说失效的规则,但是不太充分。
最近遇到一些 position-sticky
失效的场景,所以总结了一下。
position-sticky 生效的原理
在 W3 官方文档中的定义是:Sticky positioning is similar to relative positioning except the offsets are automatically calculated in reference to the nearest scrollport.
转换成通俗的大白话就是,Sticky 定位类似于相对定位,(当它表现为 fixed 定位的特性时)会根据最近的滚动容器(nearest scrollport)自动计算偏移量。
其中有一个非常重要的概念就是 nearest scrollport,它表示 sticky 元素在即将消失前会相对它最近的 scrollport 去做定位。
正常的 DEMO
所以正常而言,类似下面的这种情况,sticky 是可以正常展示的。
<div class="container"> - 可滚动的容器 scrollport
<div class="sticky"> - 设置了 sticky 的元素
CodePen Demo -- Normal Sticky Demo
失效的 position: sticky
1、包裹的父容器高度与 sticky 元素一致
有趣的是,如果在 .sticky
元素和你希望 .sticky
生效吸附的滚动元素中间,添加上一层 .parent
的 div 元素,不给 div 添加任何样式,sticky 则失效了。
譬如是这样:
<div class="container"> - 可滚动的容器 scrollport
<div class="parent">
<div class="sticky"> - 设置了 sticky 的元素
CodePen Demo -- invalid Sticky Demo 1
失效原因:此时 .sticky
元素的最近的 scrollport 变成了它的父容器 div,而父容器 div 的高度和 .sticky
元素的高度是一样的,所以表现不出 fixed 的特性。
其实,这里不算失效,我们只需要将包裹 .sticky
元素的父容器的高度设置的大于 .sticky
元素本身,也能看到效果。
譬如,我们可以加上
.parent {
height: 100vh;
}
此时,sticky
将重新生效,像是这样:
其实,造成这种现象的本质原因是,设置了 position: sticky
的元素吸附的基准元素从 .container
变成了 .parent
。
2、包裹的父容器设置了 overflow: hidden
第二种情况,也会导致 position: sticky
的 fixed 定位特性失效。也就是 .sticky
元素的祖先容器存在 overflow: hidden。类似这样
<div class="container"> - 可滚动的容器 scrollport
<div class="hidden"> - 设置了 overflow: hidden
<div class="sticky"> - 设置了 sticky 的元素
CodePen Demo -- invalid Sticky Demo 2
在上面这个 DEMO 里面,设置了 sticky
的元素的父元素 hidden
元素,它的高度是远比 stikcy
元素高的,但是滚动的过程中却没有表现出 fixed 的特性。
原因在于,设置了 overflow: hidden
的元素,它不再代用滚动的特性,当
sticky元素吸附于
.hidden元素的顶部时,它随着
.hidden` 元素本身在 container 移动。所以,所有的 sticky 元素都会被滚动出 container 的滚动区域。
当然,这里有一点比较奇怪的是,.sticky
元素相对 .hidden
元素进行 fixed 定位,而不是相对 .container
元素进行 fixed 定位,表面设置了 overflow: hidden
的元素,它也是一个 scrollport。
其实,不止是 overflow: hidden
,设定为 position: sticky
元素的任意父节点的 overflow 属性必须是 visible,否则 position:sticky
不会生效。
总结一下
看完上面几个 DEMO,可以好好总结一下 position:sticky
的生效规则,明白了生效规则就会知道为什么有的时候设定的 sticky
会失效:
- 须指定 top, right, bottom 或 left 四个阈值其中之一(且达到设定的阈值),才可使粘性定位生效。否则其行为与相对定位相同;
- 并且 top 和 bottom 同时设置时,top 生效的优先级高,left 和 right 同时设置时,left 的优先级高
- 设定为
position: sticky
的元素的任意父节点的 overflow 属性必须是 visible,否则position:sticky
不会生效;在满足上述情况下,设定了position: sticky
的元素的父容器的高度必须大于当前元素,否则也会失效。(当然,此时,sticky
吸附的基准元素就会变成父元素)- 如果 position: sticky 元素的任意父节点定位设置为 position: overflow,则父容器无法进行滚动,所以 position:sticky 元素也不会有滚动然后固定的情况
- 在满足上述情况下,设定了
position: sticky
的元素的父容器的高度必须大于当前元素,否则也会失效。(当然,此时,sticky
吸附的基准元素就会变成父元素)
最后
好了,本文到此结束。
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
探究 position-sticky 失效问题的更多相关文章
- css3 position:sticky
最近在写一个小程序,项目中遇到一个需求:页面滚动到tab切换菜单时,菜单fixed到页面顶部: 实现方法: 使用小程序的onPageScroll事件,滚动到指定位置添加fixed样式: bug1:获取 ...
- 粘性固定属性 -- position:sticky
概述 position: sticky,这是一个比较容易忽略的css3 position 新属性,它的作用即为实现粘性布局,它是 relative 与 fixed 的结合. 用法 默认情况下,其表现为 ...
- position: sticky 防坑指南
position: sticky 防坑指南:https://www.jianshu.com/p/e217905e8b87 今天在写小程序项目的时候碰到一个需求是要把轮播图下面的标签栏滑动到顶部后固定, ...
- 粘性固定 position:sticky
在研究rem布局时,无意中看到网易新闻移动端首页的导航栏用上了一个CSS 3的属性粘性定位position:sticky,它是相对定位(position:relative)和固定定位(position ...
- position:sticky的兼容性尝试
开篇 笔者刚刚结束淘宝的工作,现在加入了一家有青春活力的垂直电商公司,正对着阿里巴巴的西溪园区,最近一直在熟悉新的工作环境和规范,因此博客有好些时间没有更新了,在此抱歉! 在忙碌完公司的发布系统之后, ...
- position:sticky用法
用户的屏幕越来越大,而页面太宽的话会不宜阅读,所以绝大部分网站的主体宽度和之前相比没有太大的变化,于是浏览器中就有越来越多的空白区域,所以你可能注意到很多网站开始在滚动的时候让一部分内容保持可见,比如 ...
- CSS3的position:sticky介绍
用户的屏幕越来越大,而页面太宽的话会不宜阅读,所以绝大部分网站的主体宽度和之前相比没有太大的变化,于是浏览器中就有越来越多的空白区域,所以你可能注意到很多网站开始在滚动的时候让一部分内容保持可见,比如 ...
- 使用 position:sticky 实现粘性布局
如果问,CSS 中 position 属性的取值有几个?大部分人的回答是,大概是下面这几个吧? { position: static; position: relative; position: ab ...
- position:sticky
使用sticky定位可以简洁的实现固定功能 例如,左右布局页面,左侧菜单,右侧内容,内容区域滚动时,不希望菜单区域滚动,而是固定不动 以往要实现这个功能,需要使用fixed定位菜单,菜单脱离文档流,布 ...
- CSS使用position:sticky 实现粘性布局
简介 前面写了一篇文章讲解了position常用的几个属性:<CSS 属性之 position讲解>一般都知道下面几个常用的: { position: static; position: ...
随机推荐
- python+selenium下载和上传文件
操作浏览器上传文件,先看代码 1 """ 2 * send_keys() 指定文件上传路径. 3 """ 4 from selenium i ...
- ios中多线程GCD NSOperation NSThread 相关的操作解析
//1.GCD 继承自C语言 优点 简单方便 //开启一个子线程处理耗时的操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIO ...
- 大白话详解大数据HBase核心知识点,老刘真的很用心(2)
前言:老刘目前为明年校招而努力,写文章主要是想用大白话把自己复习的大数据知识点详细解释出来,拒绝资料上的生搬硬套,做到有自己的理解! 01 HBase知识点 第6点:HRegionServer架构 为 ...
- Guava中EventBus分析
EventBus 1. 什么是EventBus 总线(Bus)一般指计算机各种功能部件之间传送信息的公共通信干线,而EventBus则是事件源(publisher)向订阅方(subscriber)发送 ...
- springboot补充
springboot中的日志: 在默认的spring-boot-starter中,会引入spring-boot-starter-logging, 而springboot-starte-longing中 ...
- Java动态代理设计模式
本文主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理. 什么是代理模式 就是为其他对象提供一种代理以控制对这个对象的访问.代理可以在不改动目标对象的基础上,增加其他额外 ...
- 九. Vuex详解
1. 理解Vuex 1.1 Vuex功能 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储 管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方 ...
- 第8.28节 Python中使用__setattr__定义实例变量和实例方法
一. 引言 根据前面章节介绍的内容,我们知道实例变量.实例方法的定义可以通过以下方法进行: 在类体中直接定义实例变量.实例方法: 在实例方法中定义实例变量.实例方法: 在类体外调用方使用赋值语句赋值定 ...
- PyQt(Python+Qt)学习随笔:model/view架构中的QStandardItemModel使用案例
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.案例说明 在应用中展示指定目录的图标文件的文件名和图标,界面就是一个简单的窗口上面放置一名为li ...
- XFF SSTI 模板注入 [BJDCTF2020]The mystery of ip
转自https://www.cnblogs.com/wangtanzhi/p/12328083.html SSTI模板注入:之前也写过:https://www.cnblogs.com/wangtanz ...