解决DIV遮盖select的方法

由于IE存在一个bug,会使得DIV层无法遮盖select控件。
我今天说的解决方法是用iframe找到的。其实这个问题的解决方法我今天在网上搜也会很多,不过大部分都是直接用html来实现的。但在实际应用中,我们会更倾向与用js动态生成对象来进行封装。

首先这个实现方式是从google-suggest那得到的启发,起初看suggest的js代码的时候,发现它里面用到了iframe,但是不清楚和div究竟是怎么关联上而又不互相影响的。昨天突然想到可以用selenium的viewdom模块看到其生成的dom对象是如何的,后来发现,suggest是通过两个div来实现的,一个专门用于包含iframe,一个专门用于表现数据,然后再将这两个div重叠即可。很巧妙,但是我怎么没想到。这就应了那句话:简单的才是美的。

现在开始说代码,hoho。
首先是用于遮盖select的层:s

// 创建层
var s=document.createElement("DIV");

// 设置层的相关属性
s.style.visibility="";

// 定义层的样式
s.style.position="absolute";
s.style.left="200";
s.style.top="100";
s.style.width="500";
s.style.height="90";
s.style.border="black 1px solid";
s.style.backgroundColor="white";

// 生成iframe
var L=document.createElement("IFRAME");
L.name="completionFrame";

// 定义iframe的样式,宽高与s相同
L.width=s.style.width;
L.height=s.style.height;

// 附加L到s
s.appendChild(L);

// 显示s
document.body.appendChild(s);

其次是你要表现数据的DIV层:t
js如下:

// 创建层
var t=document.createElement("DIV");

// 设置相关属性
t.style.visibility="";
t.zIndex=1;

// 定义样式表,长宽高和定位等
t.style.position="absolute";
t.style.left="200";
t.style.top="100";
t.style.width="500";
t.style.height="90";
t.style.border="blue 1px solid";
t.style.backgroundColor="white";

// 定义你要表现的内容
t.innerHTML = "Hello World";

// 显示
document.body.appendChild(t);

这样就大功告成了,经过测试,在ie和firefox下都是可以的。

这里有几个问题需要说明一下:

  1. 生成的L(IFRAME)我并没有指定其src,但是不影响效果。google-suggest里的iframe对象指定了src:http://www.google.com/webhp?complete=1&hl=en,其实就是一个空白页,我想这么写起来可能更严谨一些吧
  2. 按照我上面写的代码,在实际显示的时候,包含iframe的div层可能会稍大一些,也就是会露出“白边”,大家在实际使用的时候可以进行调整
  3. 注意两个层显示的顺序,也就是append到body的顺序,我是先让包含iframe的层显示,再让显示数据的层显示,如果调换,包含iframe的层就会遮住表现数据的层,即使是改两个层的zindex也不能解决,希望有人能关注一下哈
  4. 如果你拷贝我的代码到你的script中,发现不能运行,有可能是你网页编码的问题,因为我的注释全都是用的中文,如果你用en或utf8输出的话,可能就会有问题
  5. 即使是用iframe,在ie下仍然会有一个bug,就是如果其遮盖的地方有获得焦点的输入框时,它无法遮盖那个闪烁的光标。这个问题在gmail里面也没有解决。不过可以通过一些focus操作来解决这个小小的bug。

这里我只写了js实现的部分,有兴趣的同学可以试着自己封装一下,就先写到这,先去洗衣服了···

想看例子的同学请看这篇文章:http://www.leeyupeng.com/?p=265

16 条评论

  1. 非主流童话:

    收藏,慢慢研究 :D

  2. Echo:

    不懂…踩一脚…:(

  3. xLight的蓝闪小窝 » 好文推荐 - 两个div的技巧:

    [...] 详情请见:解决DIV遮盖select的方法 [...]

  4. xiao卫:

    :!: 你把这个做个范例发给我研究研究啊!玉鹏,我的信箱是:bert1100@126.com

  5. leonzhu211@gmail.com:

    咋就不上传两个简单的页面来示例一下呢

  6. www:

    :money:

  7. Daniel:

    Readed

    I loathe people who keep dogs. They are cowards who haven’t got the guts to bite people themselves

  8. dohkoos:

    原因3可能是‘表现数据的层’没有设置position:absolute;

  9. 不懂就问:

    :surprised: 写的太麻烦!
    上网上找找就一句代码的问题

  10. 匿名:

    :surprised:

  11. bianbian:

    不错,呵呵。

  12. 匿名:

    :zk: :emtf: :down: :down: :down: :down: :down: :???: :idea: :vacuity: :arrow: :hard: :love: :sweat: :love: :?: :!: :mad: :mad: :lol: :mad: :redface: :redface: :arrow: :vacuity: :hard: :money: :faint:

  13. 匿名:

    :mrgreen: :neutral: :smile: :grin: :sad: :surprised: :shock: :???: :cool: :lol: :mad: :razz: :redface: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :faint: :zk: :down: :ill: :affect: :sweat: :love: :hard: :vacuity: :money: :emtf:

  14. 匿名:

    :mrgreen:

  15. 匿名:

    :mrgreen: :neutral: :smile: :grin: :sad: :surprised: :shock: :???: :cool: :lol: :mad: :arrow: :idea: :?: :!: :wink: :roll: :twisted: :evil: :cry: :redface: :razz: :faint: :zk: :down: :ill: :affect: :sweat: :love: :hard: :vacuity: :money: :emtf:

  16. liwen:

    很多年后又遇到了这个问题,多谢鹏鹏~ :)

留下评论