美文网首页
fixed定位问题

fixed定位问题

作者: YellowPoint | 来源:发表于2018-11-20 18:44 被阅读0次

fixed   
嵌套Fixed定位元素,被嵌套的元素层级异常或失效
http://zhangxuefei.site/p/1628
这个也就要改结构

深入探究iOS下fixed定位导致的问题
https://segmentfault.com/a/1190000010510291#articleHeader0
这个十分详细,各种情况的分析,还有动图一目了然

在PC中,由于「按钮」fixed定位和「其他」absolute定位脱离文档流。所以其显示层级比「项目列表」高,所以覆盖在「项目列表」外面。
在IOS中,元素只根据元素在代码中出现的顺序决定其显示的深度。即:布局格式并不能改变元素的显示深度。
所以「项目列表」覆盖了「其他」和「按钮」

有时间可以自己做一套实验
由于fixed的层级在ios上部分失效,导致弹窗被挡住,故将领取记录和领取成功的弹窗移到这个页面里面,本来可以在vipSide引入的,现在就要中转一次,将事件再往上传一级

  1. 首先是定位嵌套的问题,如果都是fixed定位,子级的层级也由父级决定
如下即使d2的子元素d21 层级z-index大于d3,但当d3的层级大于等于d2时候,d21还是会被d3挡住

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>fixed定位研究</title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        .d1{
            width: 300px;
            height: 300px;
            background: #F2DEDE;
        }
        .d2{
            position: fixed;
            top: 0;
            left: 0;
            z-index: 100;
            
            width: 200px;
            height: 200px;
            background: yellowgreen;
        }
        .d21{
            position: fixed;
            top: 10px;
            left: 10px;
            z-index: 300;
            
            width: 100px;
            height: 100px;
            background: darkred;
        }
        .d3{
            position: fixed;
            top:50px;
            left: 50px;
            z-index: 200;
            
            width: 200px;
            height: 200px;
            background: deepskyblue;
        }
    </style>
</head>
<body>
    <div class="d1">
        我是最外层
        <div class="d2">
            我是d1子元素d2
            <div class="d21">
                我是d2的子元素d21
            </div>
        </div>
        <div class="d3">
            我是和d2平级的d3
        </div>
    </div>
</body>
</html>


  1. 在IOS中,元素只根据元素在代码中出现的顺序决定其显示的深度。后发现设置z-index后就不会有这个问题
  2. 子元素fixed 导致父级overflow:hidden 失效,(vue游戏项目中,某种情况下在pc-chrome不会截断,但ios会)
    您可能不知道的CSS元素隐藏“失效”以其妙用
  3. 移动端 Web 开发踩坑之旅

如果 fixed 定位节点后面紧接跟着的兄弟节点是可滚动的(也就是设置了 overflow 为 true ),那么 fixed 节点会被其后的兄弟节点遮住。

一开始就没重现出第一个问题,要研究的就这个呀

后在vue中测试出确实和这个兄弟元素的overflow有关系,

overflow-x: hidden; 会遮住

overflow: auto;会遮住

overflow-y: auto; 会遮住

overflow: hidden;不会遮住



啊啊啊啊啊
终于是发现原来还是因为没有设置z-index导致的
站起来转了一圈,发现看反了

  1. 只有两层div的时候
所有问题均出现在ios上

.mask {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 500;
    background: rgba(0, 0, 0, 0.5);
}

<div class="box">
    <div class="mask"></div>
</div>

不设置overflow 均不会遮住
fixed+auto/hidden 遮住
relative+auto/hidden 不遮住
relative+zindex+auto/hidden 遮住

absolute与relative表现一致

可是vue情况是父级不设置zindex也会被遮住,这个和那个子级不设zindex的又不一样
现发现在vue中父级设置了overflow:auto;子级的fixed就会被遮住,父级overflow:hidden都不会;并且单独用html写就不会

现在再创建一个新的vue项目来测试,怕是老项目中引入太多其他东西,果然,新项目发现没问题,先把那两个UI框架去掉试试,没变化;woccc 最后居然发现去掉我们自己的common.css就可以了,好的再去这个css里面看看是哪个属性的问题,很快找到居然是body上的-webkit-overflow-scrolling: touch;导致的,woccccc

好的算是找到问题所在了,接下来就要研究这个属性了
深入研究-webkit-overflow-scrolling:touch及ios滚动

相关文章

网友评论

      本文标题:fixed定位问题

      本文链接:https://www.haomeiwen.com/subject/jvnxqqtx.html