css - CSS 中代表行的元素是否可以构成网格?

标签 css html-table css-grid

我正在尝试使用适用于现代浏览器的 HTML/CSS 复制此设计:

enter image description here

它本质上是一个表格,有行和列,这意味着如果一行的名称单元格变大,它应该对所有行都变大。我看到了两种可能性:表格和 CSS 网格。

据我所知,表格中的行样式不够丰富,例如它们不能采用边框半径,我还没有尝试过框阴影。

如果我使用 CSS 网格,我可以设置单元格的样式以在末尾模拟边框半径,但是这样框阴影就变得不可能了,因为第二个单元格的框阴影覆盖了第一个单元格。

我认为问题归结为具有表示样式的行的元素,但仍在每个行中,单元格的宽度应与其他行中的宽度相同,以表示列。

在 CSS 中有什么方法可以实现这一点吗?

例如,这是对 HTML 的 table 的尝试,其中边距和边框半径没有影响:

table {
  border-collapse: collapse;
}

tr {
  background-color: grey;
  border-radius: 8px;
  margin: 10px;
}
<table>
  <tr>
    <td>Eva Lee</td>
    <td>Call back</td>
    <td>15/02/19</td>
  </tr>
  <tr>
    <td>Evelyn Allen</td>
    <td>Call back</td>
    <td>14/01/19</td>
  </tr>
  <tr>
    <td>Slawomir Pelikan</td>
    <td>Voicemail</td>
    <td>14/01/19</td>
  </tr>
  <tr>
    <td>Christopher Walken</td>
    <td>Voicemail</td>
    <td>14/01/19</td>
  </tr>
</table>

这是另一种尝试,使用 display:table,它的作用与 table 相同:

.table {
  display: table;
  border-collapse: collapse;
}

.row {
  display: table-row;
  background-color: grey;
  border-radius: 8px;
  margin: 10px;
}

.cell {
  display: table-cell;
}
<div class="table">
  <div class="row">
    <div class="cell">Eva Lee</div>
    <div class="cell">Call back</div>
    <div class="cell">15/02/19</div>
  </div>
  <div class="row">
    <div class="cell">Evelyn Allen</div>
    <div class="cell">Call back</div>
    <div class="cell">14/01/19</div>
  </div>
  <div class="row">
    <div class="cell">Slawomir Pelikan</div>
    <div class="cell">Voicemail</div>
    <div class="cell">14/01/19</div>
  </div>
  <div class="row">
    <div class="cell">Christopher Walken</div>
    <div class="cell">Voicemail</div>
    <div class="cell">14/01/19</div>
  </div>
</div>

最佳答案

编辑1

这适用于 FF、Chrome、MSIE、MS Edge。
Edge 可能需要稍微调整一下,因为表格单元格具有子像素宽度,如果现在给定像素宽度,则会导致令人讨厌的垂直条。

这通过在包裹单元格内容的 div 上使用负边距和在单元格上使用 overflow: hidden 来实现。

table {
  border-collapse: collapse;
  border-spacing: 0;
}
table tr td {
  overflow: hidden;
  padding: 0 0 5px 0;
}
table tr td > div {
  background-color: gold;
  padding: 4px;
  border-radius: 0px;
  box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
  margin-left: -10px;
  margin-right: -10px;
  padding-left: 14px;
  padding-right: 14px;
}
table tr td:first-child {
  padding-left: 10px;
}
table tr td:first-child > div {
  border-radius: 10px 0 0 10px;
}
table tr td:last-child {
  padding-right: 20px;
}
table tr td:last-child > div {
  border-radius: 0 10px 10px 0;
}
<table>
  <tr>
    <td>
      <div>Lorem.</div>
    </td>
    <td>
      <div>Ea!</div>
    </td>
    <td>
      <div>Animi.</div>
    </td>
  </tr>
  <tr>
    <td>
      <div>Quas!</div>
    </td>
    <td>
      <div>Dolor!</div>
    </td>
    <td>
      <div>Suscipit.</div>
    </td>
  </tr>
  <tr>
    <td>
      <div>Mollitia?</div>
    </td>
    <td>
      <div>Inventore!</div>
    </td>
    <td>
      <div>Dolorem.</div>
    </td>
  </tr>
</table>

旧的,不能在 Chrome 中工作

来点伪元素魔法怎么样?

table {
  border-spacing: 10px;
  border-collapse: separate;
}

tr {
  position: relative;
  margin: 10px;
}
tr:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: gold;
  z-index: -1;
  border-radius: 20px;
  box-shadow: 3px 2px 5px rgba(0, 0, 0, 0.25);
}

td {
  padding: 10px;
}
<table>
  <tr>
    <td>Eva Lee</td>
    <td>Call back</td>
    <td>15/02/19</td>
  </tr>
  <tr>
    <td>Evelyn Allen</td>
    <td>Call back</td>
    <td>14/01/19</td>
  </tr>
  <tr>
    <td>Slawomir Pelikan</td>
    <td>Voicemail</td>
    <td>14/01/19</td>
  </tr>
  <tr>
    <td>Christopher Walken</td>
    <td>Voicemail</td>
    <td>14/01/19</td>
  </tr>
</table>

关于css - CSS 中代表行的元素是否可以构成网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54347078/

相关文章:

javascript - 如何引用日历表单中的输入日历弹窗?

css - 避免继承 CSS superfish 菜单中的子菜单项

css - 超出范围

html - 如何从列数据而不是 HTML 中的行数据创建表格?

reactjs - 如何在网格列中设置文本区域元素的样式?

html - 创建一个按列流动的 CSS 网格,具有基于内容的动态列和行

javascript - slidingDown() 相互滑动时如何防止图像闪烁

asp.net - 如何在ASP.Net Repeater中创建三列表

javascript - Jquery为嵌套表选择td

html - 使用 CSS 网格在移动设备上拆分顶部和底部的侧边栏