position:sticky失效问题剖析

article/2025/9/22 18:20:52

sticky失效原因

  • 一、position:sticky生效的原理
  • 二、正常的Demo
  • 二、position: stick生效与失效原理
    • 2.1 参考滚动父级元素是body
    • 2.2 参考滚动父级元素是自己设置的内部元素
  • 总结

一、position:sticky生效的原理

在 W3 官方文档中的定义是:Sticky positioning is similar to relative positioning except the offsets are automatically calculated in reference to the nearest scrollport.
通俗来说就是,Sticky 定位类似于相对定位relative,在没有触发sticky特性前是relative定位,当它表现为 sticky的特性时,是fixed定位,会根据最近的滚动容器(nearest scrollport)自动计算偏移量,其中有一个**非常重要非常重要非常重要的的概念就是 nearest scrollport,它表示 sticky 元素在即将消失前会相对它最近的 scrollport 去做定位**。

二、正常的Demo

.box1{width: 300px;height: 1200px;margin-top: 200px;padding-top: 100px;background-color: aqua;}.box2{width: 200px;height: 300px;background-color: red;position: sticky;top: 0;}<div class="box1"><div class="box2"></div></div>

在这里插入图片描述
在此demo中,首先查看设置sticky属性的box2参考的滚动父级元素是body,但是实际上body之所以滚动,是因为box2的父级元素box1的高度撑开了body,所以box2设置的top是相对于body的

二、position: stick生效与失效原理

2.1 参考滚动父级元素是body

(1) 包裹的父容器设置了 overflow: hidden会失效

.box1{width: 300px;height: 1200px;margin-top: 200px;padding-top: 100px;overflow: auto;/* overflow: hidden;overflow: scroll;overflow: overlay; */  //父元素设置了除overflow:visible以外其他属性,都会使sticky失效background-color: aqua;}.box2{width: 200px;height: 300px;background-color: red;position: sticky;top: 0;}<div class="box1">box1<div class="box2">box2</div></div>

在这里插入图片描述
在此demo中,首先查看设置sticky属性的box2参考的滚动父级元素是body,但是实际上body之所以滚动,是因为box2的父级元素box1的高度撑开了body,所以box2设置的top是相对于body的,但是sticky还是失效了,失效的原因在于box2的父级元素box1设置了 overflow: hidden/auto/scroll/overlay ,此时设置sticky属性的box2元素参考的滚动元素就不是body了,而是box1,而box1的高度比box2的高度大得多,并不足以让box1实现滚动,所以无法作为box2的参考父级滚动元素,进而失效了

那么思考一个问题,在多层级的情况下,并不是在其直接父元素上设置 overflow:hidden/auto/scroll/overlay,而是在其祖先元素上设置overflow,会影响子元素的sticky属性吗?
答案是:会影响的,一样的道理,只要参考的父级滚动元素无法滚动,都是不会让其内部设置sticky的元素生效

.container{width: 700px;height: 2900px;margin-top: 200px;background-color: bisque;padding-top: 80px;/* overflow: auto; */}.parent{           //box的祖先元素padding-top: 80px;width: 600px;height: 800px;overflow: hidden; //在box的祖先元素处设置overflow:hiddenbackground-color: aqua;}.child{            //box的父级元素width: 500px;padding-top: 50px;height: 500px;background-color: red;}.box{width: 500px;height: 200px;background-color: blueviolet;position: sticky;top: 0;}<div class="container"> container<div class="parent">parent<div class="child">child<div class="box">box</div></div></div><div class="borther"></div></div>

在这里插入图片描述
所以,设定为 position: sticky 元素的任意父节点的 overflow 属性必须是 visible,否则 position:sticky 不会生效
(2) 包裹的最近的父容器高度小于等于sticky 元素的高度会失效
在多级嵌套的情况下,如图例,box的实际参考滚动父级元素是body,但是外层还是有几层父级结构child、parent、container(实际应用场景可当做是设置sticky元素的外层layout布局等),此时注意,如果包裹的最近的父容器高度小于等于sticky 元素的高度,也是不生效的,按道理说此时box应该是在参考的滚动父级元素body中进行sticky定位的,但是并不可以,虽然box的实际参考滚动父级元素是body,但是设置的sticky的元素box还是依赖于它包裹的最近的父容器child进行滚动,待child的高度滚动结束,box的sticky属性也会失效

.container{width: 700px;height: 2900px;margin-top: 200px;background-color: bisque;padding-top: 80px;/* overflow: auto; */}.parent{padding-top: 80px;width: 600px;height: 500px;background-color: aqua;}.child{width: 500px;padding-top: 50px;height: auto; //父元素高度自动计算background-color: red;}.box{width: 500px;height: 200px;background-color: blueviolet;position: sticky;top: 0;}

在这里插入图片描述

上图所示,sticky元素.box的直接父级元素.child高度没有比sticky元素大,无法实现sticky效果

再思考一个问题,在实际多层级的情况下,并不是在其直接父级上加上一个比sticky元素大的高度,而是在其祖先元素上加一个比sticky元素小的高度,可以实现sticky效果吗?
答案是:可以

.container{width: 700px;height: 2900px;margin-top: 200px;background-color: bisque;padding-top: 80px;/* overflow: auto; */}.parent{padding-top: 80px;width: 600px;height: 500px; //祖先元素高度设置了500pxbackground-color: aqua;}.child{width: 500px;padding-top: 50px;height: 1600; //最近父级元素设置高度1600pxbackground-color: red;}.box{width: 500px;height: 200px;background-color: blueviolet;position: sticky;top: 0;}

2.2 参考滚动父级元素是自己设置的内部元素

此处应该就要和上面的参考滚动父级是body做区分了,并不是在设置sticky元素的上方所有父级都不可设置overflow。此时设置sticky元素wrap1的参考滚动父级元素是wrap,而wrap的滚动是由wrap2的高度影响的,wrap2的高度比wrap高,如果不在wrap元素上设置overflow:auto/scroll/overlay,wrap是无法滚动的。而正因为wrap可以滚动,那么此时的wrap就可以当做是wrap1的参考滚动父级元素,wrap1元素的sticky效果在wrap中实现

<div class="wrap"><div class="wrap1">固定头部</div><div class="wrap2">box2</div></div>.wrap{margin-top: 100px;width: 200px;height: 500px;background-color: blanchedalmond;overflow: auto;}.wrap1{width: 100px;height: 30px;background-color: aqua;position: sticky;top: 0;}.wrap2{width: 100px;height: 2000px;background-color: yellow;}

在这里插入图片描述

总结

看完上面几个 DEMO,可以好好总结一下 position:sticky 的生效规则,明白了生效规则就会知道为什么有的时候设定的 sticky 会失效:

1、须确定设置sticky元素的参考滚动父级元素
2、指定 top, right, bottom 或 left 四个阈值其中之一(且达到设定的阈值),才可使粘性定位生效。否则其行为与相对定位相同;并且 top 和 bottom 同时设置时,top 生效的优先级高,left 和 right 同时设置时,left 的优先级高
3、如果sticky元素的参考滚动父级元素是body,设定为 position: sticky 的元素的任意父节点的 overflow 属性必须是 visible,不能是hidden/auto/scroll/overlay,否则 position:sticky 不会生效;且包裹的最近的父容器高度要大于sticky 元素的高度;如果sticky元素的参考滚动父级元素是自己设置的内部元素,参考滚动父级元素可以设置overflow :/auto/scroll/overlay,且参考滚动父级元素的高度要比内部元素小


http://chatgpt.dhexx.cn/article/ULiDP3qy.shtml

相关文章

Vant2 源码分析之 vant-sticky

前言 原打算借鉴 vant-sticky 源码&#xff0c;实现业务需求的某个功能&#xff0c;第一眼看以为看懂了&#xff0c;拿来用的时候&#xff0c;才发现一知半解。看第二遍时&#xff0c;对不起&#xff0c;是我肤浅了。这里侧重分析实现原理&#xff0c;其他部分不拓展开来&…

position:sticky

1、position:sticky简介 设置了position:sticky的元素并不会脱离文档流。 当元素在区域内&#xff0c;元素不受定位的影响&#xff08;top、left等设置无效&#xff09;当发生滚动&#xff0c;元素就要移出区域时&#xff0c;定位又会变成fixed&#xff0c;根据设置的left、t…

css粘性定位position:sticky

前言&#xff1a; css3中有一个很有趣的属性position:sticky&#xff0c;粘性属性&#xff0c;效果是一个吸顶效果&#xff0c;可以说是相对定位relative和固定定位fixed的结合&#xff1b;它主要用在对scroll事件的监听上&#xff1b;简单来说&#xff0c;在滑动过程中&#x…

position:sticky 粘性定位

1、什么是粘性定位&#xff1f; 粘性定位它基于用户的滚动位置来定位。 粘性定位的元素是依赖于用户的滚动&#xff0c;在 position:relative 与 position:fixed 定位之间切换。 它的行为就像 position:relative; 而当页面滚动超出目标区域时&#xff0c;它的表现就像 position…

position: sticky 属性

关于 position 属性主要有五个值&#xff1a; static relative fixed absolute sticky 常见的就是 relative 和 absolute 这两个属性。 relative 表示&#xff0c;相对于默认位置&#xff08;即static时的位置&#xff09;进行偏移&#xff0c;即定位基点是元素的默认位置。 ab…

position的属性(sticky属性)

position的属性 对position所有的属性的介绍sticky属性定义demosticky生效以及失效 fixed属性定义demo absolute属性定义demo relative属性定义demo static属性定义 对position所有的属性的介绍 https://developer.mozilla.org/zh-CN/docs/Web/CSS/position sticky属性 定义…

css定位(二)---css中粘性定位(sticky)---C3新增属性

作用&#xff1a;相对定位&#xff08;position:relative&#xff09;和固定定位&#xff08;position:fixed&#xff09;的混合。sticky相当于加了一个滚动事件的处理&#xff0c;在滑动过程中&#xff0c;某个元素距离其父元素的距离达到sticky粘性定位的要求时(比如top&…

sticky

sticky position属性中最有意思的就是sticky了&#xff0c;设置了sticky的元素&#xff0c;在屏幕范围&#xff08;viewport&#xff09;时该元素的位置并不受到定位影响&#xff08;设置是top、left等属性无效&#xff09;&#xff0c;当该元素的位置将要移出偏移范围时&#…

sticky android,Sticky Warriors

《Sticky Warriors》是一款休闲格斗冒险类游戏&#xff0c;各种动画还有游戏当中的角色都会在这款游戏当中出现&#xff0c;简单但是非常硬核的操作&#xff0c;此外你还可以选择战斗的场景&#xff0c;更能烘托战斗的氛围&#xff0c;丰富多样的战斗模式玩法可以体验&#xff…

Mac破解百度云

https://github.com/CodeTips/BaiduNetdiskPlugin-macOS 转载于:https://www.cnblogs.com/wt645631686/p/10910576.html

百度云不限速下载最新破解真好用

大家肯定遇到过这种情况,家里的宽带明明就是 百兆光纤&#xff0c;为什么用百度云下载速度却是可怜几十kb/s? 其他工具下载速度却是正常&#xff0c;其实大家都知道这个是百度云限速了,为了让你冲会员,不择手段!!! 房贷要还&#xff0c;还要吃饭&#xff0c;该省的一分都不想…

百度云破解不限速版(绿色免安装)

百度云限速导致下载教程耗费大量的时间&#xff0c;给各位分享一个破解版的百度云。 百度云破解不限速版&#xff1a; 下载地址&#xff1a;链接: http://pan.baidu.com/s/1nuAF6LN 密码: c7jv 如果链接失效了直接向我反馈 下载地址&#xff1a;http://feixueteam.net/th…

破解版百度云【亲测好用】完美解决限速

现在百度云由于各种限制&#xff0c;下载速度非常的慢&#xff0c;今天用百度下载东西&#xff0c;感觉太慢&#xff0c;在网上无意间发现了一款不限速版的百度云&#xff0c;好的工具在这里一定要和大家分享了。&#xff0c; 咱们先来看看下载速度&#xff0c;我这里应该是10…

[不限速百度云]两款百度网盘破解版分享

Pandownload 简介 这个破解版百度云可以说是很经典了&#xff0c;由吾爱破解大神倾情制作。 缺点是使用自己的账号&#xff0c;容易被度受限速&#xff0c;好几天才能恢复 特别说明&#xff1a;使用前请登录百度账号&#xff01; 下崽链接 https://www.lanzous.com/i51s9wf…

极速下载!利用插件破解百度云限速

首发地址&#xff1a;【原创达人】极速下载&#xff01;利用插件破解百度云限速 http://club.lenovo.com.cn/thread-2781576-1-1.html (出处: 联想社区) 百度网盘真的是个好东西&#xff0c;但他让人又爱又恨&#xff0c;容量大&#xff0c;资源多给我们带来了很大的方便&…

X Chen笔记---百度云破解限速

http://blog.csdn.net/qq_29922333/article/details/55051619 http://chromecj.com/utilities/2015-04/423.html 原理 使用User-Agent-Switcher-for-Chrome这个插件&#xff0c;将window的浏览器模拟成safari浏览器&#xff0c;就可以不使用云盘来下载文件&#xff0c;使用…

从零开始速通百度云网盘

原文链接&#xff1a;CCR39のLazyNest 相信大家在网上冲浪时时常会下载一些资源、软件&#xff0c;如果你需要下载别人分享的资源时&#xff0c;就需要用到网盘。 百度云网盘由于早期在国内占据了一定规模的市场&#xff0c;拥有大量的资源与链接&#xff0c;直至目前&#x…

“油猴脚本”获取百度云文件URL,百度云速度破解

用通俗的语言来说&#xff0c;油猴脚本是一个浏览器插件&#xff0c;它本身也可以添加很多不同的脚本&#xff0c;是浏览器上的一个脚本管理集成工具。 我们来看一下&#xff0c;它在Chrome 插件市场已经1000 w 的下载了&#xff0c;也看出它的受欢迎程度。 借助所编写的脚本它…

破解网页版 百度云网盘无法下载大文件限制

问题描述&#xff1a; 百度云网盘网页版下载文件时&#xff0c;由于文件过大&#xff0c;点击下载&#xff0c;提示安装客户端下载。我们不安装客户端而继续使用网页版下载打文件呢&#xff1f; 方法如下&#xff1a; ---------------我用的chrome浏览器&#xff0c;其他的浏览…

免费的百度网盘批量转存软件工具

之前说的一个自动赚钱的项目&#xff0c;用到的工具就是这个一键转存工具。 项目文章《揭秘灰色项目&#xff1a;自动化引色流暴利变现方式》 此外的话百度账号也是很便宜的&#xff0c;也可以自己用软件注册&#xff0c;这个就不多说了。 这款软件免费的破解的&#xff0c;…