`
jiataibin
  • 浏览: 41600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

解决DIV层被Select覆盖的问题

阅读更多

       参考一下资料:

1. http://blog.csdn.net/URL/archive/2005/04/27/365525.aspx

2. http://www.leeyupeng.com/?p=258

综合这两篇文章的内容,可以很轻易的解决上述问题.



       在IE里,层DIV被下拉框SELECT遮盖,这是IE的bug之一,原因在于select的优先级别比div高。因此无论如何用css属性z-index设置都没用。

所以,解决的办法有两种

在显示div的时候隐藏所有select
让div里的内容比select的优先级还要高

第一种方法显然比较麻烦,特别是当select比较多且位置不固定的时候,很容易将不该隐藏的也隐藏了。

第二钟办法更好一些。常用的优先级比select高的HTML控件有object和iframe,我选用了iframe比较好。

原理就是在div种加入一个iframe,然后把需要显示的内容write到iframe的body中。

参考代码如下:

var oIframe = document.createElement("<iframe name=\"oIframeFilter\" frameborder=\"0\"></iframe>")

if (oDivFilter.children.length != 0) oDivFilter.removeChild(oDivFilter.children(0));

oDivFilter.appendChild(oIframe);

window.frames[oIframe.name].document.write("<link rel=\"stylesheet\" href=\"/style/css.css\" type=\"text/css\">");

sBody = "<table><tr><td>哈哈哈哈</td></tr></table>";

window.frames[oIframe.name].document.write(sBody);

此外,还需要注意iframe的属性allowTransparency就不能再用了,因为透明就让iframe更高的优先级失效了。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=365525

 

由于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下都是可以的。

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

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

分享到:
评论

相关推荐

    解决div总是被select遮挡的问题.rar

    在本案例中,"解决div总是被select遮挡的问题.rar"提供了解决方案,通过引入一个透明的`iframe`来规避这一现象。 首先,我们需要理解Z轴顺序的概念。在CSS中,`z-index`属性用于指定元素在堆叠上下文中的层级。具有...

    解决IE6 中select 穿透 div 等层的问题

    在互联网的早期,Internet Explorer 6 (简称IE6) 是一款广泛应用的浏览器,但它的兼容性和渲染机制存在诸多问题,其中一个问题就是“select穿透div”的现象。这个问题在现代浏览器中通常不会出现,但在IE6中,`...

    解决IE6中 Div层挡不住Select组件

    "解决IE6中 Div层挡不住Select组件"这个问题是一个典型的例子,它反映了IE6在CSS层叠样式和Z-index处理上的独特行为。 在现代浏览器中,我们可以利用CSS的`z-index`属性来控制元素的前后堆叠顺序,从而让某些元素...

    ie6下select覆盖div的解决办法

    总的来说,解决IE6下的Select覆盖Div问题需要根据实际情况灵活运用上述方法。在现代浏览器广泛使用的今天,虽然IE6的市场份额已经非常小,但考虑到部分用户可能还在使用,开发者仍需关注此类兼容性问题。在解决这类...

    IE6下div层被select控件遮住的问题解决方法

    总结来说,面对IE6中的`div`层被`select`控件遮住的问题,我们可以利用`iframe`作为遮罩,并通过设置`z-index`和动态调整`iframe`尺寸的方法来解决。虽然这个方法在现代浏览器中可能不再适用,但对于仍然需要支持IE6...

    DIV 层 select

    然而,当 `DIV` 层和 `select` 元素在同一页面中使用时,可能会遇到一些交互和视觉上的问题,尤其是当 `DIV` 层覆盖在 `select` 元素上时。 问题描述中提到的“郁闷问题”可能指的是以下几种情况之一: 1. **点击...

    ie6下DIV覆盖select框js解决代码

    总结来说,解决IE6下`div`覆盖`select`框的问题需要理解浏览器的层叠上下文规则,并利用JavaScript动态调整元素的样式。虽然这种问题在现代浏览器中很少出现,但在维护旧项目或考虑跨浏览器兼容性时,理解并掌握这种...

    让div浮动在select之上的完美解决方案!多浏览器兼容

    在网页设计中,有时我们需要使一个`div`元素覆盖或浮动在`select`元素之上,以便实现特定的交互效果,如弹出层、提示信息或者自定义下拉菜单等。然而,由于浏览器之间的渲染差异,这往往成为一个挑战。本文将探讨...

    解决DIV在IE下被下拉列表select穿透的问题(二)

    标题"解决DIV在IE下被下拉列表select穿透的问题(二)"所提及的,是一个典型的IE浏览器特有的问题。这个问题涉及到HTML中的`&lt;div&gt;`元素和`&lt;select&gt;`下拉列表之间的交互,具体表现为在Internet Explorer(特别是旧版本...

    解决DIV在IE下被下拉列表select穿透的问题(一)

    标题提到的“解决DIV在IE下被下拉列表select穿透的问题(一)”是一个典型的老版IE浏览器渲染问题。在某些情况下,当一个HTML页面中的select元素被点击时,其下拉选项可能会穿透并显示在覆盖在其上方的其他DOM元素(如...

    最顶层div被flash或者下拉列表遮挡的问题解决

    ### 最顶层div被flash或者下拉列表遮挡的问题解决 在网页设计中,有时会出现顶层的div元素被其他元素如Flash或下拉列表遮挡的情况。这种遮挡问题通常是由于CSS定位属性设置不当造成的,尤其是`z-index`值的设置不...

    解决 Ie 6下 select挡住div的通用函数

    /** * 让iframe 显示在 指定的div下面 针对ie6 select挡住div 的bug 采用 iframe来当作div的底 * * @param string divId 需要解决的div层 * @param string iframeId 采用的 IFRAME ,如果不指定 自动...

    ie6下select遮挡div

    1. 使用jQuery bgiframe插件:该插件创建一个透明的iframe层,将被遮挡的div覆盖在select之上,从而避免遮挡问题。 2. 避免使用绝对或相对定位:改用其他布局方式,如使用浮动(float)或Flexbox(对于现代浏览器)...

    IE6下Select元素被div等元素覆盖的解决办法

    在IE6浏览器中,一个常见的布局问题是下拉选择框(select元素)在使用div元素制作蒙版或弹出层时会被覆盖,即使给div设置了更高的z-index也无法解决。此问题的根本原因在于IE6对z-index属性的解释与其它浏览器不同,...

    Div Select挡住的解决办法

    在网页设计中,有时会遇到一个常见的问题,即`Div`元素下的下拉菜单(`Select`元素)会被`Div`本身挡住,导致用户无法正常交互。这个问题在标题和描述中提到,我们可以从HTML和CSS的角度来探讨解决方法。 首先,...

    IE6下 Jquery EasyUI 弹出窗口层无法挡住select 组件 解决方案

    本文将详细探讨一个特定的问题,即在Internet Explorer 6(IE6)环境下,使用JQuery EasyUI时,弹出窗口(对话框)无法正确遮挡页面上的select组件,以及如何解决这一问题。 JQuery EasyUI是一个基于jQuery的UI库,...

    用JavaScript来美化HTML的select标签的下拉列表效果

    通过上述的方法,开发者可以解决select下拉列表在不同浏览器下默认样式不一致的问题,并通过JavaScript为用户提供更加美观和友好的交互体验。同时,使用这种方法也可以增强select的功能,比如添加搜索功能,支持多选...

    解决layer 动态加载select 失效的问题

    然而,在layer的弹出层中使用一些基于原生select进行美化和增强的插件时,可能会遇到问题。这是因为这类插件通常会将原生的select元素隐藏,然后用div等元素构建出具有特定样式的模拟选择框。这种方式在普通的页面中...

Global site tag (gtag.js) - Google Analytics