【问题标题】:What is different with window and div widths between firefox and IEfirefox 和 IE 之间的窗口和 div 宽度有什么不同
【发布时间】:2010-09-18 23:47:47
【问题描述】:

我有一个使用滚动 div 来显示表格信息的网页。当窗口调整大小时(以及页面加载时),显示居中,div 的滚动条通过设置其宽度位于页面右侧。由于某种原因,Firefox 下的行为与 IE 下的行为不同。 IE 按预期定位/调整 div 的大小,但 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和firefox中都去链接,调整宽度直到右上角的绿色框显示“800”,调整高度直到启用右侧的滚动条,你可以看到问题。如果您随后调整 IE 宽度,滚动条会保持不变,但如果您将 Firefox 宽度调整得更宽,滚动条就会开始消失。我不知道为什么会这样......

请注意,AFAIK,getWindowWidth() 应该是跨浏览器兼容的,但我不太确定 findLPos().... Firefox 的 DOM 或其他东西中可能有一个额外的对象,它正在改变结果? ?

【问题讨论】:

  • IE7,不过我觉得6里是一样的(未测试)

标签: javascript html internet-explorer firefox


【解决方案1】:

由于 Quirks 模式,只要您不包含有效的文档类型,您就不能期望得到一致的结果。去添加一个(HTML 4.01 Transitional 很好),然后让我们知道它是否仍然存在。

另见http://en.wikipedia.org/wiki/Quirks_mode

【讨论】:

  • 添加过渡并没有改变任何浏览器中的任何内容,除非我添加“w3.org/TR/html4/loose.dtd”,在这种情况下我完全失去了 div 滚动条并最终得到一个页面滚动条(我不想要)
  • Transitional 需要 URL 才能禁用 Quirks 模式。如果您从中得到其他问题,则表明您做错了其他事情(不过,我需要仔细看看有什么问题)。使用 Quirks 模式,IE 将像 IE5.5 一样运行,我相信你会同意这不好。
  • 我原则上同意。不幸的是,这是一个非常大的网站,其中包含许多不兼容的 HTML - 我很确定在这种情况下我们需要怪癖模式。我们在很多方面肯定做错了,但禁用 quirksmode 将意味着需要进行巨大的大修......
【解决方案2】:

在您的 getWindowWidth() 函数中,每当您抓取某物的宽度时,而不是这样:

windowWidth = document.documentElement.clientWidth;

试试这个

windowWidth = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth);

【讨论】:

  • 这不起作用 - 我需要窗口的实际 visible 宽度来计算 div 的位置/大小(以及滚动条) - 如果我得到可滚动的宽度,滚动条将是屏幕的 waaay....
【解决方案3】:

有助于优化部分代码的细节:

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}
}

(jumper 是在 Eksperten.dk 中发布此代码的用户)

【讨论】:

    【解决方案4】:

    好的,我发现了问题。似乎火狐在其 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;
      }
    

    【讨论】:

      【解决方案5】:

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

      另外:我认为您会发现 Safari 和 Opera 在大多数情况下的行为类似于 Firefox。解决这些问题的一种更兼容的方法是测试 MSIE 并为其设置例外,而不是相反。

      【讨论】:

      • 感谢您提供的额外信息 - 当我最终找到自己问题的解决方案时,这让我很恼火,因此它仍然“没有答案”....不过,您的帖子绝对是我正在寻找的答案.维基百科链接是一个完美的解释:)
      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2013-05-10
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多