容易忽视的CSS3粘性定位position sticky

CSS3粘性定位position sticky
一、介绍

css3中新的定位属性,本身也具有定位元素的属性

理解为相对定位position:relative + 固定定位position:fixed的混合体

position:sticky粘性定位,基于用户的滚动定位

二、基本原理

依赖用户的滚动定位,行为像position:relative,当页面滚动超出目标区域,行为表现为position:fixed

什么是目标区域

相对父元素,超出阈值,这个阈值通过top、left、right、bottom确定

滚动元素

overflow不是visible的元素

流动盒子

粘性定位元素最近的可滚动元素的尺寸盒子。如果没有滚动盒子,则是浏览器视窗盒子

粘性约束矩形

粘性布局元素的父级元素矩形

三、生效的条件

①父元素不能是overflow:hidden/overflow:auto/overflow:scroll/overflow:overlay

②父元素高度不能低于sticky高度,否则无法显示效果

③必须指定top/left/right/bottom任一个方向的属性值

④作用域在父元素内,效果在父元素内生效

⑤在可视范围内为relative,反之是fixed

⑥同一个容器内多个粘性元素彼此独立偏移,可能会发生重叠

四、举例子
(1)语法
div sticky{
	position:-webkit-sticky;/*safair*/
	position:sticky;
	top:0;
}
(2)一个sticky元素
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            height: 2000px;
            width: 100%;
            background-color: rgb(214, 160, 169);
        }

        div {
            height: 200px;
            width: 400px;
            margin-top: 50px;
            background-color: rgb(189, 137, 238);
            border: 1px solid rgb(126, 235, 189);
        }

        nav {
            position: sticky;
            background-color: rgb(146, 189, 238);
            top: 20px;
            /*设置距离顶部20px的时候导航栏开始固定*/
            height: 60px;
            line-height: 60px;
        }
    </style>
</head>

<body>
    <div>
        <nav>导航栏</nav>
    </div>
</body>


</html>

效果展示

粉色背景的盒子是上述的流盒,蓝色为粘性约束的矩形框(父元素div),紫色的为粘性元素(div父里面的nav子)

在这里插入图片描述

向上滚动鼠标,当距离top:20px的时候导航栏固定,但不超过紫色的父亲div

在这里插入图片描述

向上滚动鼠标,父亲div紫色盒子粘性约束矩形超出流盒子,导航栏蓝色盒子也向上滚动了,但是始终在紫色盒子父div里面
在这里插入图片描述

向上滚动鼠标,紫色的盒子超出粉色流盒子,消失在可视范围内

在这里插入图片描述

(3)多个sticky元素
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            height: 2000px;
            width: 100%;
            background-color: rgb(214, 160, 169);
        }

        div {
            height: 200px;
            width: 400px;
            margin-top: 50px;
            background-color: rgb(189, 137, 238);
            border: 1px solid rgb(126, 235, 189);
        }

        nav {
            position: sticky;
            background-color: rgb(146, 189, 238);
            top: 20px;
            /*设置距离顶部20px的时候导航栏开始固定*/
            height: 60px;
            line-height: 60px;
        }

        header {
            position: sticky;
            background-color: rgb(250, 181, 150);
            top: 20px;
            /*设置距离顶部20px的时候导航栏开始固定*/
            height: 60px;
            line-height: 60px;
            display: block;
        }
    </style>
</head>

<body>
    <div>
        <nav>导航栏</nav>

        <header>头部</header>
    </div>
</body>


</html>

效果展示

粉色背景的盒子是上述的流盒,蓝色为粘性约束的矩形框(父元素div),紫色的为粘性元素(div父里面的nav子),橙色的也为粘性元素(div里面的header子)

在这里插入图片描述

向上滚动鼠标,蓝色的导航栏固定,橙色的向上滚动,蓝色和橙色两个粘性元素的粘性约束矩形都在紫色div父里面
在这里插入图片描述

向上滚动鼠标,蓝色的导航栏消失,橙色的盒子固定,覆盖导航栏(证明后面的粘性元素会覆盖前面的粘性元素)

在这里插入图片描述

向上滚动鼠标,橙色的盒子超出粉色流盒子,消失在可视范围内

在这里插入图片描述

总结:当有多个粘性元素的时候,后面的粘性元素会覆盖前面的粘性元素

(4)加上z-index

前文总结了z-index的层级覆盖,来试试加上z-index会发生怎么样的覆盖效果

nav.z-index: 20 header.z-index:19

复习:css中的z-index层级问题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            height: 2000px;
            width: 100%;
            background-color: rgb(214, 160, 169);
        }

        div {
            height: 200px;
            width: 400px;
            margin-top: 50px;
            background-color: rgb(189, 137, 238);
            border: 1px solid rgb(126, 235, 189);
        }

        nav {
            position: sticky;
            background-color: rgb(146, 189, 238);
            top: 20px;
            /*设置距离顶部20px的时候导航栏开始固定*/
            height: 60px;
            line-height: 60px;
            z-index: 20;
        }

        header {
            position: sticky;
            background-color: rgb(250, 181, 150);
            top: 20px;
            height: 60px;
            line-height: 60px;
            display: block;
            z-index: 19;
        }
    </style>
</head>

<body>
    <div>
        <nav>导航栏</nav>

        <header>头部</header>
    </div>
</body>


</html>

效果展示

在这里插入图片描述

蓝色的导航栏逐渐覆盖黄色的头部

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:粘性元素生效相当于position:fixed,z-index会生效

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CSS粘性定位position:sticky)是一种新的定位方式,它可以在不同滚动位置下保留元素位置,使得页面更加直观。但是这种方式还存在一些采坑需要注意。 首先是浏览器兼容性问题。目前,不支持CSS粘性定位的浏览器非常常见,如IE、Edge,这使得使用CSS粘性定位时需要考虑到网站使用的浏览器类型和版本。 其次是定位方式问题。CSS粘性定位的原理是在元素滚动到指定位置时切换元素的position属性,如果在滚动到指定位置之前改变元素位置,则影响其粘性定位效果。因此,在使用CSS粘性定位时需要特别注意元素位置是否发生改变。 最后是滚动容器问题。CSS粘性定位是基于滚动容器进行计算的,因此滚动容器的设置影响粘性定位效果。例如,如果没有设置滚动容器,粘性定位的元素将无法执行其粘性效果。另外,在滚动容器中,如果存在其他元素影响CSS粘性定位元素的位置,也影响粘性定位效果。 总结来说,CSS粘性定位虽然具有很多优点,但其实现也需要我们仔细考虑各种问题。在使用CSS粘性定位时,需要考虑到浏览器兼容性、定位方式和滚动容器设置,这样才能真正实现理想中的效果。 ### 回答2: CSS粘性定位position:sticky对于前端开发者来说已经是一种必备的技能。它可以让元素在滚动时保持位置的稳定性,同时也能始终保持相对应的位置。但是,尽管这个特性看似简单,却有着许多的问题和坑点需要注意。 第一个坑:浏览器兼容性问题。 尽管CSS粘性定位position:sticky已成为CSS三大定位属性之一,但实际上在早期的所有浏览器版本中它并不存在。因此,需要考虑浏览器的兼容性问题。在IE11和最新版Chrome、Firefox、Edge等浏览器中已支持。 第二个坑: z-index问题。 当元素使用position:sticky定位时,有时候出现 z-index 失效的问题。可以通过设置该元素 position 属性为 relative 或者设置 z-index 属性来解决这个问题。 第三个坑:父级元素的高度问题。 CSS粘性定位position:sticky必须要有一个与父元素等高度的容器,否则它的粘性定位就不生效。 第四个坑:滚动元素的高度限制问题。 如果滚动元素的高度不够,因此没有滚动条,那么粘性元素就跟随滚动元素消失,而不是一直保持在相应的位置。 第五个坑:移动设备兼容性问题。 在移动设备上,由于touch事件的特性,很难达到粘性定位的效果, 因此需要进行移动端的优化。 总之, CSS粘性定位position:sticky对于提高用户体验来说是相当不错的,但是它在使用中需要注重以下几个方面的问题:浏览器兼容性, z-index问题,父级元素的高度问题,滚动元素的高度限制问题,移动设备兼容性问题,只有注重这些问题,我们才能避免采坑的风险。 ### 回答3: CSS 粘性定位 position:sticky 是在滚动时保持元素位置不变直到到达特定位置才滑动的 CSS 属性。相比于 fixed 和 absolute 定位,它的一个重要优点是具有相对定位的特性,可以在父元素内使用。 然而,在使用 CSS 粘性定位时,遇到一些采坑的问题。 1. 浏览器兼容性问题 CSS 粘性定位 position:sticky 并不是所有浏览器都支持。在国内主流浏览器中,Chrome 和 Firefox 都已经支持,但是 IE 和 Safari 中并不可用。由于兼容性问题,需要考虑向下兼容,使用传统的 JavaScript 实现滚动粘性定位。 2. 内容多少不一致,表现难以统一 如果父元素的高度不固定,而导致子元素的高度也不确定时,粘性定位出现问题。如果子元素超过了父元素的高度,那么粘性定位失效。因此,在使用 CSS 粘性定位时,需要确保父元素的高度和子元素的高度保持一致,以保持表现的一致性。 3. 滚动条过长,性能开销大 当页面滚动距离过长,粘性定位占用大量的 CPU 资源。如果页面中存在大量粘性定位的元素,那么对页面的性能造成很大的影响。因此,在使用 CSS 粘性定位时,需要考虑到页面性能的因素,尽量减少使用量。 总之,在使用 CSS 粘性定位时需要认真考虑兼容性、表现一致性和性能因素。建议在使用时灵活选择,并且在必要时使用 JavaScript 实现滚动粘性定位

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傲娇味的草莓

佛系少女只是想记录学习痕迹

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值