【问题标题】:Difference of layout on Safari with margin-right negativeSafari上的布局差异与margin-right负数
【发布时间】:2012-12-30 12:50:53
【问题描述】:

我偶然发现了 Safari 和 Chrome/Firefox 在布局渲染上的差异,我不知道哪个是“正确的”。

你可以查看jsfiddle here

在 Firefox/Chrome 上,布局与预期一致,黄色 div 正好在 红色 div 之后。但在 Safari 上,黄色 div 位于 红色 div 之下。

在调查了我做错了什么之后,我发现错误来自 CSS 类 E,其属性 margin-right(值:-11px)大于我的 div 的 width 属性(值:10px)。

我想我理解为什么 Safari 会以这种方式呈现它。 B 类的 div 的宽度计算为其子级的宽度之和,因为它们具有属性 float: left;

这里是widthB = widthB2*2 + widthE + marginRightE + widthCmarginRightE < -widthE,所以widthB 不够大,无法包含相邻的每个div。

所以我的问题是:

  1. 我对 Safari 功能的理解是否正确?
  2. 为什么 Chrome 和 Firefox 的呈现方式不同?他们只是没有根据否定的margin-right 减小父 div 的宽度吗?
  3. 在这种情况下,正确的修正是否总是使 margin-right 小于或等于 div 的宽度?

谢谢!

HTML:

<div class="A">
  <div class="C">
    <div class="B">
      <div class="B2"></div>
      <div class="B2"></div>
      <div class="E"></div>
      <div class="C">
        <div class="D"></div>
      </div>
    </div>
  </div>
</div>

CSS:

.A {
  background-color: blue;
  height: 200px;
}

.B {
  height:100px;
}
.B2 {
  background-color: red;
  height: 100px;
  width: 100px;
  float: left;
}
.C {
  float: left;
}
.D {
  height: 40px;
  width: 40px;
  float:left;
  background-color: yellow;
}
.E {
  height: 50px;
  width: 10px;
  position: relative;
  left: -10px;
  margin-right: -11px;
  background-color: black;
  float: left;
}

【问题讨论】:

  • 我刚刚在 chrome 和 Firefox 中查看了这个,在 chrome 中黄色框在红色下方,但在 Firefox 中它在红色旁边。所以,我的 chrome 浏览器就像你的 safari 浏览器一样。不幸的是,我在编写 HTML 代码时经常遇到这样的问题。在 chrome 中以一种方式显示的东西在 IE 中看起来非常不同。或野生动物园。我认为有些命令只适用于某些浏览器。此外,浏览器的版本可能会有所不同。
  • 感谢您的回复。您能告诉我您使用的是哪个版本的 Chrome 以及您的操作系统吗?我知道浏览器有不同的行为。我想要的是确保我的理解是正确的,并最终找到解决此布局的方法!
  • 我使用的是 windows XP 并且拥有 chrome 版本 15.0.874.121。
  • 我在 Win7 上的 Chrome 中遇到了一些奇怪的东西。如果您在 WebInspector 中检查 secong .B2 并停用 float: left 并立即激活它,.B 的宽度计算为 239px,而 beginning 为 240px。因此,经过某种重绘后,Chrome 的行为就像 Safari 一样。这不适用于 FF 浏览器。
  • 您已经使用了 CSS 类 C 两次。你把float: left 放在课堂上。外层.C真的需要吗?

标签: html css safari


【解决方案1】:

第二次编辑:

我认为我们应该将这两个问题联系起来:https://stackoverflow.com/questions/4989930/css-negative-marginwhy use negative margins?

另请参阅 W3C 边距规范:http://www.w3.org/TR/CSS2/box.html#margin-properties。 第 8.3.1 节可能实际上解释了您的样本发生了什么。在 Safari 中无法正确呈现的折叠边距问题。

原帖:

所以我的问题是:

1) 我对 Safari 所做的事情的理解是否正确。为什么 Chrome 和 Firefox 的呈现方式不同?听起来可能就是这样,但是,真的,谁在乎呢?你没有得到你想要的结果。除非您不关心 Safari 用户,否则您应该更改代码。

2) 他们只是没有根据负边距减少父 div 的宽度吗? 可能,但同样,不是很重要。

3) 在这种情况下,正确的修正是否总是使边距小于或等于 div 的宽度?我会说是的。为了解决这个问题并获得你想要的结果,我会将 E 类的 div 移动到 B2 类的最右边的 div 中。然后将 E 向右浮动,去掉 position、left 和 margin-right 属性。

.E {
height: 50px;
width: 10px;
background-color: black;
float: right;
}

http://jsfiddle.net/uryJJ/32/

第一次编辑

.D {
height: 40px;
width: 40px;
float:left;
background-color: yellow;
position:relative;
left: -10px;
}
.E {
height: 50px;
width: 10px;
position: relative;
left: -10px;
background-color: black;
float: left;
}

http://jsfiddle.net/uryJJ/33/

【讨论】:

  • 谁在乎?我愿意。了解这类问题可以确保我以后不会再遇到它们,这就是我编码的重点!我也关心 Safari 用户,我更正了布局以避免这些问题,但我仍然想了解会发生什么
  • 在我目前的“真实”案例中,移动 E 类的 div 是不可能的。我已经考虑过了,但它会在以后与许多其他东西混淆。
  • @koopajah 好的。我理解你的分析天性。不过,我认为很明显,问题在于负边距值是不可预测的,尤其是当它超过宽度值时。
  • 在 D 类的 div 中添加 left: -10px; 看起来像是“黑客”。在我的情况下,我真的做不到。但是感谢您提出这个建议。
  • @koopajah 感谢您的支持。请参阅我的第二次编辑。我知道你已经选择了一个答案,但这很有趣。
【解决方案2】:

对不起,我可能会把它打死,但这可以解决它:

.E {
height: 50px;
width: 10px;
margin-left: -10px;
background-color: black;
float: left;
}

http://jsfiddle.net/uryJJ/35/

直到现在我才喜欢负边距值。

【讨论】:

  • 是的,但这就是我在问题中解释的内容。问题来自有一个margin-right(或left),其值(绝对)大于div的宽度
【解决方案3】:

.D.E 类进行以下更改:

.D {
  float:left;
  height: 40px;
  width: 40px;
  background-color: yellow;
  margin-left: -11px;
}
.E{
  height: 50px;
  width: 10px;
  position: relative;
  left: -10px;
  background-color: black;
  float: left;
}

演示:http://jsfiddle.net/uryJJ/22/

我希望这会有所帮助!

【讨论】:

  • 感谢您注意到这一点,但它很奇怪,在我的“真实”案例中,C 类必须有 float: left;
  • 好的,我会调查的。
  • 我更改了我的初始帖子。希望对您有所帮助!
  • 这仍然采用负边距,海事组织应该避免这种情况。它本质上使布局难以理解。
【解决方案4】:

我不确定您期望在 JS 小提琴中使用 CSS 会发生什么。您正在研究未定义的行为。我这样说是因为:

  • 'C' 是浮动的,但没有定义的宽度。根据布局的复杂性,这会导致各种浏览器出现问题。

  • 没有任何浮动元素被清除。浮动时必须使用某些描述的clearfix,无论是clear:both等。

如果您调整标记并添加清除修复,您会看到内容始终为 239px。见http://jsfiddle.net/eaFn9/

然而,相对定位的项目“E”和边距似乎对宽度计算产生了负面影响,因为 Chrome 的网络检查器似乎总是奇怪地报告该元素的负边距.

如果您在网络检查器中使用此功能,您会发现负边距几乎是导致下降的原因。我认为这可能是由于容器没有宽度,并且本身不是相对位置。

如何解决?

就个人而言,我想重新编写您的布局以在所有浮动上包含固定宽度,减少浮动嵌套并尽可能清除。它似乎过于复杂,但如果没有真实世界的用例,就很难重写。

但是,在我看来,您可以将 'B2' + 'E' 元素包装在浮动和相对定位的包装器中,然后在 'E' 上使用绝对定位来产生相同的效果并删除负边距。

这是我想出的 JSFiddle:http://jsfiddle.net/jV3Ub/

【讨论】:

  • 感谢您的详细解答。我试图了解您所做的更改及其影响。在您的第一个 jsfiddle 中,clear 会导致 Chrome/Safari 中的相同行为,但 Firefox 仍然在第一行呈现 E,这是为什么呢?
  • 我知道没有真正的布局很难理解,但真正的布局更复杂。我正在与父母建立一个网格,可以有多个子行,可以有多个子行等。我试图避免动态计算宽度 everywhere 并且只将它们设置在类 B 的 div 上并让整个网格自动适应。然后我遇到了这个由margin-right错误设置触发的奇怪行为
  • 我也想到了这个解决方案,但选择了最右边的 div 类 B 中的 div 类 E,然后向右浮动。您的原因是 B2 中 E 下的内容在 B2 后面漂移而不是换行,但是,绝对定位总是不太流畅。很好的答案。
  • @fredsbend - 我宁愿重写并重新开始,但这是我唯一能想到的没有重写的事情。如果没有相对的父母,相对定位对我来说似乎很糟糕。我倾向于避免这样定位元素。
  • @fredsbend 对我来说,这似乎很骇人听闻,因为在您的示例中,父“C”将占用 250px 的空间,即使由于相对定位,它的真实宽度仅为 240px。
【解决方案5】:

对不起,这不是一个真正的答案,但它太长了,无法发表评论...... 无论如何,我花了一分钟才弄清楚这一点。

我在 Mac OS X 10.8.2、Chrome 24.0 (Mac) 和 Safari 6.0.2(以及 Mac)上使用了 Firefox 19。使用网络检查器工具,我意识到 div 的计算方式确实不同。我很不擅长计算,但我花时间坐下来仔细研究了一下,我确实和你一样理解 Safari 的计算。

在 Safari 中,似乎 div B 的宽度不足以包含黄色 div (C),因此它似乎将其拒绝到底部。作为记录,在我的测试中,我在 FF 和 Chrome 中看到红色 div 右侧的黄色 div,而 Safari 将其显示在红色下方和左上角。我不确定这是否会有所帮助,但我只能建议您使用现在集成到所有现代浏览器中的 Web 检查器工具来调试它。

我不确定为什么会发生这种情况,我所知道的只是将 E 的宽度更改 1px,如下所示:

.E {
  height: 50px;
  width: 11px; /* added 1px to this property */
  position: relative;
  left: -10px;
  margin-right: -11px;
  background-color: black;
  float: left;
}

它在 Safari 中正确显示。

【讨论】:

  • 感谢您抽出宝贵时间回答!问题是您确切地发现了我在我的问题中解释的内容:当具有 -Xpx 类型的边距和 Ypx 和 X > Y 的宽度时,Safari 上的布局被“破坏”。所以增加宽度有效地纠正了这个问题
  • 我认为这证明了如果margin超过它,safari不会自动调整宽度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多