首页 > 其他分享 >解决position:fixed导致下层组件覆盖问题

解决position:fixed导致下层组件覆盖问题

时间:2024-03-21 14:11:42浏览次数:36  
标签:top 元素 relative 组件 position fixed margin

[解决position:fixed导致下层组件覆盖问题 - 掘金](https://juejin.cn/post/6986935474635931656)

问题描述

当上层组件固定(多见于导航栏的css样式)时,易造成下层组件被覆盖的问题。

我们来写一个案例,当fixed样式未被使用时,我们的组件样式如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    .outer-container {
        margin: 0 auto;
        display: block;
        max-width: 100%;
    }

    .header {
        height: 50px;
        background-color: red;
        display: flex;
        width: 100%;
    }

    .content {
        height: 100px;
        background-color: yellow;
        border: 2px black solid;
        display: block;
        position: relative;
        /*methods1 */
        /*margin-top: 50px;*/
    }

    .footer {
        height: 50px;
        background-color: green;
      	postion: relative;
    }
</style>
<body>
<div class="outer-container">
    <div class="header">I am the header</div>
</div>
<div class="content">I am the content1</div>
<div class="content">I am the content2</div>
<div class="footer">I am the footer</div>
</body>
</html>

直观图示如下:

image-20210720114103390.png

当header应用fixed样式后,它将悬浮于页面上方,覆盖下面的content组件:

    .header {
        height: 50px;
        background-color: red;
        position: fixed;
        display: flex;
        top: 0;
        width: 100%;
        z-index: 1000;
    }

图示如下(content1被覆盖了一半):

image-20210720114249714.png

原理相关

fixed relative简介

CSS **position**属性用于指定一个元素在文档中的定位方式。toprightbottom 和 left 属性则决定了该元素的最终位置。

  • static

该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时 toprightbottomleft 和 z-index 属性无效。

  • relative

该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。

相对定位的元素是在文档中的正常位置偏移给定的值,但是不影响其他元素的偏移。

  • fixed

元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transformperspective 或 filter 属性非 none 时,容器由视口改为该祖先。

分析

因为fixed元素脱离了正常文档流,所以relative元素的原本位置向上提了,产生了覆盖的行为。

需要添加marginor padding属性到下层内容组件上,使其发生向下偏移,不再被覆盖。

top、margin-top的区别:

  1. margin-top 属性设置元素的上外边距。是盒子模型的组成部分。它可以推开周围元素。注意相邻块元素的垂直边距会塌陷。
  2. top 属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。如果希望元素对周围元素没有影响,可以使用top与绝对定位元素

解决方法

方法一

如上文所分析的一样,给内容设置margin-top,同时设置header中的top:0和z-index,否则引起margin-top失效

失效原因可看这个案例,写得太好了,像篇优美的小作文:html - Why isn't my margin working with position: fixed? - Stack Overflow

    .content {
        height: 100px;
        background-color: yellow;
        border: 2px black solid;
        display: block;
        position: relative;
        /*methods1 */
        margin-top: 50px;
    }

效果如下:

image-20210720165837194.png

方法二

用空div占位,同时设置body margin=0,使div的位置相对于视窗口无边距,变得可计算。

    .empty-content{
        position: relative;
        display: block;
        height: 50px;
    }
<body>
<div class="outer-container">
    <div class="header">I am the header</div>
</div>
<div class="empty-content"></div>
<div class="content">I am the content1</div>
<div class="content">I am the content2</div>
<div class="footer">I am the footer</div>
</body>

效果图如下:

image-20210720170305381.png

以上

参考文档

标签:top,元素,relative,组件,position,fixed,margin
From: https://www.cnblogs.com/ministep/p/18087265

相关文章

  • vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支
    效果图在vue2、vue3项目开发中,使用element饿了么组件库,实现Table表格组件动态懒加载表格数据,可以决定是否自动展开所有2级或3级,也可以点击加载下级数据,可搭配表格的增删改查,数据变化后自动更新列表不会破坏树状的展开和折叠结构。提供详细示例代码,一键复制运行查看效果,稍......
  • vue2/3 - element组件库el-tree树形控件实现一键全选/一键反选取消/全部收起/全部折叠
    效果图在vue2、vue3|element饿了么组件库中,详细使用el-tree树状组件完成功能按钮组,支持全部选中节点、反选取消节点、对所有树节点进行折叠收起、是否上下级联动等等!提供详细示例代码教程,一键复制开箱即用~~示例代码请看下方代码及技术点介绍。<template><div......
  • React函数组件Hook
    问题:相对于类组件,函数组件的编码更简单,效率也更高,但函数组件不能有state(旧版)解决:React16.8版本设计了一套新的语法来让函数组件也可以有stateHook是React16.8的新增特性。它可以让你在不编写class的情况下使用state以及其他的React特性Hook也叫......
  • 【安卓漏洞挖掘】drozer--安卓四大组件的漏洞学习
    drozer:drozer(以前称为Mercury)是一款强大的开源Android安全评估框架,旨在帮助安全研究人员和渗透测试人员发现并利用Android设备和应用程序中的潜在安全漏洞。通过drozer,用户可以在设备上或远程执行一系列安全测试,包括但不限于:访问及控制本地应用:通过API探索和操作已安装的应用程序......
  • 将自己写的组件封装成类似element-ui一样的库,可以cdn引入
    在写好自己的组件之后第一步修改目录结构在根目录下创建package文件夹,用于存放你要封装的组件第二步在webpack配置中加入pages与publicpath同级pages:{index:{entry:'src/main.js',template:'public/index.html',......
  • 深入理解 SpringAOP(一):AOP 组件概述
    概述spring-aop模块是Spring框架中最重要的组件之一,它为我们提供了强大的AOP功能,并为其他扩展功能(如声明式事务、声明式异步处理等)提供了支持。在本文中,我们将深入探讨SpringAOP的源码,从代理对象的创建开始,揭示SpringAOP的运行机制。首先,在阅读这篇文章前,请先确保对Sp......
  • Salesforce LWC学习(四十九) RefreshView API实现标准页面更新,自定义组件自动捕捉更新
    本篇参考: https://developer.salesforce.com/docs/platform/lwc/guide/data-refreshview.htmlhttps://developer.salesforce.com/docs/platform/lwc/guide/reference-lightning-refreshview.htmlhttps://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KX6dA......
  • 在非标准Spring组件中(比如websocket)注入Spring管理bean的方法
    privatestaticUserMapperuserMapper;@AutowiredpublicvoidsetUserMapper(UserMapperuserMapper){WebSocketServer.userMapper=userMapper;}WebSocketServer是通过JavaWebSocketAPI创建的,并且由于@ServerEndpoint不是Spring的标准组件注解,直......
  • VUE3 十种组件通信的方式(附详细代码)
    props用途:可以实现父子组件、子父组件、甚至兄弟组件通信父组件<template><div><Son:money="money"></Son></div></template><scriptsetuplang="ts">importSonfrom'./son.vue'import{re......
  • 【Vue3】组件通信以及各种方式的对比
    方式一:props「父」向「子」组件发送数据父组件:定义需要传递给子组件的数据,并使用v-bind指令将其绑定到子组件的props上。<template><child-component:message="parentMessage"/></template><scriptsetup>importChildComponentfrom'./ChildComponent.......