【问题标题】:Forcing equal height on DIVs within TDs强制 TD 内 DIV 的高度相等
【发布时间】:2014-01-13 15:48:07
【问题描述】:

我正在使用表格布局来表示数据:

问题是根据设计,我必须在单元格之间放置这些分隔边界。

除了在td 元素中使用div 元素(如果我弄错了,请纠正我,应该不会造成问题),我没有看到任何其他方法。

示例

<table>
    <tr>
       <td>
          <div class="inner">
             Content
          </div>
       </td>
    </tr>
</table>

CSS

table td {
    padding: 15px 10px;
    border-bottom: 1px solid #e5e5e5;
}

table td div.inner {
    padding: 10px 25px 10px 0;
    border-right: 1px solid #e5e5e5;        
}

效果相当好 - 您在镜头中看到的是浏览器中的实际渲染。

但是当你仔细观察时,你会注意到垂直线(div.innerborder-right 属性具有不同的高度。这当然是有道理的,我理解它为什么会发生。里面的内容div.inner 会增加它的高度,加上padding

我尝试将固定高度设置为div.inner,这对我的表来说没问题,因为我确切地知道我将代表多少数据并且它永远不会超过某个高度。但是这样做时,div.inner 中的所有内容都会垂直对齐到顶部,这意味着我的td 元素的自然应用的vertical-align 属性不再影响div.inner 中的内容。

我尝试将display: inline-block 应用于div.inner 以触发垂直居中对齐,这会导致宽度发生变化。所以我也添加了width: 100%,这导致水平轴不对齐(文本重叠边框),最后没有显示关于垂直对齐的预期结果。所以这种做法是徒劳的。

我怎样才能使这些垂直分隔线的高度相等?

或者,或者,...

div.inner 上使用固定高度时,如何强制所有内容垂直对齐?

请注意: 以任何方式使用line-height 来实现(或尝试)结果对我来说不是一个选择。正如您在屏幕截图中看到的,我正在显示一个进度条。这在div.inner 中包含更多元素。

【问题讨论】:

  • 为什么要再次使用 div?你不能通过给 td 添加边框来实现你想要的吗?或者是因为你想要填充
  • 是的,没错。我需要填充物。我用cellspacing 尝试了这个,但无济于事 - 边框最终会在td 空间的确切末尾,所以它对我没有用。

标签: html css alignment html-table


【解决方案1】:

我不知道您需要支持哪种浏览器,但我的解决方案需要浏览器支持:before:after 伪元素,以及支持:last-child(或任何CSS3)选择器。

目前全球统计数据指向:

  • 84.9% 的总支持 + 7.56% 的部分支持用于 CSS 生成的内容。 Source
  • 84.79% 支持 CSS3 选择器。 Source

因此重要的是,不可能实现完美的跨浏览器兼容性,尤其是在考虑过时的浏览器时,但这只会影响布局,而不影响您网站的功能;)

我的解决方法是将每个表格单元格的位置设置为relative,然后添加一个右边框宽度为1px且绝对定位在每个单元格内的伪元素:

table td {
    padding: 15px 10px;
    position: relative;
    border-bottom: 1px solid #e5e5e5;
}
table td:before {
    border-right: 1px solid #e5e5e5;
    content: ""; /* Need to declare content, even when empty! */
    position: absolute;
    top: 10px;
    bottom: 10px;
    right: 10px;
    width: 0;
}
    /* Optional, only if you want to                */
    /* remove border on last td element on each row */
    table td:last-child:before {
        display: none;    
    }

在此处查看工作小提琴(在 Chrome、Safari 和 Firefox 中测试):http://jsfiddle.net/teddyrised/e4LXY/

这种方法的优点是它在大多数现代浏览器中得到广泛支持,并且由于:before伪元素被添加到表格单元格而不是内部div,它会随着最终计算的高度进行拉伸行,因此确保它们的高度相同。小提琴演示了内容可以是可变高度的。

唯一的缺点是对于不支持 CSS 生成内容和/或 CSS3 选择器的浏览器没有向后兼容性。您可能需要考虑为旧版浏览器上的访问者使用后备样式(例如,整个表格的实线边框)。

【讨论】:

  • 这看起来很有希望。我去看看。
  • 可爱的解决方案!完全满足我的目的,不需要额外的标记。谢谢!
  • @SquareCat 谢谢,伙计。我很高兴它有帮助!
【解决方案2】:

我在菜单上有类似的问题,这是我解决它的 CSS 魔法:

HTML:

<table>
    <tr>
       <td>
          <div class="inner">
             Content
          </div>
       </td>
        <td>
          <div class="inner">
              <span style="font-size:40px;">AAAA</span>
          </div>
       </td>
        <td>
          <div class="inner">
              <span style="font-size:8px;">asd</span>
          </div>
       </td>
    </tr>
</table>

CSS:

   table td {
    padding: 15px 10px;
    border-bottom: 1px solid #e5e5e5;
}

table td div.inner {
    padding: 10px 25px 10px 0;
    position: relative;
}
table td div.inner:after {
    position: absolute;
    top: 50%;
    margin-top: -20px;
    margin-bottom: -20px;
    margin-left: 23px;
    height:40px;
    width: 1px;
    content: "";
    background-color: #e5e5e5;
}

jsfiddle:http://jsfiddle.net/xJj2y/

【讨论】:

  • 感谢您提供此信息。事实上这是正确的答案,但由于特里早一分钟回答,我接受了他的答案作为解决方案。
【解决方案3】:

我认为在 div 上设置一个固定高度并在 td 上垂直对齐中间将解决它。用一些虚拟行发布一个小提琴,这会有所帮助。

【讨论】:

  • td 元素具有“自然发生的”vertical-align: middle 设置。无论如何,我也尝试将其明确添加到 td 中,但无济于事。在tddiv.inner 上都没有帮助。
  • 我知道我以前做过。我需要记住怎么做。一秒。
  • 这里没有正确的垂直对齐方式。并且div.inner的内容不能超过竖线的高度。
  • jsfiddle.net/Ry7aq/1 如您所见,绿色 div 已正确对齐。内容从同一个地方开始。您的问题不在于 div 对齐。如果你知道高度,它们就永远不需要超出它。
  • div 元素按照td 的要求正确对齐,但在这些块中没有正确的垂直对齐方式。 See this.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 2018-12-03
  • 1970-01-01
  • 2011-04-19
  • 2016-10-12
  • 1970-01-01
  • 2016-05-22
相关资源
最近更新 更多