`
jy00509336
  • 浏览: 243619 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

select挡住div的5种解决方法

 
阅读更多

转载自:http://hi.baidu.com/suofang/blog/item/72f2f7ed23f2324e78f055c4.html

在IE中,select属于window类型控件,它会“挡住”所有非window类型控件
可以这么理解,div这样的组件是在浏览器客户区使用代码“渲染”的,
他们被渲染在客户区的绘画表面上,
而select是使用的标准windows控件,只是作为客户区的子控件放置而已,
它会覆盖所有客户区绘画表面上“画”出来的一切,但不一定会覆盖其他类型的window控件,
比如iframe和其他的select,如果你使用过类似Delphi这样的环境就会自然理解。IE7解决了此类BUG。

有多种种办法;
1. 修改select,不用标准select,而是自己用其他html元素模拟
2. 修改你的div,使用iframe。
3. 在div被显示的时候或者到达select所在位置时隐藏select
4. 在div中或div的同一坐标上,用相同尺寸的iframe先遮挡一下,然后在iframe上显示div的内容。
5.Object对象的优先度较高,可以挡住select框

以下例子系网上资源整理

原址:http://hi.baidu.com/suofang/blog/item/72f2f7ed23f2324e78f055c4.html

第4种方法的例子:最好的方法:iframe来当作div的底

Div被Select挡住,是一个比较常见的问题。   
      有的朋友通过把div的内容放入iframe或object里来解决。   
      可惜这样会破坏页面的结构,互动性不大好。   
    
      这里采用的方法是:   
    
      虽说div直接盖不住select   
      但是div可以盖iframe,而iframe可以盖select,   
      所以,把一个iframe来当作div的底,   
      这个div就可以盖住select了.   


<html>
<head>
<script>
function DivSetVisible(state)
{
var DivRef = document.getElementById('PopupDiv');
var IfrRef = document.getElementById('DivShim');
if(state)
{
DivRef.style.display = "block";
IfrRef.style.width = DivRef.offsetWidth;
IfrRef.style.height = DivRef.offsetHeight;
IfrRef.style.top = DivRef.style.top;
IfrRef.style.left = DivRef.style.left;
IfrRef.style.zIndex = DivRef.style.zIndex - 1;
IfrRef.style.display = "block";
}
else
{
DivRef.style.display = "none";
IfrRef.style.display = "none";
}
}
</script>
</head>
<body>
<form>
<select>
<option>A Select Box is Born ....</option>
</select>
</form>
<div id="PopupDiv" style="position:absolute; top:25px; left:50px; padding:4px; display:none; background-color:#000000; color:#ffffff; z-index:100">
.... and a DIV can cover it up<br/>through the help of an IFRAME.
</div>
<iframe id="DivShim" src="javascript:false;" scrolling="no" frameborder="0" style="position:absolute; top:0px; left:0px; display:none;">
</iframe>
<br/>
<br/>
<a href="#" onclick="DivSetVisible(true)">Click to show DIV.</a>
<br/>
<br/>
<a href="#" onclick="DivSetVisible(false)">Click to hide DIV.</a>
</body>
</html>

第3种方法的例子:最直接的方法:隐藏下拉框.

下面提供的是一个比较通用的一组函数:

test.htm

------------

<script>
var HideElementTemp = new Array();
//点击菜单时,调用此的函数,菜单对象
function cal_hideElementAll(obj){ 
            cal_HideElement("IMG",obj);
            cal_HideElement("SELECT",obj);
            cal_HideElement("OBJECT",obj);
            cal_HideElement("IFRAME",obj);
}
function cal_HideElement(strElementTagName,obj){
try{
        var showDivElement = obj;
        var calendarDiv = obj;
        var intDivLeft = cal_GetOffsetLeft(showDivElement);
        var intDivTop = cal_GetOffsetTop(showDivElement);//+showDivElement.offsetHeight;
        //HideElementTemp=new Array()
        for(i=0;i<window.document.all.tags(strElementTagName).length; i++){
var objTemp = window.document.all.tags(strElementTagName)[i];
if(!objTemp||!objTemp.offsetParent)
         continue;
var intObjLeft=cal_GetOffsetLeft(objTemp);
var intObjTop=cal_GetOffsetTop(objTemp);
if(((intObjLeft+objTemp.clientWidth)>intDivLeft)&&
        (intObjLeft<intDivLeft+calendarDiv.style.posWidth)&&
        (intObjTop+objTemp.clientHeight>intDivTop)&&
        (intObjTop<intDivTop+calendarDiv.style.posHeight)){
         //var intTempIndex=HideElementTemp.length;//已经有的长度
      //save elementTagName is stutas
         //HideElementTemp[intTempIndex]=new Array(objTemp,objTemp.style.visibility);
         HideElementTemp[HideElementTemp.length]=objTemp
         objTemp.style.visibility="hidden";
            }
        }
}catch(e){alert(e.message)
}
}

function cal_ShowElement(){
        var i;
        for(i=0;i<HideElementTemp.length; i++){
var objTemp = HideElementTemp[i]
if(!objTemp||!objTemp.offsetParent)
         continue;
objTemp.style.visibility=''
        }
        HideElementTemp=new Array();
}
function cal_GetOffsetLeft(src){
        var set=0;
        if(src && src.name!="divMain"){
            if (src.offsetParent){
               set+=src.offsetLeft+cal_GetOffsetLeft(src.offsetParent);
}
if(src.tagName.toUpperCase()!="BODY"){
         var x=parseInt(src.scrollLeft,10);
         if(!isNaN(x))
                set-=x;
}
        }
        return set;
}

function cal_GetOffsetTop(src){
        var set=0;
        if(src && src.name!="divMain"){
            if (src.offsetParent){
                set+=src.offsetTop+cal_GetOffsetTop(src.offsetParent);
       }
if(src.tagName.toUpperCase()!="BODY"){
         var y=parseInt(src.scrollTop,10);
         if(!isNaN(y))
      set-=y;
}
        }
        return set;
}

</script>
<select></select>
<select></select>
<div style="position:absolute;left:0;top:0;width:100;height:100;background-color:red" onclick="cal_hideElementAll(this)">
点击让select隐藏
</div>
<br><br><br><br><br><br>
<input type="button" value="点击让select显示" onclick="cal_ShowElement()">

以上这种方法,如果对于select框数目少,相对固定的话,直接用obj.style.visibility="hidden"这样进行隐藏是更直接的.

第2种方法:用iframe作载体

以下是一简单的例子:

-----------

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>简单菜单</title>
<!--
提供定位函数,用iframe作载体,不会被select挡住
By Fason(2003-5-21)
-->
<style id=s>
#div1{
position:absolute;
z-index:100;
width:100;
height:130;
background-color:#d2e8ff;
border:1 solid black;
}
div{cursor:hand;font-size:12px;}
a{text-decoration:none;color:red;font-size:12px}
</style>
</head>
<body>
<script>
function window.onload(){
var shtml=div1.innerHTML;
var ifm=document.createElement("<iframe frameborder=0 marginheight=0 marginwidth=0 hspace=0 vspace=0 scrolling=no></iframe>")
ifm.style.width=div1.offsetWidth
ifm.style.height=div1.offsetHeight
ifm.name=ifm.uniqueID
div1.innerHTML=""
div1.appendChild(ifm)
window.frames[ifm.name].document.write(s.outerHTML+"<body leftmargin=0 topmargin=0>"+shtml+"</body>")
}

function show(){
with(document.all.img1){
x=offsetLeft;
y=offsetTop;
objParent=offsetParent;
while(objParent.tagName.toUpperCase()!= "BODY"){
x+=objParent.offsetLeft;
y+=objParent.offsetTop;
objParent = objParent.offsetParent;
}
y+=offsetHeight-1
}
with(document.all.div1.style){
pixelLeft=x
pixelTop=y
visibility=''
}
}
function hide(){
document.all.div1.style.visibility='hidden'
}
</script>
<img id=img1 onmouseover="show()" onmouseout="hide()" src="ie.gif"><br><select></select>
<div id=div1 onmouseover="style.visibility=''" onmouseout="style.visibility='hidden'" style="visibility:hidden;">
<div href="http://www.csdn.net" onmouseover="style.backgroundColor='highlight'" onmouseout="style.backgroundColor=''" onclick="window.open(href)">中国程序员</div>
<div href="http://www.sohu.com" onmouseover="style.backgroundColor='highlight'" onmouseout="style.backgroundColor=''" onclick="window.open(href)">sohu</div>
</div>
</body>
</html>

第5种方法:Object对象的优先度较高,可以挡住select框

<OBJECT id=aa style="display:none;z-index:1000; position:absolute; top:0; left:0; width:152; height: 200;" type="text/x-scriptlet" data="about:<body><div style='position:absolute;left:0;top:0;width:152;height:200;font:14;color:white;background:black;border:1 solid black'>test</div>"></OBJECT>
<select><option>hellohellohellohello</select><button onclick=aa.style.display=aa.style.display=="none"?"":"none">test</button>

这种方法虽然也简单,但对复杂的层是来说还不是好的解决方法.

分享到:
评论

相关推荐

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

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

    option挡住div解决方法

    Div下拉菜单被Select挡住的解决办法 下拉菜单 bbbbbbb ccccccc ccccccc ccccccc ccccccc test0 test1 test2 test3 Div被Select挡住,是一个比较常见的问题。 有的朋友通过把div的内容放入iframe或object里来...

    Div Select挡住的解决办法

    解决这个问题的一种巧妙方法是在`Div`内部添加一个透明的`Iframe`元素,将`Iframe`的`z-index`设置为更低的值,如-1,并设置其大小和位置完全覆盖`Div`。这样,虽然`Div`不能直接覆盖`Select`,但`Iframe`可以。由于...

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

    2. **调整div的`z-index`值**:另一种方法是确保div元素的`z-index`值足够高,以覆盖Flash对象。例如,如果Flash对象没有指定`z-index`值,则可以将div元素的`z-index`值设置为一个较高的正数值,使其显示在Flash...

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

    解决这个问题的方法有几种: 1. **修改CSS**:为弹出窗口的div添加一个更高的z-index值。然而,由于IE6的限制,这可能不足以解决问题。还需要确保select元素的z-index低于dialog。 2. **隐藏select元素**:当弹出...

    layui layer select 选择被遮挡的解决方法

    解决方法:在页面里面找到对应div的class 给overflow新的属性visible即可(默认值。内容不会被修剪,会呈现在元素框之外。)即可显示出下拉框 1.找到层1 的overflow 属性, 修改成为visible. 2. 如果有层2, 就把层2的...

    解决layer弹层遮罩挡住窗体的问题

    解决layer弹层遮罩挡住窗体问题的关键在于理解DOM元素的层级关系。通过调整遮罩层的DOM位置,使其与弹窗内容在同一层级,可以有效地防止遮罩层遮挡弹窗。此外,保持良好的HTML结构和合理使用layer提供的事件回调,也...

    使用iframe作为日历的载体,不再被select和flash等控件挡住的日期输入框

    为了解决上述问题,本文提出了一种解决方案:使用iframe作为日历层的载体。这种方法的核心在于利用iframe的特性——即它可以在页面内嵌入另一个完整的HTML文档,这个子文档拥有独立的窗口上下文,与主文档互不影响。...

    Dreamwear设计常用代码 46-52.docx

    6. **解决select挡住div问题**: 当`&lt;select&gt;`元素覆盖了其他内容时,可以使用一个透明的`&lt;iframe&gt;`作为遮罩层来解决。例如: ```html &lt;div&gt; style="z-index:-1;position:absolute;top:5px; left:2px;width:...

    layui: layer.open加载窗体时出现遮罩层的解决方法

    针对标题和描述中提到的“layui: layer.open加载窗体时出现遮罩层的解决方法”,我们可以采取以下策略: 1. **调整 `shade` 参数**: 在 `layer.open` 的配置对象中,`shade` 参数用于设置遮罩层的透明度,其值为0...

    js非常好用的代码,不要错过!

    - 可以在div内部插入一个透明的iframe,通过设置其样式(如 `z-index:-1`,`position:absolute` 等),使其位于select元素之上,从而防止select下拉菜单挡住div内容。 8. iframe自适应高度(跨域问题): - 当...

    解决控件遮挡问题:关于有窗口元素和无窗口元素

    一种常见的方法是将可能被遮挡的元素(如DropdownList)包裹在一个具有高z-index的&lt;div&gt;元素内。例如: ```html &lt;DIV id="PAL2" style="DISPLAY: inline; Z-INDEX: 8; LEFT: 80px; WIDTH: 360px; POSITION: ...

    jquery插件模糊查询的文本框

    jquery的一个插件 文本框的糊查询,支持本地数据源和ajax异步数据请求 支持文本框的状态,如果不是手工输入,而是通过选择到文本框的值,将可取到...解决IE下div不能挡住select object flash等的标签的显示优先级问题

    jquery插件ajax方式实现百度谷歌文本框糊模查询

    jquery插件ajax方式实现百度谷歌文本框糊模查询 文本框的糊查询,支持本地数据源和ajax异步数据请求 支持文本框的状态,如果不是手工输入,而是通过选择...DIV在IE下不能挡住select object flash等标签的显示优先级问题

Global site tag (gtag.js) - Google Analytics