zoukankan      html  css  js  c++  java
  • 记一次填坑的过程(当fixed元素相互嵌套时chrome下父元素会影响子元素的层叠关系)

    先简单介绍一下背景吧,H5的微信端项目。C#+vue.js+amazeui。本地调试使用的google。

    有个页面最近加了一点小功能,加完测试的时候,发现modal框出问题了,点击确认按钮无法执行回调事件。

    amazeui的moadl用法(直接官网拷来的):

    $('#my-confirm').modal({
            relatedTarget: this,
            onConfirm: function(options) {
              var $link = $(this.relatedTarget).prev('a');
              var msg = $link.length ? '你要删除的链接 ID 为 ' + $link.data('id') :
                '确定了,但不知道要整哪样';
              alert(msg);
            },
            // closeOnConfirm: false,
            onCancel: function() {
              alert('算求,不弄了');
            }
          });

    用法很简单,但是一直执行不了onConfirm。
    但是之前一直是好的,在正式站点上测试,发现也有这个问题,正式代码记忆里一直没动过啊。(抱歉,虽然发了正式版,但是还没推广使用,木有用户,所以没人发现,哈哈)
    在项目中,amazeui使用的是本地下载的代码,vue.js使用的是CDN,代码又没变动过,功能缺有问题了,头脑中第一个念头就是vue.js出问题啦,
    去官网一看,还真升级了,先把vue.js原来的版本下载下来,改成本地引用,调试一下,还是有问题,懵逼了。
    记忆中modal是有点bug,这个在官网上也说明了:

    每个 Modal 实例都存储在对应元素的 $('.am-modal').data('amui.modal') 属性。------注意这句话,对应的代码:

    function Plugin(option, relatedTarget) {
    return this.each(function() {
    var $this = $(this);
    var data = $this.data('amui.modal');
    var options = typeof option == 'object' && option;

    if (!data) {
    $this.data('amui.modal', (data = new Modal(this, options)));
    }

    if (typeof option == 'string') {
    data[option] && data[option](relatedTarget);
    } else {
    data.toggle(option && option.relatedTarget || undefined);
    }
    });
    }

    于是先用方法三试了一下,还是不行,根本进不去confrim事件里,并且发现,对用的按钮会被绑定多次click事件,而我的modal是会被多次重新调用的,

    就会导致一次点击执行多次绑定事件,所以排除方法三,按照方法四重写绑定事件:

    $(function() {
    var $confirm = $('#your-confirm');
    var $confirmBtn = $confirm.find('[data-am-modal-confirm]');
    var $cancelBtn = $confirm.find('[data-am-modal-cancel]');
    $confirmBtn.off('click.confirm.modal.amui').on('click', function() {
    // do something
    });

    $cancelBtn.off('click.cancel.modal.amui').on('click', function() {
    // do something
    });
    });

    改完运行,还是有问题,调试了一遍,发现还是进不去点击事件里面。再次懵逼了.

    冷静下来想一想,不考虑其他的干扰因素,只针对按钮点击事件不执行这个点切入,难道点击的时候,没有触发按钮点击事件???

    通过观察,还真是,原来使用modal的时候,插件会自动生成一个dimmer    div,起到遮罩的功能,

    本来定义的dimmer的z-index比modal的z-index小,理论上应该是modal层在dimmer的上面,但是实际是dimmer在modal的上面,所以每次点击,其实都是点在dimmer上了,

    因此按钮事件一直没被触发。好吧,有思路了。但是在ie下发现又是正常的,就上网搜了下z-index在google下无效.。

    参考文章:http://www.cnblogs.com/shinnyChen/p/3789420.html

     结论:在chrome22+的浏览器中,position为fixed总是会创建新的重叠上下文,所以子fixed元素在此时会以父fixed元素为层叠上下文,子元素的层叠关系会受到父元素的影响。而在非chrome浏览器下子fixed元素并不会创建新的层叠上下文,fixed元素的层叠上下文为最近的层叠上下文。

         因此,我们应该尽量避免出现fixed元素相互嵌套的问题。如果必须有嵌套的情况,建议修改fixed父元素的z-index值来修正在chrome下fixed子元素的层叠问题。

         看了一下,modal外层的父元素确实是fixed,再看了一下这个样式文件,这个样式是最近才加的.......事件长了,自己都忘记了,

         当时只是简单的调了下样式,调往居然忘了测试,所以现在做新功能才发现问题,哎,自己被自己坑啊。

         总结了一下以后出现类似问题的解决思路:

         1.先确定自己最近修改的部分是否有影响(一定要仔细查看整个项目文件的提交记录).

         2.确认下第三方库最近有没更改.

         3.确认下控件本身是否有问题。

         4.抛开干扰,从最简单的现象入手分析.

  • 相关阅读:
    Spring Boot 属性配置和使用
    spring boot下WebSocket消息推送
    深入理解分布式事务,高并发下分布式事务的解决方案
    HashMap实现原理分析
    JVM 简述
    Java 并发之原子性与可见性
    Java 并发理论简述
    Java读取Properties文件的六种方法
    Java中的注解是如何工作的?
    XML解析——Java中XML的四种解析方式
  • 原文地址:https://www.cnblogs.com/Ferrari/p/7204280.html
Copyright © 2011-2022 走看看