自知其無知
          不懂,慢慢懂。
          posts - 2,comments - 2,trackbacks - 0
          select擋住div的5種解決方法
          2007年04月02日 星期一 下午 04:42

           

          在IE中,select屬于window類型控件,它會“擋住”所有非window類型控件
          可以這么理解,div這樣的組件是在瀏覽器客戶區(qū)使用代碼“渲染”的,
          他們被渲染在客戶區(qū)的繪畫表面上,
          而select是使用的標(biāo)準(zhǔn)windows控件,只是作為客戶區(qū)的子控件放置而已,
          它會覆蓋所有客戶區(qū)繪畫表面上“畫”出來的一切,但不一定會覆蓋其他類型的window控件,
          比如iframe和其他的select,如果你使用過類似Delphi這樣的環(huán)境就會自然理解。IE7解決了此類BUG。

          有多種種辦法;
          1. 修改select,不用標(biāo)準(zhǔn)select,而是自己用其他html元素模擬
          2. 修改你的div,使用iframe。
          3. 在div被顯示的時候或者到達(dá)select所在位置時隱藏select
          4. 在div中或div的同一坐標(biāo)上,用相同尺寸的iframe先遮擋一下,然后在iframe上顯示div的內(nèi)容。
          5.Object對象的優(yōu)先度較高,可以擋住select框

          以下例子系網(wǎng)上資源整理

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

          第4種方法的例子:最好的方法:iframe來當(dāng)作div的底

          Div被Select擋住,是一個比較常見的問題。   
                有的朋友通過把div的內(nèi)容放入iframe或object里來解決。   
                可惜這樣會破壞頁面的結(jié)構(gòu),互動性不大好。   
              
                這里采用的方法是:   
              
                雖說div直接蓋不住select   
                但是div可以蓋iframe,而iframe可以蓋select,   
                所以,把一個iframe來當(dāng)作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種方法的例子:最直接的方法:隱藏下拉框.

          下面提供的是一個比較通用的一組函數(shù):

          test.htm

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

          <script>
          var HideElementTemp = new Array();
          //點(diǎn)擊菜單時,調(diào)用此的函數(shù),菜單對象
          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;//已經(jīng)有的長度
                //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)">
          點(diǎn)擊讓select隱藏
          </div>
          <br><br><br><br><br><br>
          <input type="button" value="點(diǎn)擊讓select顯示" onclick="cal_ShowElement()">

          以上這種方法,如果對于select框數(shù)目少,相對固定的話,直接用obj.style.visibility="hidden"這樣進(jìn)行隱藏是更直接的.

          第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>
          <!--
          提供定位函數(shù),用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=" </div>
          </body>
          </html>

          第5種方法:Object對象的優(yōu)先度較高,可以擋住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>

          這種方法雖然也簡單,但對復(fù)雜的層是來說還不是好的解決方法.

          posted on 2008-12-14 20:04 CopyHoo 閱讀(274) 評論(0)  編輯  收藏 所屬分類: Java Web
          主站蜘蛛池模板: 涡阳县| 桃江县| 寿宁县| 始兴县| 莱州市| 凌海市| 合山市| 丹东市| 定陶县| 雷州市| 灵山县| 棋牌| 吉林省| 郯城县| 龙南县| 剑阁县| 花莲市| 东城区| 宜兰县| 宽城| 九龙坡区| 建水县| 松潘县| 隆昌县| 宿松县| 湾仔区| 安岳县| 锡林浩特市| 平湖市| 扎兰屯市| 开远市| 达拉特旗| 色达县| 黄骅市| 大邑县| 鹤庆县| 城固县| 高清| 瑞金市| 中山市| 崇信县|