【问题标题】:Extra space added to last justified inline-block element in ChromeChrome 中最后一个对齐的 inline-block 元素添加了额外的空间
【发布时间】:2014-08-27 02:20:29
【问题描述】:

我遇到了一个似乎只在 Chrome 中出现的小问题(在 IE10 和 FF 31 中测试并正常)。

在提供的示例中,有#message#link,两者都设置为display: inline-block;,以便它们可以垂直对齐到彼此的中间(#message 中的文本长度可能会有很大差异) .

text-align: justify; 已设置在 #container 上,以确保 #message 左对齐,#link 右对齐。

问题是在某些窗口大小下,#link 右侧会出现一个小的“空格”。

问题:

应该是什么样子:

我真正想要实现的目标:

如果您查看小提琴但看不到问题,请尝试调整窗口大小。

  1. 是什么导致 Chrome 中出现此问题?
  2. 有没有办法解决这个问题不使用浮动(我想保持垂直对齐)?

JS 小提琴:

http://jsfiddle.net/vvubdqkk/

HTML:

<div id="container">
    <div id="message">Lorem 1. Ipsum dolor sit amet, consectetur adipiscing elit. Aliquam bibendum gravida tincidunt.</div> 
    <a id="link" href="#">OK</a>
    <div id="info">Lorem 2. Ipsum dolor sit amet, consectetur adipiscing elit. Aliquam bibendum gravida tincidunt.</div>
</div>

CSS:

#container {
    background-color: red;
    bottom: 0;
    left: 0;
    margin: 10px 5%;
    position: fixed;
    text-align: justify;
    width: 90%;
}
#message {
    color: #FFFFFF;
    display: inline-block;
    max-width: 80%;
    vertical-align: middle;
}
#link {
    background-color: #FFFFFF;
    color: #000000;
    display: inline-block;
    padding: 1em;
}
#info {
    background-color: green;
    color: #FFFFFF;
    display: inline-block;
    margin: 0;
    width: 100%;
}

【问题讨论】:

  • 不知道为什么会这样,但在#link 上使用float: right; 不会破坏垂直对齐并解决问题!!
  • @ImranBughio 感谢您查看,不幸的是,将#link 向右浮动确实会破坏垂直对齐,因为无论文本有多长,它都需要与#message 的中间对齐。向右浮动会将#link 推到顶部:jsfiddle.net/7pj8rbh3
  • 顺便说一句,当涉及到垂直对齐时,我总是使用 display: table、table-row 和 table-cell 创建一个假表......它就像一个魅力。
  • @ImranBughio 是的,看起来我可能需要走那条路,只是想尝试了解 Chrome 为何会出现此问题,因为它似乎在我测试过的其他浏览器中运行良好!
  • 浏览器兼容性通常感觉像是魔法,特别是如果您看过 IE8 及以下时代:p - 在这种情况下,我认为 chrome 以与其他浏览器不同的方式处理 justify 属性。希望我们能找到问题和解决方案。

标签: html css google-chrome


【解决方案1】:

这个案例是使用 flexbox 布局的完美选择。您可以保持现有代码不变,但添加以下行。这将保留您的原始代码作为不支持 flexbox 的浏览器的后备。由于 Chrome 确实支持当前的 flexbox 语法 all the way back to version 21,这应该可以安全地消除您的问题。

Codepen Demo

修改后的 CSS

#container {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
}

#message {
  flex: 1;
}

您需要为代码添加前缀以获得全面的浏览器支持,但由于您只是担心 Chrome 中的错误,因此这并不是绝对必要的(无前缀支持可追溯到版本 29,尽管版本 27 仍然保留 .54 % 的全球市场份额,所以为了安全起见,您可能会将 -webkit- 加入其中)。

由于 flexbox 刚开始使用时可能会有些混乱,如果您在 CSS-Tricks 上的示例中有很好的概述之前没有使用过它。我没有足够的声望点来发布两个以上的链接,而只是谷歌“css tricks flexbox”。

希望这会有所帮助。

【讨论】:

  • +1。谢谢你的建议。由于浏览器支持,我并没有真正考虑使用 flexbox(虽然我希望在 Chrome 中修复错误,但我不希望其他浏览器破坏!)。快速浏览一下,我似乎可以将 CSS 设置为使用 flexbox(如果可用),如果没有,则回退到我当前的方法。
  • 这就是使用 flexbox 的好处。它可以在现代浏览器上运行,但通过保留现有的 CSS,它不会在旧浏览器上中断。祝您好运解决您的问题。
  • 在这个小提琴 jsfiddle.net/j0wnhwyk 中实现了 flexbox,同时保留了 display: inline-block; 后备。似乎在我测试过的所有浏览器中都可以使用,并且已经在 Chrome 中解决了这个问题。我可能会更多地使用 flexbox,因为我知道它可以优雅地回退。感谢您的帮助!
【解决方案2】:

总体问题是您正在设置#container 的样式,类似于您应该设置#message 的样式。 #Container 应该只是一个虚构的 #message、#link、#info 的持有者/容器。

尝试去掉#container 背景颜色红色,而是将其添加到#message。这样做之后,您的链接会遇到一些填充问题(我删除了填充:1em)。接下来,您可以调整#message 的宽度% 以获得正确的间距。您会注意到我在您的#container 上删除了 width:90%。

#container {
   bottom: 0;
   left: 0;
   margin: 10px 5%;
   position: fixed;
   text-align: justify;
}
#message {
    background-color: red;
    color: #FFFFFF;
    display: inline-block;
    max-width: 90%;
    vertical-align: middle;
}
#link {
    background-color: #FFFFFF;
    color: #000000;
    display: inline-block;
}
#info {
    background-color: green;
    color: #FFFFFF;
    display: inline-block;
    margin: 0;
    width: 100%;
}

【讨论】:

  • 感谢您的浏览。我喜欢你的方法,但不幸的是,这并不能很好地转化为我的实例。我已经更新了我的问题,以展示我在量身定制的小提琴示例中实际想要实现的目标。问题不在于#container 的红色背景,更多的是与#info 的对齐。 #link 上的填充是设计的一部分。
【解决方案3】:

MY CODEPEN

对于我的测试,我使用了:

  • 绝对定位来修复#link的垂直对齐,我修复了他的大小
  • 我修改了html结构
  • 我修改了宽度以与您的图片进行比较。

HTML

<div id="container">
  <div id="inner_top">
      <div id="message">Lorem 1. Ipsum dolor sit amet, consectetur adipiscing elit. Aliquam bibendum gravida tincidunt. Lorem 1. Aliquam bibendum gravida.nnnnn<br/><p style="color:yellow;text-align:right;margin:0">Read more</p></div> 
      <div id="link"><a  href="#">OK</a></div>
  </div>
  <div id="info">
        Lorem 2. Ipsum dolor sit amet, consectetur adipiscinngg elit. Aliquam bnbibendum       gravidda tinciduntt.
  </div>
</div>

CSS

#container {
    background-color: rgba(0, 0, 0, 0.8);
    bottom: 0;
    left: 0;    
    position: fixed;
    text-align: justify;
    width: 100%;
}
#message {
    color: #FFFFFF;
    position:relative;
    max-width: 80%;
    vertical-align: middle;
    padding-top:1em;
    padding-bottom:1em;

}
#link {
    position:absolute;top:50%;right:0;
    background-color: #FFFFFF;
    color: #000000;
    margin-top:-25px;
    width:50px;
    height:50px;
}
#link a{
  color: #000000;
  position:relative;
  height:15px;
  display:block;
  padding-top:15px;
  text-align:center
}

#inner_top{position:relative;width: 90%; margin: 10px 5%;}

#info {

    color: #FFFFFF;   
    margin: 0;
    width: 90%;
    height:200px;
    margin: 10px 5%;
    overflow-y:auto;

}

【讨论】:

  • +1。谢谢参观。看起来这种技术是最好的方法,尽管我发现自己倾向于 SalmanAs 的答案,因为它需要的标记略少。
【解决方案4】:

简单 & 最佳黑客 - TRY DEMO

注意: margin = -0.5pxtransform = 0.99px 不会对您的 div#container 应用任何额外的边距或宽度,这也不会强制 a#link 移动或推动下一步像素。

已测试: Chrome 36 和 Safari 5.1.7

#link {
    -webkit-margin-start: -0.5px;
    -webkit-margin-end: -0.5px;
    -webkit-transform: translate(0.99px, 0px);
}

/* With Your CSS */
...................

【讨论】:

  • +1。这是一个有趣的方法,我不会考虑。虽然这些更改在某些情况下似乎减轻了问题,但我发现它可能会在其他情况下过度补偿并导致 #link 向右移动太远。感谢您的努力。
  • @HiddenHobbes 请给我一种情况,它可以在其他情况下过度补偿并导致#link 向右移动太远。
  • 请看这个小提琴jsfiddle.net/bo79Ld88。我已将正文背景更改为蓝色,以使问题更加明显。如果您调整屏幕大小,您会注意到#link 在特定宽度处戳到#container 之外。
  • 我等了一会儿,但在测试了@Isaacs flexbox 方法之后,我能够得到这个排序。不过感谢您的建议!
  • 感谢您的等待...我很高兴它已解决... ;)
【解决方案5】:

问题似乎是由四舍五入错误引起的。该页面似乎可以正常工作,即某些屏幕宽度上没有红色间隙。您可以通过一次调整一个像素的窗口大小来进行测试。红色间隙的出现似乎是容器宽度的函数。

这是我的解决方法:

jsFiddle Demo

它使用一个额外的 div 加上两个垂直对齐技术:

  • 消息使用混合行高技术垂直对齐
  • 使用绝对定位垂直对齐按钮

CSS(2014 年 8 月 26 日修订):

#container {
    color: #FFFFFF;
    background-color: #FF0000;
    position: fixed;
    left: 5%;
    right: 5%;
    bottom: 10px;
}
#tempwrap {
    line-height: 3; /* sets the _outer_ line height of #message as well as height of #link */
    position: relative; /* for positioning #link */
}
#message {
    background: rgba(255, 255, 255, .5);
    line-height: normal; /* the _inner_ line height */
    max-width: 80%; /* room for #link */
    display: inline-block;
    vertical-align: middle;
}
#link {
    color: #000000;
    background-color: #FFFFFF;
    padding-left: 1em;
    padding-right: 1em;
    position: absolute;
    right: 0;
    top: 50%; /* top aligns with middle of parent */
    margin-top: -1.5em; /* the height is 3em so push 3/2em upwards */
}
#info {
    background-color: #008000;
}

【讨论】:

  • +1。是的,这似乎是一个四舍五入的问题,最烦人的,因为我测试过的其他浏览器看起来都不错!这似乎是处理问题的最有效的方法。只是出于兴趣,#tempwrap:after 是否必要,因为删除它似乎对布局没有影响?
  • 关于 #tempwrap:after... 是的,这和 min-height 似乎都是多余的。我尝试了太多东西,忘记清理多余的规则。
  • 我已经删除了不必要的规则。
  • 感谢您的建议 Salman A 我差点将您的建议标记为已接受的答案,但发现 @Isaacs 解决方案是一个稍微可取的仅 CSS 解决方案。
【解决方案6】:

你可以试试这些 tricks 可能对你有帮助。

float : right 用于您的#link 也可以解决问题。

【讨论】:

  • OP 已经提到浮动造成垂直对齐问题!!
【解决方案7】:

这有点小技巧,但添加了 margin-right: -1px;似乎为我解决了这个问题:

#link {
    background-color: #FFFFFF;
    color: #000000;
    display: inline-block;
    padding: 1em;
    margin-right: -1px;
}

问题是这会在所有其他浏览器中将框向右推 1 个像素。

编辑:在容器 div 中设置 overflow:hidden 可能会解决此问题。

【讨论】:

  • 感谢您的建议,但不幸的是,这在这种情况下不可行。令人讨厌的是,这个空间有时会大于 1px!我还为这个问题稍微定制了小提琴,以使问题更容易发现,在我的实时版本中,我在#container 上使用margin 而不是margin,这意味着添加overflow: hidden; 将不起作用。
【解决方案8】:

我认为我可能会解决您的问题。我自己一直在摆弄 display: inline-block ,但时不时地在两个 webkit 浏览器中都遇到了一些边距问题,就我而言,主要是 Safari。但是,对我来说通常的诀窍是将父 div 的字体大小设置为 0,然后将子 div 的字体大小重置到它们各自的原始字体大小,以像素为单位提个醒。

#container {
...
font-size: 0;
}

#message, #link, #info {
font-size: 16px;
}

修改后的 JS 小提琴:

http://jsfiddle.net/vvubdqkk/9/

【讨论】:

  • 感谢您的建议。不幸的是,问题仍然存在于您的小提琴中,所以我认为font-size 在这种情况下没有太大影响。 #link 上的 margin-right: -1px; 确实减少了问题,但请参阅 Kez 对答案的评论,了解为什么这不适合这种情况。
  • 这很奇怪 - 我可以发誓它昨天对我有效,事实上今天检查时它仍然有效。然而,这不归功于我的解决方案。相反,它在我的屏幕上正确显示的原因是屏幕分辨率——在某些分辨率下,它就像一个魅力,而在某些分辨率下,右侧会有那么小的空间,尝试调整浏览器窗口的大小,你就会明白我的意思。调整大小时,右侧的边距会闪烁,我猜这是因为 Chrome 无法正确计算,将 odd 像素值转换为百分比。
  • 是的,我认为您可能对 Google 错误地计算百分比是正确的,如果是这种情况,我开始怀疑是否有解决问题的好方法。
【解决方案9】:

将margin-right 赋予-2px 将工作检查fiddle,我也通过调整大小进行了测试。

CSS

#link {
background-color: #FFFFFF;
color: #000000;
display: inline-block;
padding: 1em;
margin-right:-2px;
}

有时我们需要做一些奇怪的事情才能让事情正常进行

【讨论】:

  • Kez 已经提出了这个答案,请查看该问题的 cmets 了解为什么不适合减边距。
  • 他建议 -1 px 不正确,bcoz 仍然显示 1 px,我建议“-2px”,我无法在那里发表评论,因为我没有适当的声誉来发表评论.这就是为什么我选择回答。
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多