代码之家  ›  专栏  ›  技术社区  ›  Graza

Firefox和IE的窗口和分区宽度有什么不同?

  •  2
  • Graza  · 技术社区  · 16 年前

    我有一个使用滚动DIV显示表信息的网页。当调整窗口大小(以及页面加载时),显示居中,并且通过设置宽度将DIV的滚动条定位到页面右侧。出于某种原因,在firefox下的行为与ie.ie的位置/大小与预期的不同,但firefox似乎使其太宽,以至于当窗口客户端宽度达到800px时滚动条开始消失。我使用以下方法设置位置和大小:

    function getWindowWidth() {
      var windowWidth = 0;
      if (typeof(window.innerWidth) == 'number') {
        windowWidth=window.innerWidth;
      }
      else {
        if (document.documentElement && document.documentElement.clientWidth) {
          windowWidth=document.documentElement.clientWidth  ;
        }
        else {
          if (document.body && document.body.clientWidth) {
            windowWidth=document.body.clientWidth;
          }
        }
      }
      return windowWidth;
    }
    
    function findLPos(obj) { 
      var curleft = 0; 
      if (obj.offsetParent) { 
        curleft = obj.offsetLeft 
        while (obj = obj.offsetParent) { 
          curleft += obj.offsetLeft 
        } 
      } 
      return curleft; 
    }
    
    var bdydiv;
    var coldiv;
    
    document.body.style.overflow="hidden";
    window.onload=resizeDivs;
    window.onresize=resizeDivs; 
    
    function resizeDivs(){
      bdydiv=document.getElementById('bdydiv');
      coldiv=document.getElementById('coldiv');
      var winWdth=getWindowWidth();
      var rghtMarg = 0;
      var colHdrTbl=document.getElementById('colHdrTbl');
      rghtMarg = parseInt((winWdth - 766) / 2) - 8;
      rghtMarg = (rghtMarg > 0 ? rghtMarg : 0);
      coldiv.style.paddingLeft = rghtMarg + "px";
      bdydiv.style.paddingLeft = rghtMarg + "px";
      var bdydivLft=findLPos(bdydiv);
      if ((winWdth - bdydivLft) >= 1){
        bdydiv.style.width = winWdth - bdydivLft;
        coldiv.style.width = bdydiv.style.width;
      }
      syncScroll();
    }
    
    function syncScroll(){
      if(coldiv.scrollLeft>=0){
        coldiv.scrollLeft=bdydiv.scrollLeft;
      }
    }
    

    注意,我删掉了其他设置高度的代码,以及其他不相关的部分。可以看到整页 here . 如果你同时在IE和火狐中访问链接,调整宽度直到绿色框的右上角显示“800”,调整高度直到启用右边的滚动条,你就可以看到问题了。如果你调整IE的宽度,滚动条就会保持不变,但是如果你调整火狐的宽度,滚动条就会消失。我不知道为什么会发生这种事……

    请注意,afaik、getWindowWidth()应该与跨浏览器兼容,但我不太确定findlpos()…也许在firefox的dom中有一个额外的对象或者其他什么东西,这会改变结果??

    5 回复  |  直到 16 年前
        1
  •  2
  •   Borgar    16 年前

    你在处理 one of the best-known software bugs in a popular implementation of Cascading Style Sheets (CSS) “根据维基百科。我推荐 Element dimensions CSS Object Model View 页上 Quirksmode.org .

    另外:我想你会发现在大多数情况下,Safari和Opera的表现都像是火狐。解决这些问题的一种更兼容的方法是测试MSIE,并为其设置异常,而不是反过来。

        2
  •  1
  •   Graza    16 年前

    好的,我发现了问题。似乎firefox在其style.width设置中没有包含style.paddingleft值,而ie包含了,因此div的结尾正好是style.paddingleft太宽。也就是说,如果style.paddingleft为8,那么ie的style.width值将比firefox的多8个-因此在设置值时是相反的,对于firefox,我需要减去style.paddingleft值。

    修改代码:

      if (__isFireFox){
        bdydiv.style.width = winWdth - bdydivLft - rghtMarg;
      } else {
        bdydiv.style.width = winWdth - bdydivLft;
      }
    
        3
  •  0
  •   Michael Madsen    16 年前

    只要不包含有效的doctype,就不能期望得到一致的结果,这是由于怪癖模式。去添加一个(HTML 4.01过渡是好的),然后让我们知道它是否仍然发生。

    也看到 http://en.wikipedia.org/wiki/Quirks_mode .

        4
  •  0
  •   Bob Somers    16 年前

    在getWindowWidth()函数中,无论何时获取某个对象的宽度,而不是:

    windowWidth = document.documentElement.clientWidth;
    

    试试这个

    windowWidth = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth);
    
        5
  •  0
  •   roenving    16 年前

    帮助优化某些代码的详细信息:

    function getPos(elm) {//jumper
        for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
        return {x:zx,y:zy}
    }
    

    (跳线是在eksperten.dk中发布此代码的用户)