flex布局与position:absolute/fixed的冲突问题

2020-04-03 13:07:46

参考地址 当display:flex弹性布局与position:absolute/fixed定位一起用,会出现的问题与解决方法

首先放出使用场景的截图:


使用场景

导航栏固定定位

导航栏内,平均分为四块,为了适配各种移动设备,使用了flex布局。
与此同时,产品经理要求:页面上滚越过封面图时,导航栏变为固定定位,浮在页面顶部。
拿到需求之后,思路就是先搞好布局,然后监听window.onscroll,当页面滚的距离大于封面图的时候,给ul加入position:fixed。

下面再现一下问题:

<!--DOM结构:--><body>
    <h1>flex布局与position:absolute/fixed踩坑</h5>
    <ul>
        <li>协会简介</li>
        <li>协会章程</li>
        <li>协会架构</li>
        <li>资料下载</li>
    </ul></body>

//主要的样式<style>
        ul {
            display: flex;
            justify-content: space-between;
            margin: 0 15px;
            background: pink;
        }

        li {
            flex: 1;
            list-style: none;
            height: 100px;
            line-height: 100px;
            text-align: center;
            font-size:  30px;
            border: 1px solid #fff;
        }    </style>

当单独使用display: flex 时,是没有问题的。


对ul使用了display:flex



当对ul加入position:absolute/fixed时,再来看一下页面变化,我录了gif图直观的感受下flex失效的过程~~~:

flex与position:absolute/fixed 同时作用于ul

所以,被绝对定位与固定定位的盒子不参与flex布局。(注意不包括相对定位哦~)

划重点!这个问题怎么解决呢?
既然被定位的盒子不参与flex,那就在这个盒子外面套一个盒子,给外层盒子使用定位,内层没有使用定位的盒子继续使用flex。这样不就解决了~~~哦对了!还要给外层盒子设置宽度,100%就好啦!

<!--新的DOM结构:--><body>
    <h1>flex布局与position:absolute/fixed踩坑</h5>
    <div class="nav-box">    
        <ul>
            <li>协会简介</li>
            <li>协会章程</li>
            <li>协会架构</li>
            <li>资料下载</li>
        </ul>
    </div></body><!--样式设置:-->
       .nav-box {
            width: 100%;
             position: fixed; 
        }

        ul {
            display: flex;
            justify-content: space-between;
            margin: 0 15px;
            background: pink;
        }

        li {
            flex: 1;
            list-style: none;
            height: 100px;
            line-height: 100px;
            text-align: center;
            font-size:  30px;
            border: 1px solid #fff;
        }

再录一个gif,错乱的样式又改回来啦!~~


在ul外包裹一个新的div,对其使用定位

关于flex布局的知识点,阮大大有两篇博客可以学习:
Flex 布局教程:语法篇
Flex 布局教程:实例篇

最后再记录一下,监听window.onscroll实现下拉到某距离时采用绝对定位:

$(function () {
    var headerHeight = $('.header').outerHeight();  //logo区域的高度
    var imgHeight = $('.topImg').outerHeight();  //图片区域的高度
    var distance = imgHeight - headerHeight;    //要监测的页面上滚距离

    window.onscroll = function () {
        var top = $(document).scrollTop();   //j记录页面上滚距离
        if (top >= distance){
            $('.navBox').css({'position':'fixed','top':headerHeight+'px'});
            $('.detailsInfo').css('paddingTop',$('.navBox').outerHeight()+'px');  //绝对定位之后,当前元素脱标,不占据原来的位置。下面的元素会挤上来且被ul遮盖。这个时候需要为下面的元素设置上内边距撑住!
        }else {
            $('.navBox').css({'position':'static','top':0});
            $('.detailsInfo').css('paddingTop',0);
        }
    }})




  • 2020-12-07 22:06:13

    System Extension Blocked - warning

    After upgrading your macOS computer to High Sierra 10.13.4 or higher (starting in April 2018), you may see a message about a System Extension Blocked. At Williams we have seen this warning appear for these programs:

  • 2020-12-08 08:57:12

    win10上使用win-sshfs

    首先在GitHub上下载DokanSetup-1.0.5.1000和WinSSHFS-1.6.1.13-devel 注意:Dokan不能使用最新的版本,得使用1.0.5版本。要不win-sshfs会报Dokan版本错误的问题。(win10版本)

  • 2020-12-08 11:51:54

    Ubuntu安装Node.js和npm

    Node.js是基于Chrome的JavaScript构建的跨平台JavaScript运行时环境,npm是Node.js的默认程序包管理器,也是世界上最大的软件注册表。本篇文章展示了三种在Ubuntu 20.04服务器上安装Node.js和npm的方法。

  • 2020-12-08 17:13:57

    nvm卸载、安装node和npm

    1、node.js、nvm、 npm (1)在cmd中输入`where node`找到node长须所在位置进行删除 (2)确保计算机-环境变量删除相关引用 (3)在cmd中输入`node -v` ,得到以下结果,删除成功

  • 2020-12-08 17:23:36

    Window下完全卸载删除Nodejs

    1.从卸载程序卸载程序和功能。 2.重新启动(或者您可能会从任务管理器中杀死所有与节点相关的进程)。 3.寻找这些文件夹并删除它们(及其内容)(如果还有)。根据您安装的版本,UAC设置和CPU架构,这些可能或可能不存在:

  • 2020-12-09 08:48:45

    nodejs版本以及其对应的npm版本

    正在寻找某个大版本的最新版? Node.js 10.x Node.js 8.x Node.js 6.x Node.js 4.x Node.js 0.12.x Node.js 0.10.x 所有版本