获取边距的绝对宽度(边距问题:auto;)

Posted

技术标签:

【中文标题】获取边距的绝对宽度(边距问题:auto;)【英文标题】:Getting absolute width of margins (issue with margin: auto;) 【发布时间】:2014-01-25 11:21:18 【问题描述】:

我正在尝试确定元素边距的used value。我的理解是这应该通过.getComputedStyle() 返回。但是,当使用 margin: auto; 时,FireFox 和 Opera 似乎不会返回正确的值。 Firefox 返回'0px',Opera 返回'0px',或者偶尔返回'auto'

http://jsfiddle.net/8FXbZ/

我知道我可以计算父级的内容宽度和子级的总宽度,并使用它们来计算边距,但我主要看的是父级是 flexbox 的情况:

http://jsfiddle.net/8FXbZ/1/

同样,这些值可能是“逆向工程”的,但这会变得相对复杂(特别是如果 flexbox 允许包装),所以我想知道是否有人有其他想法?

【问题讨论】:

这可能会有所帮助:***.com/questions/12718084/… @Diodeus 我一定是误解了一些东西,因为我不确定这有什么帮助?我已经知道 jQuery 的 .outerWidth(),所以查看了他们的源代码,但事实证明它在 FF/Opera(至少在 flexbox 中)也给出了错误的边距值。 还有其他方法可以找到边距——jquery 有一些强大的定位函数可以帮助你间接计算它。 Flexbox 在 CSS 中仍然是一个相对较新的概念,其支持可能不如您预期的那么好。为什么你需要边距? @ProfileTwist 原来的问题已经用另一种方法解决了。现在我只是好奇。 【参考方案1】:

Firefox 中有一个错误:https://bugzilla.mozilla.org/show_bug.cgi?id=381328 返回错误的值。

【讨论】:

@BYossarian 能否请您将此标记为答案,以便人们可以看到正在发生的事情?【参考方案2】:

我知道这不是您要寻找的答案。鉴于该错误,这是我开始计算左右边距的多边形填充。 FIDDLE

function getMargin(elem) 
  var parent = elem.parentNode,
    prev = elem, 
    next = elem, 
    leftEdge, 
    rightEdge;

  var pos = elem.getBoundingClientRect();
  var parentPos = parent.getBoundingClientRect();
  var parentComputed = window.getComputedStyle(parent);
  while((prev = prev.previousSibling) && !prev.getBoundingClientRect)
  while((next = next.nextSibling) && !next.getBoundingClientRect)
  if(prev)
    leftEdge = prev.getBoundingClientRect().right; //+ getMargin(prev).right
  else 
    leftEdge = parentPos.left + parseInt(parentComputed.getPropertyValue("padding-left")) + parseInt(parentComputed.getPropertyValue("border-left-width"))
  
  if(next)
    rightEdge = next.getBoundingClientRect().left; //- getMargin(next).left;
  else 
    rightEdge = parentPos.right - parseInt(parentComputed.getPropertyValue("padding-right")) - parseInt(parentComputed.getPropertyValue("border-right-width"))

  

  return  
    left: pos.left - leftEdge, 
    right: rightEdge - pos.right 
   

有一个问题,您需要在尝试计算边距的元素之间插入一个空的<span></span> 标签分隔符。它可以是任何空标签(宽度和高度为 0,但可见)。

<div id="parent">
  <div id="inner"></div>
  <span></span>
  <div id="other"></div>
</div>

如果您要删除分隔符跨度标签,并使用递归来计算上一个和下一个元素的边距,您将遇到循环无限循环,因为 left 框需要 right em> 框的 left 边距值和 right 框将需要 left 框的 right 边距值。

【讨论】:

以上是关于获取边距的绝对宽度(边距问题:auto;)的主要内容,如果未能解决你的问题,请参考以下文章

绝对定位和负边距的应用

浏览器对边距的支持:自动

html所有关于内边距外边距的标签属性

有关如何使用边距的信息

所有边距都相等,但有些边距比其他边距更平等

如何增加vim中行号边距的间距?