zoukankan      html  css  js  c++  java
  • 【转】隐藏元素的子元素隐藏无效

    原文

    将某元素隐藏后,对其原本显示的子元素进行display:none操作,当再把这个元素显示出来的时候,在ie678的兼容模式下会发现子元素的隐藏无效.
    感谢ooxx君给找的这个DEMO页,要重现bug请使用欢乐的IE系列浏览器打开.
    博主用了一个很有爱的兔子向大家展示这个神奇的魔术:

    1,把容器和兔子的position都设为relative或者absolute

    2,把容器的display设为none;

    3,把兔子的display设为none;

    4,再把容器的display设为block

    (你看,IE总是会给你惊喜的对不)

    在IE678的兼容模式下你仍然会看到这只兔子,尽管是你亲手给他设置的display:none,当然你也许会觉得这是什么障眼术,然后你肯定会坚持打开调试器然后手动给这个兔子重新写上display:none,但是它依旧坚挺!啊哈,这就是魔术对不.

    这个bug出现的条件是:

    1, IE678的兼容模式下,IE8的默认模式, Firefox3, Opera9, Safari3 on Windows, Safari 3 on Mac, Chrome都不会重现.

    2,容器和子元素(上面的那只兔子代表的元素)的定位都必须不是satatic的,只能是relative,或者absolute.

    3,顺序必须是先把容器隐藏,再把子元素隐藏,如果顺序不对,这个魔术就会搞砸.

    4,这个bug只会发生在隐藏后的元素中,并且这是在页面完全载入后.

    解决的办法

    1,临时性地把子元素的 display 由 none 设为 block 然后再设回 none

    2,临时性地把子元素的 position 由 relative 设为 absolute 然后再设回 relative (反之一样.)

    3,临时性地子元素的 visibility 设为 hidden 然后再设回去(但是这个只发生在子元素的position为absolute的时候)

    今天跟OOXX君讨论的结果是可以在将容器隐藏前就先对其子元素隐藏,这种方法或许实现起来看上去更正常一些.

    The Wonderful World Of IE!

  • 相关阅读:
    用ADO方式连接Excel
    RTX51 tiny系统容易混淆的问题
    学用NHibernate(一)
    Firefox兼容性
    使用WebClient后的Response编码的问题
    学用ASP.NET2.0
    安装CS2.0 Beta2 到SQL2005+Asp.Net2.0下
    AJAXSLT 的bug修正(2)
    Asp.Net开发小技巧
    URL重写,友好的URL
  • 原文地址:https://www.cnblogs.com/pipizhu/p/2295123.html
Copyright © 2011-2022 走看看