【问题标题】:Position an element over a table-row element将元素放置在表格行元素上
【发布时间】:2014-02-28 06:43:10
【问题描述】:

我有一个.message 列表,其显示为table-row。其中一些消息应该在底部中心有一个红色三角形。包含三角形的元素不能位于.message 的单元格内。

.message 显示为block 时,这很容易做到,但我似乎无法用table-row 做到这一点。正如您在我的小提琴中看到的那样,所有三角形都位于相同的错误位置,并且第二个单元格没有延伸到整行(如果我删除了.opener 元素,它会延伸)。

我错过了什么?

Fiddle for the tests (and clarity)

将鼠标悬停在左侧单元格上,了解我为什么想要table-cell 元素。更准确地说,我需要表格单元格元素的所有定位和尺寸优势(例如,两个单元格的高度相同,并且正确的单元格必须填充行的剩余空间)。

需要兼容:Firefox 和 Chrome

【问题讨论】:

  • 请检查这个jsbin.com/uxiMoqeN/8,不确定你是否想要这个
  • @Deepanshu 如问题所述,我不希望三角形位于单元格中。
  • 那么这种方式呢? jsbin.com/uxiMoqeN/9 ?我将 float:left 用于 u 和 c 类,相对于开瓶器并使其跨越
  • @Deepanshu 如果您使用float,您将失去单元格的所有优势(尺寸、垂直定位)​​。我编辑了问题以使这一点更清楚。
  • 也许你应该使用列表项而不是表格行。

标签: html css


【解决方案1】:

问题是table-celltable-row 和类似的表格显示值不能应用任何定位。就像您正在创建一个表格并为tdtr 分配位置一样。

一个丑陋的解决方法是将其包装在div 中,其display 设置为block,如this

参考position - CSS | MDN

【讨论】:

  • “问题是表格单元格、表格行和类似的表格显示值不能应用任何定位”。如果我将三角形放在表格单元格元素中,同样的事情会起作用。
  • @dystroy 你在 Firefox 上测试过吗?据我所知,它无法在 Firefox 上运行
  • 我有点困惑,你能画出你想要达到的目标吗?我想我没有得到图片。
  • If you log in, you can see it in action there。我正是想要那个(我正在更改当前的工作布局以对每条消息使用table-row)。
  • 我对 danield 的 flexbox 解决方案进行了广泛的改编和测试。它有效,我想您可能有兴趣知道(不过,要制作完整的真正解决方案,您必须使用 flex-basisflex-grow)。
【解决方案2】:

你可以用 flexbox 得到这个布局

FIDDLE

CSS

#b {
    width:100%;
    list-style: none;
}
.m {
    display: flex;
    align-items: center;
    align-content: center;
    position: relative;
    background: #789;
    border-top: thin solid #ccc;
}
.u {
    width: 100px;
    float:left;
    opacity:.999;
}
.u:before
{
    content: '';
    width: 100px;
    height: 100%;
    display: block;
    position: absolute;
    top:0;
    z-index:-1;
}
.c {
    overflow: hidden;
    width: calc(100% - 100px);
}

.u:hover:before, .c:hover {
    background: yellow;
}
.opener {
    width: 16px;
    text-align: center;
    cursor: pointer;
    color: red;

    left:0;right:0;
    bottom:0;
    margin: auto;
    z-index: 0;
    position: absolute;
}
.opener:before {
    content:'▼';
    display: block;
}

【讨论】:

  • +1。在确定它是适合我的解决方案之前,我有很多测试要做(我将在今晚或下一个晚上做它们)但它现在看起来非常好并且肯定很有趣(我正在研究 flex box 但没有'直到现在才知道它是否有帮助)。
  • 你能解释一下为什么你必须做一个.u:before 吗?不可能让 .u 既覆盖整个空间又居中?
  • flexbox 的align-items: center; 使每个子项(flex 项)垂直居中对齐 - 但这意味着项的高度变为其内容的高度。这就是我使用u:before 的原因。话虽这么说...可能还有更好的方法(我会尝试研究一下)。
  • 我试过了,但没有发现任何优雅的东西(我最终在我的网站上使用 JS 调整了 div 的大小,因为我已经必须处理元素高度)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多