【趣味CSS3.0】粘性定位属性Position:sticky是不是真的没用了?

🚀 个人主页 极客小俊
✍🏻 作者简介:web开发者、设计师、技术分享博主
🐋 希望大家多多支持一下, 我们一起学习和进步!😄
🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注

概述

我们以前在定位属性当中学习过relative、absolute、fixed、static这几种定位,但是后来的CSS3中出现了一种新的定位方式叫sticky, 它的中文意思是粘性的意思, 所以我们称之为粘性定位

那么什么叫粘性定位呢,它又有什么用处呢?

不用着急 哈哈哈 我们先来看一个案例你就明白了!

如图

从上图案例中我们可以看到 导航菜单滚动条啦到一定位置的时候,就自动吸附在了某个位置上!

虽然这个吸附粘性效果我们是可以通过javascript脚本去实现,但是现在我们有了CSS3中的sticky定位就可以很方便的去实现这个效果!

所以我们的粘性定位(sticky) 也就是基于用户的滚动条位置来定位元素的定位的,这就是所谓的粘性!

粘性定位的定义

首先既然是定位,那么肯定也是依靠元素本身对吧, 那么粘性定位的元素主要依赖于用户的滚动, 这里的滚动通常都是指的滚动条!

sticky就像是relativefixed的结合体一样, 也就是说当一个元素设置了sticky定位之后,会根据表现为在跨越特定阈值前为相对定位,之后为固定定位, 而这个特定阈值指的是 top、right、bottom、left之一

简单点说我们给一个元素设置的sticky定位,那么必须指定一个top, right, bottom 或 left 这4个阈值其中一个才可以使粘性定位生效, 否则就跟相对定位一样, 没什么效果可言!

案例

我们来看一个案例,假设我们随便来一点文字信息,把它们装到一个容器里面,
然后里面再添加一个div给它设置粘性定位看看效果

代码如下

<style type="text/css">#info{width: 100px;height: 30px;line-height: 30px;color: white;background-color: green;border: 2px solid black;padding: 5px;margin: 100px auto;font-weight: bold;text-align: center;}.box1 {width: 500px;height: 700px;background: yellow;margin: 100px auto;overflow-y: scroll;}.box1>.box2{background-color: blue;width: auto;height: 50px;/*开始进行粘性定位,黏住元素, 在指定的top和left位置 黏住元素*/position: sticky;top: 50px;left:0px;}
</style><div class="box1" id="box1"><div class="box2" id="box2"></div>A positioned element is an element whose computed position value is either relative, absolute, fixed, or sticky. (Inother words, it's anything except static.)A relatively positioned element is an element whose computed position value is relative. The top and bottomproperties specify the verticaloffset from its normal position; the left and right properties specify the horizontal offset.An absolutely positioned element is an element whose computed position value is absolute or fixed. The top, right,bottom, and left properties specify offsets from the edges of the element's containing block. (The containing block is the ancestor relativeto which the element is positioned.) If the element has margins, they are added to the offset. The element establishes a new block formattingcontext (BFC) for its contents.A stickily positioned element is an element whose computed position value is sticky. It's treated as relativelypositioned until its containing block crosses a specified threshold (such as setting top to value other than auto) within its flow root (or thecontainer it scrolls within),at which point it is treated as "stuck" until meeting the opposite edge of its containing block.Most of the time, absolutely positioned elements that have height and width set to auto are sized so as to fit theircontents. However, non-replaced, absolutely positioned elements can be made to fill the available vertical space by specifying both topand bottom and leaving heightunspecified (that is, auto). They can likewise be made to fill the available horizontal space by specifying bothleft and right and leaving width as auto.Except for the case just described (of absolutely positioned elements filling the available space):If both top and bottom are specified (technically, not auto), top wins.If both left and right are specified, left wins when direction is ltr (English, horizontal Japanese, etc.) and rightwins when direction is rtl (Persian, Arabic, Hebrew, etc.).Accessibility concernsEnsure that elements positioned with an absolute or fixed value do not obscure other content when the page is zoomedto increase text size.MDN Understanding WCAG, Guideline 1.4 explanationsVisual Presentation: Understanding SC 1.4.8 | Understanding WCAG 2.0Performance & AccessibilityScrolling elements containing fixed or sticky content can cause performance and accessibility issues. As a userscrolls, the browser must repaint the sticky or fixed content in a new location. Depending on the content needing to be repainted, the browser performance,and the device's processing speed, the browser may not be able to manage repaints at 60 fps, causing accessibility concerns for people withsensitivities and jank for everyone.One solution is to add will-change: transform to the positioned elements to render the element in its own layer,improving repaint speed and therefore improving performance and accessibility.</div>

效果如下

分析

上图的代码中,我们可以看到,给元素box2定义了sticky定位同时指定了一个top:50px,意思就是直接把元素固定到了距离顶部50px的位置,相当于设置了fixed定位一样!

所以其实意思很简单:给元素一开始开始进行设置sticky粘性定位,然后再指定的top或者left等位置,黏住元素!

其实这样看,我们还不好看出区别,我们可以把代码修改一下,并且用javascript来监测一下效果!

html代码


<div id="info">没有开始吸附</div>
<div class="box1" id="box1"><div class="box2" id="box2"></div>A positioned element is an element whose computed position value is either relative, absolute, fixed, or sticky. (Inother words, it's anything except static.)A relatively positioned element is an element whose computed position value is relative. The top and bottomproperties specify the verticaloffset from its normal position; the left and right properties specify the horizontal offset.An absolutely positioned element is an element whose computed position value is absolute or fixed. The top, right,bottom, and left properties specify offsets from the edges of the element's containing block. (The containing block is the ancestor relativeto which the element is positioned.) If the element has margins, they are added to the offset. The element establishes a new block formattingcontext (BFC) for its contents.A stickily positioned element is an element whose computed position value is sticky. It's treated as relativelypositioned until its containing block crosses a specified threshold (such as setting top to value other than auto) within its flow root (or thecontainer it scrolls within),at which point it is treated as "stuck" until meeting the opposite edge of its containing block.Most of the time, absolutely positioned elements that have height and width set to auto are sized so as to fit theircontents. However, non-replaced, absolutely positioned elements can be made to fill the available vertical space by specifying both topand bottom and leaving heightunspecified (that is, auto). They can likewise be made to fill the available horizontal space by specifying bothleft and right and leaving width as auto.Except for the case just described (of absolutely positioned elements filling the available space):If both top and bottom are specified (technically, not auto), top wins.If both left and right are specified, left wins when direction is ltr (English, horizontal Japanese, etc.) and rightwins when direction is rtl (Persian, Arabic, Hebrew, etc.).Accessibility concernsEnsure that elements positioned with an absolute or fixed value do not obscure other content when the page is zoomedto increase text size.MDN Understanding WCAG, Guideline 1.4 explanationsVisual Presentation: Understanding SC 1.4.8 | Understanding WCAG 2.0Performance & AccessibilityScrolling elements containing fixed or sticky content can cause performance and accessibility issues. As a userscrolls, the browser must repaint the sticky or fixed content in a new location. Depending on the content needing to be repainted, the browser performance,and the device's processing speed, the browser may not be able to manage repaints at 60 fps, causing accessibility concerns for people withsensitivities and jank for everyone.One solution is to add will-change: transform to the positioned elements to render the element in its own layer,improving repaint speed and therefore improving performance and accessibility.
</div>

css代码

<style type="text/css">#info{width: 100px;height: 30px;line-height: 30px;color: white;background-color: green;border: 2px solid black;padding: 5px;margin: 100px auto;font-weight: bold;text-align: center;}.box1 {width: 500px;height: 700px;background: yellow;margin: 100px auto;overflow-y: scroll;}.box1>.box2{background-color: blue;width: auto;height: 50px;/*当它有一定的距离*/margin-top: 100px;/*开始进行粘性定位,在指定的top和left位置 黏住元素*/position: sticky;top: 0px;left:0px;}
</style>

js代码

<script>window.onload=function (){var info=document.getElementById("info");var box1=document.getElementById("box1");var box2=document.getElementById("box2");box1.onscroll=function (){console.log(box1.scrollTop);//获取当前元素滚动条到顶部的Top值if(box1.scrollTop>=100){box2.style.backgroundColor="red";info.innerHTML="开始吸附";info.style.background="red";}else{box2.style.backgroundColor="blue";info.innerHTML="没有开始吸附";info.style.background="green";}}}</script>

效果如下

分析

这里我们加了一个margin-top 让大家方便看吸附效果

但是如果你指定了top值 那么其实就要相应的减掉margin-top值,从而计算得到正确的粘性触发阈值!

Sticky与Fixed的区别

很多人搞不清楚这两个之间的区别,其实也很简单

fixed定位是相对于整个浏览器视窗进行固定定位和吸附的!

Sticky定位是相对于父元素进行粘性定位和吸附的!

你如果不相信,我们可以来修改一下CSS代码看看

举个栗子

.box1>.box2{background-color: blue;width: 500px; /*给一个宽度*/height: 50px;/*当它有一定的距离*/margin-top: 100px;/*开始进行粘性定位,在指定的top和left位置 黏住元素*/position: fixed; /*设置固定定位*/top: 0px;left:0px;
}

如图

Sticky定位的兼容性

Sticky定位的兼容性目前 比较早的低版本浏览器可能是不支持Sticky定位

我们里可以使用Edge浏览器来模拟一下ie11的内核看看有没有效果!

如图


从上图看js代码是没问题的,但很显然Sticky定位是不兼容的

最后

所以使用这个粘性定位属性也是需要看具体情况来决定, 如果你不考虑兼容性,只是考虑最新浏览器的渲染,那么基本上没什么问题,如果你要兼容老一点的浏览器,那么可能还需要借助js的帮助才可以!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/244111.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Webpack5 基本使用 - 2

常用 loader loader 是辅助打包工具。webpack 默认只能打包 js 文件&#xff0c;打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。loader 可以将文件从不同的语言转换为 JavaScript。一类文件如果需要多个 loader 处理&#xff0c;loader 的执行顺序是从…

SQL注入 ---> Day1 !

终于&#xff0c;我的课程开始讲SQL注入了&#xff0c;对就是那个常年在OWASP上有名的SQL注入 今天是真的冷啊&#xff0c;幸苦的小编还在写csdn 1.SQL注入原理 SQl注入其实就是将恶意的代码向服务器提交&#xff0c;但是后端又不过滤而引发的漏洞&#xff0…

2、Line Charts折线图

可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…

让二叉树无处可逃

志不立&#xff0c;天下无可成之事。 ——王阳明 二叉树 1、树&#xff1f;什么是树1、1、基本概念1、2、树的相关概念1、3、树的表示方式1、4、树的实际运用 2、二叉树&#xff1f;只有两个分支吗&#xff1f;2、1、基本概念2、2、二叉树的相关定义2、3、二叉树的相关性质2、4…

flutter获取地理定位:geolocator依赖详细用法

本文使用geolocator插件实现app物理定位功能。 该插件的主要功能有&#xff1a; 获取最后已知位置&#xff1b;获取设备当前位置&#xff1b;获取连续的位置更新&#xff1b;检查设备是否启用了定位服务&#xff1b;计算两个地理坐标之间的距离&#xff08;米&#xff09;&am…

Python基础第九篇(Python可视化的开发)

文章目录 一、json数据格式&#xff08;1&#xff09;.转换案例代码&#xff08;2&#xff09;.读出结果 二、pyecharts模块介绍三、pyecharts模块入门&#xff08;1&#xff09;.pyecharts模块安装&#xff08;2&#xff09;.pyecharts模块操作&#xff08;1&#xff09;.代码…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件&#xff0c;其对应有UE引擎的插件&#xff08;Plugin_XV3dGS&#xff09;可以把相关格式的文件导入到引擎&#xff1b; 首先Polycam的官网为&#xff1a;My Captures | Polycam 可以下载各种用户扫描文件&#xff…

第二证券:大金融板块逆势护盘 北向资金尾盘加速净流入

周一&#xff0c;A股商场低开低走&#xff0c;沪指收盘失守2800点。截至收盘&#xff0c;上证综指跌2.68%&#xff0c;报2756.34点&#xff1b;深证成指跌3.5%&#xff0c;报8479.55点&#xff1b;创业板指跌2.83%&#xff0c;报1666.88点。沪深两市合计成交额7941亿元&#xf…

Django代码中的TypeError ‘float‘ object is not callable

学习使用Django进行网页爬取取决于你对Python、Django框架和网络爬虫的熟悉程度。以下是一些关键点&#xff0c;总的来说&#xff0c;如果你已经具备Python和Django的基础知识&#xff0c;并对网页爬虫有一定了解&#xff0c;那么学习使用Django进行网页爬取将会比较容易。如果…

鸿蒙应用开发学习:获取手机位置信息

一、前言 移动应用中经常需要获取设备的位置信息&#xff0c;因此在鸿蒙应用开发学习中&#xff0c;如何获取手机的位置信息是必修课。之前我想偷懒从别人那里复制黏贴代码&#xff0c;于是在百度上搜了一下&#xff0c;可能是我输入的关键字不对&#xff0c;结果没有找到想要…

Bluetooth Device Address(BD_ADDR) - 2

蓝牙核心规范&#xff1a;Core v5.3中关于蓝牙地址的其他说明 Vol 3: Host, Part C: Generic Access Profile 3 User interface aspects 3.2 Representation of Bluetooth parameters 3.2.1 Bluetooth Device Address (BD_ADDR) BD_ADDR 是蓝牙设备使用的地址。在设备发现过…

Docker容器操作 Docker创建并运行Nginx、Redis

容器操作的命令如图&#xff1a; 容器命令 # 创建并运行一个容器&#xff0c;运行成功后会返回容器id docker run# 暂停&#xff0c;将容器挂起&#xff0c;内存暂存&#xff0c;CPU不再执行 docker pause # 恢复运行&#xff0c;内存恢复&#xff0c;CPU恢复 docker unpause#…

设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务&#xff0c;这个与结构型模式有点像&#xff0c;结构型可以理解为静态的组合&#xff0c;例如将不同的组件拼起来成为一个更大的组件&#xff1b;而行为型更是一种动态或者具有某个…

微信小程序实现长按 识别图片二维码

第一种方案&#xff08;只需要在image里面加一个属性就可以了&#xff09; show-menu-by-longpress“{{true}}” <image show-menu-by-longpress"{{true}}" src"{{sysset.dyqewm}}" />第二种方案 放大预览图片&#xff0c;长按识别二维码 wxml <…

ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>=5.12

一、错误描述 ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>5.12 在用python中的plt包进行绘图时对plt进行了更新&#xff0c;更新之后再运行以前的代码就出现了这个问题。 二、bug消除 &#xff08;一&#xff09;解决方法——升级pyqt包…

【4k】4k的webrtc播放示例

目录 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数

关于在微信小程序中使用taro + react-hook后销毁函数无法执行的问题

问题&#xff1a; 在 taro中使用navigageTo() 跳转路由后hook中useEffect 的return函数没有执行 没有执行return函数 框架版本&#xff1a; tarojs: 3.6 react: 18.0 原因&#xff1a; 使用navigateTo() 跳转路由的话并不会销毁页面和组件&#xff0c;会加入一…

2023年第十四届蓝桥杯软件赛省赛总评

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

Portainer Docker容器可视化管理平台实践

Portainer Docker容器可视化管理平台实践 引安装登录Remote ENV 实践 引 平常用docker命令操作比较多&#xff0c;找了一款docker可视化工具&#xff0c;方便快速预览和批量操作&#xff0c;不想一行一行敲的时候&#xff0c;可以偷偷懒。Portainer试用了一下&#xff0c;安装…

二分法——C++

二分分为整数二分和浮点数二分&#xff0c;其中比较复杂的是整数二分&#xff0c;简单一点的是浮点数二分。 我们首先来说明整数二分,主要来讲解模板。 整数二分&#xff1a; 我们先来说一说使用二分法的前提&#xff0c;要有单调性&#xff0c;然后可以根据某种性质来划分成…