对最近遇到的2个问题的一点总结。

1.IE filter & z-index

重构后的首页即将上线,测试提出fix导航条扩展菜单在ie789滚动后一段无法显示的问题。

疑云重重:

这个问题一开始一度以为是fix本身的bug,因为之前顶部的滚动切换是写成了500固定值,并没留意到bug触发真正机理,加之fix在ie低版本确实存在一些问题,但是base库中tb函数本身并不存在问题。

之前的扩展菜单都是用js动态去算位置,个人觉得这样滥用js是极为不好的,使用css来制作,扩展菜单是作为主菜单的子元素一部分,给予扩展菜单相对主菜单绝对定位即可,css可以很好的实现它,并且代码也更加优美。

初步猜测:

昨个自己优化复测时发现在平板竖屏下,由于slider高度变得较小,如果再滚500再触发感觉就体验较差(本来想把关联设定成可自定义的元素,不过为了避免近期改动较多暂时搁置)。

由于改了这个数值后,当再次检测这个Bug时,可以清晰发现就是在触发scroll切换导航条class后发生了这个bug。

如果研究过ie filter的机制就马上能想到原因了,不了解的可以拿透明边框(ts)在ie6下测试,能更好的理解filter的镂空原理。

故而想到了,因为是后来触发了filter,而触发filter的时候,此时display:none的扩展菜单被直接镂空处理了,而箭头是用伪元素制成的,可以看出来伪元素不受影响?

感谢斌哥一起帮忙耐心测试。到这里,我以为:ie filter处理,针对自身元素,包含子元素,但不包括伪元素。当有hide/show切换的子元素时,会造成该元素镂空。

豁然开朗:

正好周末回家,准备再次梳理一下,打开test再次测试,却发现远不是那么简单。

例如我们写一个父元素,父元素为半透明,有应用filter,里面装个子元素,子元素通过位移离开父元素的元素占位区间。

测试结果1:子元素默认可见,通过margin位移,此时,尽管子元素并没有display:none,它依旧无法显示,包括伪元素。

测试结果2:子元素默认可见,通过绝对定位位移,表现正常,包括伪元素。

测试结果3:子元素默认隐藏,通过绝对定位位移,表现正常,包括伪元素。

到这里为止我们可以确定,其实ie的filter只是自身平面上元素,而绝对定位的子元素并不受影响,也就是说和display:none没有半毛钱关系。

对比线上案例,线上案例就是绝对定位呀,为什么却不显示呢,并且箭头,伪元素是显示的。

打开IE11审查工具测试可知,js操作正常,扩展菜单也确确实实存在,取消父级filter确实就能显示了,但这和本地的测试并不一致。

冥思苦想片刻,这并不是上面推理出来的结论错误。

注意到父级是有设置z-index的,惊奇的发现,这个现象和父级与子级的z-index并没有半毛钱关系,不论数学逻辑关系如何,关键是父级有设置z-index时,则回到测试结果1的现象。

最后查一下stackoverflow和google,终其原因还是filter与z-index的渲染绘制冲突原因。

虽然其他童鞋给出了其他可以参考的解决方案,但是我认为最佳的考虑方案还是直接上png半透明背景图。

http://tagsoup.github.io/blog/2011/12/29/ms-filters-make-me-hate-life-memoirs-of-a-fe-ender/

http://stackoverflow.com/questions/13780124/z-index-or-overflow-issue-on-a-css-menu-with-gradient-background-in-ie-9

http://www.telerik.com/forums/menu-z-index-issue-ie-8-and-9

2.display:none 与 visibility:hidden

还是上面的菜单,由于考虑兼容的问题,必须js动态给予扩展菜单宽度。

由于本身扩展菜单宽度实际上只能是等同于主菜单,并且由于每个li的宽度并不一致,我们通过css设置禁止折行后,需要逐一获取每个li单元的宽度累加。

但是如果菜单默认是display:none的话,则所有的css属性为空,转换为数值后则为0,则无法正常渲染,除非这个行为发生在show的回调函数中,但是如果写在show的回调中,菜单的内容会逐一蹦出来,这也不是我们要的效果。

故,部分类似情况下,应用hidden代替none。

IE filter & z-index bug的更多相关文章

  1. 仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)

    转载请说明原出处,谢谢 今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI ...

  2. 请小心使用 ng-repeat 中的 $index

    自己自学的时候,遇到$index不知道它是如何使用的,所以上网搜了一下,发现了这个关于使用$index可能会出现的一个小BUG,和大家分享一下 PS:我是小白,欢迎指正,非常感谢! 以下是全文: &q ...

  3. ng-repeat 中的 track by $index

    用ng-repeat指令遍历一个javascript数组,当数组中有重复元素的时候,angularjs会报错,这是因为ng-Repeat不允许collection中存在两个相同Id的对象. 对于数字或 ...

  4. MySQL 优化之 ICP (index condition pushdown:索引条件下推)

    ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...

  5. Java Web之Filter

    Filter被称为过滤器或者拦截器,基本功能就是对调用servler过程的拦截,在servlet进行响应和处理前后实现一些特殊功能.其实,Filter过滤器就是一个实现了javax.servlet.F ...

  6. jquery .filter()过滤器

    述: 筛选元素集合中匹配表达式 或 通过传递函数测试的 那些元素集合. .filter( selector ) selector 类型: Selector                 一个用于匹配 ...

  7. Filter技术+职责链模式

    Filter是一个过滤器,存在Webclient与请求的资源之间.这里的资源能够说是jsp或servlet.它的作用就是在请求达到资源之前,先对请求进行预处理.而且也能够对servlet处理后的res ...

  8. Vue.js根据列表某列值更新filter

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. js数组中的find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()方法的详解和应用实例

    1. find()与findIndex() find()方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该 ...

  10. js数组遍历(for in ,for of ,map,foreach,filter)的区别

    一.for in 和for of 的区别 1.for in 遍历数组时,索引实际上是字符串类型的数字,不能进行运算,我们来输出一下: let arr = [1,3,5,4] for (let inde ...

随机推荐

  1. MVC - 基础

    什么是MVC模式 传统的WebForm发展到如今出现不少的缺陷 比如为了解决Http的无状态 WebForm模式使用了ViewState来保存客户端和服务端数据 过量的使用则会造成页面臃肿不堪 大量服 ...

  2. 自定的TableView

    一.自定的TableView 有的时候,我们需要vc视图中添加一个表视图,此时在ViewController中使用TableViewController是不可行的这就,因此就要使用自定义的TableV ...

  3. Android 自学之帧布局 FrameLayout

    帧布局(FrameLayout)直接继承了ViewGroup组件: 帧布局容器为每一个加入其中的组件都创建了一个空白的区域,这个区域我们称之为一帧,所有每个组件都占据一帧,这些都会根据gravity属 ...

  4. 迭代器模式(Iterator Pattern)

    迭代器模式定义:Iterator Pattern提供一种方法顺序访问一个聚合元素中的各个元素,而又不暴漏内部方法 酒吧提供beer和wine: public class Bar { private L ...

  5. Java并发——ReentrantLock类源码阅读

    ReentrantLock内部由Sync类实例实现. Sync类定义于ReentrantLock内部. Sync继承于AbstractQueuedSynchronizer. AbstractQueue ...

  6. YII中文件上传

    文件上传 1.视图文件代码 <?php $form = $this->beginWidget("CActiveForm",array( "action&quo ...

  7. WebWork2和Spring MVC Framework的比较

    http://daihaixiang.blog.163.com/blog/static/3830134200711411515336/ WebWork2和Spring MVC Framework的比较 ...

  8. 腾讯海量数据处理平台TDW

    TDW是腾讯海量数据处理平台中最核心的模块,它有以下几个作用: 提供海量的离线计算和存储服务.TDW是腾讯内部规模最大的离线数据处理平台,公司内大多数业务的产品报表.运营分析.数据挖掘等的存储和计算都 ...

  9. 20160314 Request 和Response

    一.Response 1.Resonse的继承结构: ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容 ...

  10. Force removing ActivityRecord,app died, no saved state报错的理解

    为什么说理解呢?出现这个问题,我的情景是,在activity里面直接起了一个Thread,线程里面进行了一个繁重的任务,当线程执行完后,这个activity也销毁了,界面显示的任务栈下面的一个活动.百 ...