当前位置: 首页 > news >正文

我菜单为什么跟着滑动了?!!—— 固定定位为什么会失效?

背景:最近在写一个H5页面项目,头部有个菜单栏,需要固定在顶部不动,但是滑动之后设置并没有生效,之前开发中也遇到过类似的固定失效的情况,就去详细了解了下有哪些可能导致固定定位失效的情况。希望有些场景能帮助到你。下面我总结和详细说明了会导致失效的情况,那么我们接着往下看…

html代码:(所有情况通用,以下不重复展示)

<body><div class="parents"><div class="fixed">顶部固定菜单栏</div><div class="scrollDiv">我定不住啊师傅!!</div></div>
</body>

祖先元素的 CSS 变换(transform)、透视(perspective)或滤镜(filter)属性导致

如果一个元素的任何祖先元素应用了 transformperspectivefilter 属性等,这个元素的固定定位将相对于最近的具有变换的祖先元素进行定位,而不是相对于视口。

css代码:

 * {margin: 0;padding: 0;}.parents {// 转换transform: translateY(10px)}.fixed {width: 100%;position: fixed;top: 0px;left: 0px;background-color: pink;text-align: center;}.scrollDiv {width: 100%;height: 2000px;background: skyblue;}
  • 当内容区域高度超出发生滚动时,我们在顶部固定定位的菜单栏是没法固定住,会随着滚动往上走。如下图:

请添加图片描述

请添加图片描述

以下其他情况示例图一样,我们就不做多展示,直接给出示例代码

父元素使用了 will-change 属性

类似于 transform,使用 will-change 也可导致固定定位相对于此属性设置的元素,而非相对于视口。

  • 设置transformZ(0) 可以启动滑动加速,但是如果页面中有使用到固定定位,则会导致固定定位失效,原因是设置transformZ会使得被设置的元素脱离了文档流。

css代码示例:

   	.scrollDiv {will-change: transform;}.fixed {position: fixed;top: 10px;left: 10px;background-color: red;}

z-index

  • 虽然 z-index 不会导致固定定位“失效”,但如果其他元素的 z-index 值更高,固定定位的元素可能会被覆盖。确保合理设置 z-index 值,使得固定定位的元素在视觉上出现在页面的顶层。
    .fixed {position: fixed;top: 10px;left: 10px;background-color: red;z-index: 1;}.scrollDiv {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5);z-index: 2;}

能滚动的元素使用了 -webkit-overflow-scrolling

  • 这个在 iOS 设备上会出现,如果在祖先元素上使用了 `-webkit-overflow-scrolling: touch;可能会影响固定定位元素的行为。

css代码:

 .scrollDiv {width: 100%;height: 2000px;background: skyblue;-webkit-overflow-scrolling: touch;}

视口单位(vh、vw)与固定定位结合使用

  • 正常情况下是没有问题的,但是当使用视口单位(如 vhvw)来设置固定定位元素的大小或位置时,在虚拟键盘弹出或地址栏显示/隐藏时可能会有问题。

css代码:

.fixed {position: fixed;top: 10vh; /* 10% of viewport height */left: 10vw; /* 10% of viewport width */background-color: red;
}  

打印或预览模式

在打印或打印预览模式中,固定定位可能不会按预期工作,因为许多浏览器在打印时会忽略固定定位。

移动设备上的兼容性问题

一些移动设备上的浏览器对 fixed 定位的支持可能存在问题,尤其是当键盘弹起或处理复杂的页面交互时。

屏幕阅读器和辅助技术

使用屏幕阅读器等辅助技术时,fixed 定位可能不会以预期的方式呈现。

写在后边

布局定位涉及到很多设备兼容的问题,有很多特殊场景我们可能并没有解释到。可能有些标准用法在某个设备上也会有异常,只是我们只需要兼容大多数,然后去解决必须兼容的设备。我们的开发就是不断完善+解决bug。

最后你有遇到过什么其他原因导致定位失败的吗?或者你有哪些开发中奇葩的样式问题。欢迎评论区讨论!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ubuntu下Xsens_MTi_300传感器的python驱动安装
  • 数据科学 - 数据预处理 (数据清洗,结构化数据)
  • window安装elasticsearch和可视化界面kibana
  • 企业级-实现Nginx的静态文件服务器映射
  • JVM(Java虚拟机) - JVM内存分配与内存管理
  • 发送邮箱调用接口时需要注意哪些安全事项?
  • [CP_AUTOSAR]_系统服务_DEM模块(一)功能及模块间依赖关系介绍
  • 数据结构初阶之排序(上)
  • 前端的学习-CSS(弹性布局-flex)
  • go语言day21 goland使用gin框架、gorm框架操作mysql数据库redis数据库 使用宝塔创建redis数据库
  • NIO专题学习(一)
  • 计算右侧小于当前元素的个数
  • 【C++】—— 类与对象(二)
  • [Git][认识Git]详细讲解
  • 【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案
  • php的引用
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • ESLint简单操作
  • export和import的用法总结
  • iOS | NSProxy
  • JavaScript 一些 DOM 的知识点
  • JS题目及答案整理
  • linux安装openssl、swoole等扩展的具体步骤
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React组件设计模式(一)
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring Boot MyBatis配置多种数据库
  • SwizzleMethod 黑魔法
  • Vue官网教程学习过程中值得记录的一些事情
  • 聊聊sentinel的DegradeSlot
  • 排序算法学习笔记
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我建了一个叫Hello World的项目
  • 写给高年级小学生看的《Bash 指南》
  • 用jQuery怎么做到前后端分离
  • 容器镜像
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • # C++之functional库用法整理
  • # Maven错误Error executing Maven
  • #android不同版本废弃api,新api。
  • ${factoryList }后面有空格不影响
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)STL算法之比较
  • (C++哈希表01)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (九)c52学习之旅-定时器
  • (力扣)循环队列的实现与详解(C语言)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐