对最近遇到的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. 导入cocos2d-x samples android官方示例

    导了一晚上samples android示例,查了一晚上资料,费了很大的劲,终于成功导入并运行成功,分享一下经验: 1.下载eclipse与ADT跟android SDK,相信大家都会装了吧. 2.下 ...

  2. 打造强大的BaseModel(2):让Model实现自动映射,将字典转化成Model

    打造强大的BaseModel(1):让Model自我描述 这篇文章将讲述Model一项更高级也最常用的功能,让Model实现自动映射–将字典转化成Model(所有代码全由Swift实现) 将JSON转 ...

  3. Modify the average program to promote for intergers repeatedly.stop when a nagetive number is entere

    #include<stdio.h> int main(void) { intcount ,sum,aninterger; printf("enterthe interger an ...

  4. Linux common resources

    Useful Linux Web reources list Linux die manual Linux Man Pages Archive Linux RPM find Linux RPM Sea ...

  5. sql2012 新增 OFFSET/FETCH

    SQL Server 对行数的排序提供了 TOP 筛选.SQL Server 2012 新增了 OFFSET 筛选. 一.TOP 筛选 如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回 ...

  6. JS插件-日期

    原文出处 源码下载 原文出处 源码下载

  7. 搭建用友开发环境(基于碧桂园的nchome)

    1.解压uap_studio6.3 2.授权 3.解压ufjdk.rar到指定路径 4.配置java的环境变量 5.解压BGY50602.7z到指定目录 6.然后在studio中导入BYG5002 7 ...

  8. web开发学习之旅---html第二天

    一.转义符 一些字符在html中拥有特殊的含义,比如小于号(<)用于定义 HTML 标签的开始.如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入转义符. 分类 二.html ...

  9. win10 Administrator

    和Win7/Win8.1一样,Win10的管理员账户Administrator是默认隐藏和关闭的,因为该账户权限极高,被不法分子利用后存在极大风险.但如果你想在某些特殊情况下使用该账户,就需要手动将其 ...

  10. UIWebView和UIActivityIndicatorView的结合使用

    环境:Xcode6.1 UIWebView是iOS开发中常用的一个控件,是内置的浏览器控件,我们可以用它来浏览网页,加载文档等.这篇文件将结合UIActivityIndicatorView控件制作一个 ...