【问题标题】:Cross Browser offsetWidth跨浏览器偏移宽度
【发布时间】:2013-02-06 02:38:39
【问题描述】:

我在不同浏览器中使用 offsetWidth 时遇到了问题。结果的这种差异导致了一些奇怪的布局。我创建了一个非常小的示例来显示我所看到的。

jsbin

HTML

<table id="tbl">
  <tr>
    <td>Cell 1</td>
    <td>Cell 2</td>
  </tr>
</table>
<button onclick="calc()">Calculate Offset Width</button>

<div>Cell 1 offsetWidth: <span id="c1offWidth"></span></div>

js

function calc(){
  document.getElementById('c1offWidth').innerHTML =
      document.getElementById('tbl').children[0].children[0].offsetWidth;
}

CSS

Erik Meyer's Reset CSS

当我在 chrome、safari 和 opera 上运行时,单元格 1 的偏移宽度返回的值为 72。当我在 firefox 和 IE9-10 上运行时,返回的值为 77。

我的印象是这是计算元素宽度(包括内边距和边框)的最佳方法。

是否存在始终返回相同结果的跨浏览器解决方案?我尝试使用 jQuery,但结果更加令人困惑。

编辑 因为每个人都推荐outerWidth,所以我也为此做了一个jsbin。结果仍然因浏览器而异。 Chrome 返回 36; IE9-10 和 Firefox 返回 39。

jsbin updated

【问题讨论】:

  • 当我们应该使用雕刻粘土时,许多无知的程序员使用 jQuery 就像玩 doh 一样可笑!使用原生 JS 而不是像 jQuery 这样的资源库。做你的 jsperf 测试!
  • 啊,是的,旧的 1 全局 1 文件技术。 avacweb.com/17860.js。减慢用户速度的绝佳模式。

标签: javascript jquery html css cross-browser


【解决方案1】:

offsetWidth 不是可靠的跨浏览器。我建议改用 jQuery 的 outerWidth()。

$("#your-element").outerWidth();

见DEMO。

【讨论】:

    【解决方案2】:

    如果您需要跨浏览器计算宽度,包括边框和边距,您可以使用 jQuery 的 .outerWidth()。

    【讨论】:

      【解决方案3】:

      由于您使用 jQuery 标记了帖子,我认为 jQuery 解决方案是可以接受的。 outerWidth() 怎么了?

      例如:

      function calc()
      {
          var the_width = $('#tbl tr:eq(0) td:eq(0)').outerWidth();
          $('#c1offWidth').html(the_width);   
      }
      

      使用 jQuery 为表格带来了许多优势(正如您可以从上面所需的代码量减少中看到的那样)。您还应该考虑使用非侵入式事件处理程序。例如,从 button 中删除 onclick 属性,然后执行以下操作:

      $(function() {  
          $('button').click(function() {  
              var the_width = $('#tbl tr:eq(0) td:eq(0)').outerWidth();
              $('#c1offWidth').html(the_width);  
          });
      });
      

      请查看jsFiddle demo。

      【讨论】:

      • jQuery 解决方案绝对被接受!不幸的是,这个演示在 Chrome 中返回 36,但在 IE 中返回 39。这似乎并不能解决问题
      • 它在 Firefox 中也返回 39px。这不是函数的问题 - 它返回正确的值。 “问题”是不同浏览器默认呈现元素的方式。例如,如果为#tbl 指定固定宽度,则结果标准化 > jsfiddle.net/H2uGz/2
      • 部分问题在于所有的 outerWidth 和 offsetWidth 函数都对返回的值进行了四舍五入。按照您的建议在桌子上设置宽度可以缓解这种情况。
      • 为了好奇,非 JQuery 的答案怎么样。我看来你可能知道@BenM 的方法。
      【解决方案4】:

      您的示例中的实际问题在于不同的浏览器使用不同的默认字体进行渲染。单元格的大小由内容定义。 如果您为元素设置了明确的宽度(如评论之一中正确说明的那样),您将获得明确且相等的结果。

      ps:无法发布 cmets...

      【讨论】:

      • 其实,我认为这应该是公认的答案!所有其他“blabla-use-jquery”答案都没有以任何方式解决问题。好像 jQuery 会返回另一个宽度——当然它不会。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多