Chrome 和 Opera 在使用 display:table 时创建小填充

Posted

技术标签:

【中文标题】Chrome 和 Opera 在使用 display:table 时创建小填充【英文标题】:Chrome and Opera creating small padding when using display:table 【发布时间】:2014-07-03 17:40:39 【问题描述】:

我注意到,在使用属性 display:table; 时,Chrome (34.0.1847.131 m) 和 Opera (21.0.1432.67) 在两个 divs 之间创建了一个小间隙。 (例如,在使用display:block 时不是这样)

Here's a fiddle 复制它。 (调整面板的宽度,不是每个宽度都发生)

复制它:

HTML

<div class="left"></div>
<div class="right"></div>

CSS

.left 
    left: 0px;

.right 
    right:0px;

.left, .right 
    width: 50%;
    position: absolute;
    height: 350px;
    background:#000;

    display:table;
    border-spacing:0;
    border:0;
    margin:0;
    padding:0;

我怎样才能摆脱这个差距?这是某种错误吗?

【问题讨论】:

最后的问题:) 无法绘制半像素,因此如果您的宽度为奇数,则 chrome 中缺少 1px,而在 ff 中,它似乎被赋予了一个或另一个容器:jsfiddle.net/3z24S/4跨度> @GCyrillus 如果我将属性设置为display:block:jsfiddle.net/3z24S/5,为什么不会发生? hm.. 以@GCyrillus 的评论为基础,避免该问题,您可以将其中一个块设置为 51%。 【参考方案1】:

table 更改为table-cell 似乎可以解决问题: http://jsfiddle.net/3z24S/7/

【讨论】:

但我无法将其更改为 table-cell... 我需要 table 为什么display 属性需要table 值?你甚至不需要display 就可以让它按你的意愿工作。 @MattSmith 将内容垂直居中(在内部表格单元格内)并获得 100% 的容器。 (哪个表格单元没有) 好吧,正如@GCyrillus 在上面的 cmets 中所说,“无法绘制半像素,所以如果你的宽度为奇数,则 chrome 和 ff 中缺少 1px给一个或另一个容器”——使用table-cell 时解决了这个问题,因为他们知道共享宽度,这会导致额外的像素被分配到一个/或。你真的应该重新考虑你做这个布局的方式。 OP 需要 display:table 作为其模板的一部分。【参考方案2】:

如果是vertical-align 和已知高度的问题,您可以不使用display:table/table-cell; DEMO,也可以不使用absolute position

您可以使用inline-blockvertical-align 和伪元素。 html

<div class="left">
  <div class='content'>
    <p>content</p>
  </div>
</div>
<div class="right">
  <div class='content'>
    <p>content</p>
    <p>content</p>
  </div>
</div>

div.content 将是 inline-block 或 display:table-cell 在您的问题中。

CSS

.left 
    left: 0px;

.right 
    right:0px;

.left, .right 
    width: 50%;
    position: absolute;
    height: 350px;
    background:#000;
    color:white;
    border-spacing:0;
    border:0;
    margin:0;
    padding:0;

.left:before,
.right:before ,
.content 
  display:inline-block;
  vertical-align:middle;
  max-width:95%;

.left:before,
.right:before 
  content:'';
  height:100%;
  width:0;

即使在这里回答你的问题,我仍然不明白为什么 position:absolute;并且仍然不确定元素是否应该具有已知的高度。看起来您没有使用正确或最佳的方法来满足您的需求。

在我看来,像素错误已经在 cmets 中得到了解决,而且显然是 chrome 处理此显示值的另一种方式。

【讨论】:

您不能为.content 设置width:100% 吗? jsfiddle.net/PzNf7/1 那里有个缺口。 @Alvaro ,是的,如果您在父项上将 font-size 重置为 0 以避免在伪和 .content 之间出现空白,则可以。 jsfiddle.net/PzNf7/2 谢谢,但对于我来说,让它作为模板正常工作听起来有点乏味。我相信我最终会选择将0.1px 的边距添加到右侧面板并继续使用我的table 结构来使内容居中。 嗯,你有足够的信息和 cmets 来选择你想要做什么,我想说这一直取决于你 :)【参考方案3】:

在右侧 div 的位置上加 1 px:

.right 
    right:1px;

http://jsfiddle.net/3z24S/12/

【讨论】:

看起来是一个非常简单的解决方案。添加right:0.1px 似乎也可以。 您不能使用 .1px...尝试使用 .1em 或 rem,因为这些单位可以使用小数位和小数单位进行调整。这是一个奇怪的问题,似乎在一些铬错误报告中以迂回的方式触及。没有什么具体的,但肯定在该地区。毫无疑问,chrome 中的display:table; 设置存在问题。如果您觉得它对您很有帮助,并且解决了您的问题,请随时接受。 是的,现在我会 :) 谢谢!赏金需要一小时。【参考方案4】:

我有两种可能的解决方案:

选项 1:

使用css calc();设置两个div的宽度,如下:

Working Example 1

.left, .right 
    width: calc(50% + 0.1px); /* Important bit */
    position: absolute;
    height: 350px;
    background:#000;
    display:table;
    border-spacing:0;
    border:0;
    margin:0;
    padding:0;

选项 2:

使用 javascript 设置两个 div 的宽度,如下所示:

Working Example 2

wid = function () 
    $('.left, .right').width(Math.ceil($(window).width() / 2)); //Math.ceil() will round the value up
;
$(document).ready(wid);
$(window).resize(wid);

如果你能侥幸使用calc(),这可能是更好的选择,但对于这样的事情,使用 JavaScript 似乎很昂贵。

【讨论】:

以上是关于Chrome 和 Opera 在使用 display:table 时创建小填充的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 和 Opera 中的 Kinetic JS 性能问题

.webm 视频可在 Chrome 和 Opera 中播放,但不能在 Firefox 中播放

Chrome, Safari 中的 JQuery .animate() != FF, IE, Opera

CSS 过渡适用于 IE,但不适用于 Firefox、Chrome 和 Opera [重复]

Opera 52广告拦截提速:完秒Chrome

如何在 chrome、safari、opera 等 webkit 浏览器中删除 c fakepath?