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);
        }
    }})




  • 2018-11-17 21:05:48

    Android ANR发生的原因总结和解决办法

    ANR的全称是application not responding,是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

  • 2018-11-17 21:08:09

    Android 单个应用的内存限制

    获取Android手机应用内存大小 手机不同其性能也不同,手机本身内存可能有大有小,所以针对每个应用的内存大小也不相同。

  • 2018-11-17 21:11:14

    Android中App可分配内存的大小

     结果:(1)未设定属性android:largeheap = "true"时,可以申请到的最大内存空间为221M。      (2)设定属性android:largeheap = "true"时, 可以申请的最大内存空间为478M,是原来的两倍多一些。

  • 2018-11-17 22:44:53

    LeakCanary,30分钟从入门到精通

    在性能优化中,内存是一个不得不聊的话题;然而内存泄漏,显示已经成为内存优化的一个重量级的方向。当前流行的内存泄漏分析工具中,不得不提的就是LeakCanary框架;这是一个集成方便, 使用便捷,配置超级简单的框架,实现的功能却是极为强大的。

  • 2018-11-17 22:53:01

    gc for alloc freed

    在数组中选择图片然后显示,然后。。。logcat不断显示GC回收。最后程序黑屏。

  • 2018-11-17 23:25:38

    Android高效内存1:一张图片占用多少内存

    在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。另外本文知识点也是面试官喜欢问的一个点,看看自己的回答到什么级别了。