代码之家  ›  专栏  ›  技术社区  ›  Vincent Robert

如何解决IE6中的选择重叠错误?

  •  23
  • Vincent Robert  · 技术社区  · 17 年前

    使用IE时,不能将绝对定位的div放在select输入元素上。这是因为select元素被视为ActiveX对象,并且位于页面中每个HTML元素的顶部。

    FogBugz实际上有一个非常聪明的解决方案(在v6之前),当弹出窗口显示时,将每个选择变成文本框。这解决了bug并欺骗了用户的眼睛,但行为并不完美。

    另一个解决方案是在Fogbugz6中,他们不再使用select元素,而是到处重新编码。

    我目前使用的最后一个解决方案是弄乱IE渲染引擎,并强制它渲染绝对位置 <div> <iframe> 内部 <部门>

    #MyDiv iframe
    {
        position: absolute;
        z-index: -1;
        filter: mask();
        border: 0;
        margin: 0;
        padding: 0;
        top: 0;
        left: 0;
        width: 9999px;
        height: 9999px;
        overflow: hidden;
    }
    

    有谁有比这个更好的解决方案吗?

    编辑:这个问题的目的是提供更多信息,因为它是一个真实的问题。我发现 <iframe> 技巧是一个很好的解决方案,但我仍然在寻找改进,如删除这个

    10 回复  |  直到 7 年前
        1
  •  8
  •   Pbearne    17 年前

    我不知道还有什么比Iframe更好的了

    但我确实想到,这可以通过寻找几个变量添加到JS中

    1. 长方体元素

    那么,一个查找这些项目并只添加iframe层的脚本将是一个不错的解决方案

        2
  •  5
  •   Vlad Vlad    17 年前

    只是一个评论。如果您碰巧是通过SSL运行您的站点,那么伪iframe标记需要指定一个src,否则IE6将发出安全警告。

        <iframe src="javascript:false;"></iframe>
    
    

    我看到一些人建议将src设置为blank.html。。。但我更喜欢javascript的方式。想想看吧

        3
  •  2
  •   Marcelo Cantos    17 年前

    据我所知,只有两种选择,其中更好的是提到的使用iframe。另一种方法是在显示覆盖时隐藏所有选择,从而带来更奇怪的用户体验。

        4
  •  1
  •   IT ppl user1825382    13 年前

    试试这个插件 http://docs.jquery.com/Plugins/bgiframe

    用法: $('.your-dropdown-menu').bgiframe();

        5
  •  0
  •   TheSmurf    17 年前

    我想没有。我一直试图在工作中解决这个问题。隐藏select控件是我们能想到的最好方法(作为一家拥有固定受众的公司商店,用户体验通常不会影响PM的决策)。

    从我在网上寻找解决方案时收集到的信息来看,没有好的解决方案。我喜欢FogBugz解决方案(很多知名网站,比如Facebook,都做过同样的事情),而这正是我在自己的项目中使用的。

        6
  •  0
  •   EndangeredMassa    17 年前

    除非绝对必要,否则我尽量不弄乱iFrame。

        7
  •  0
  •   SamGoody    16 年前

    Mootools有一个使用iframe(称为iframeshim)的非常好的解决方案。

        8
  •  0
  •   rvil    16 年前

    有一个简单而直接的jquery插件称为bgiframe。开发人员创建它的唯一目的是在ie6中解决这个问题。

    我最近用过,效果很好。

        9
  •  0
  •   iDevGeek    15 年前

    隐藏选择元素时,通过设置“可见性:隐藏”而不是“显示:无”来隐藏它们,否则浏览器将重新流动文档。

        10
  •  0
  •   Sacky San    9 年前

    function showOverlay() {
        el = document.getElementById("overlay");
        el.style.visibility = "visible";
        selects = document.getElementsByTagName("select");
        for (var i = 0; i < selects.length; i++) {
            selects[i].style.visibility = "hidden";
        }
    }
    
    function hideOverlay() {
        el = document.getElementById("overlay");
        el.style.visibility = "hidden";
        var selects = document.getElementsByTagName("select");
        for (var i = 0; i < selects.length; i++) {
            selects[i].style.visibility = "visible";
        }
    }