应给主体内容(如main)设置margin-bottom等于导航栏高度;优先用CSS变量动态管理,避免body padding-bottom;移动端需结合env(safe-area-inset-bottom)和resize监听适配iOS视口变化。
底部导航栏用 position: fixed 后内容被遮住怎么办
直接原因是:fixed 元素脱离文档流,不占空间,后续内容会“上浮”到它原本的位置,导致被覆盖。不是样式没生效,而是布局逻辑本身如此。
最稳妥的做法是给主体内容预留出底部导航栏的高度空间。关键不是“选 margin 还是 padding”,而是“加在谁身上、加多少、是否动态适配”。
- 加
margin-bottom到主体容器(如或):适合内容高度固定或可预估的场景;值必须严格等于导航栏高度(例如60px)- 加
padding-bottom到或根容器:更常用,尤其当导航栏始终存在且高度不变;但注意如果页面有滚动条,padding-bottom会让滚动区域底部留白,可能影响触底判断- 如果导航栏高度响应式(比如横竖屏不同),不能写死
60px,得用calc(100vh - var(--nav-height))或 JS 动态设置 CSS 变量为什么
margin-bottom比padding-bottom更可控margin-bottom作用于内容块自身,不影响父容器的盒模型和滚动行为;而padding-bottom是撑开父容器内部空间,在body上使用时,容易和min-height: 100vh冲突,也可能让IntersectionObserver或scrollHeight计算失准。- 推荐写法:
main { margin-bottom: 60px; } - 若用 CSS 变量:
:root { --nav-height: 60px; } main { margin-bottom: var(--nav-height); } - 避免写:
body { padding-bottom: 60px; }—— 尤其在需要精确监听滚动到底部的场景下
移动端 Safari 中 fixed 底部栏的兼容陷阱
iOS Safari 在地址栏收起/展开时会触发视口高度变化,但不会重排
fixed元素,也不会自动调整你写的margin-bottom。此时硬编码的60px可能偏大或偏小。 - 加