CSS3的border-radius属性和border-collapse:collapse不混合.如何使用border-radius创建带圆角的折叠表?

vam*_*min 303 html css html-table rounded-corners css3

编辑-原标题:是否有其他方式来实现border-collapse:collapseCSS(为了有倒塌,圆角表)?

因为事实证明只是让表格的边框崩溃并不能解决根本问题,所以我更新了标题以更好地反映讨论.

我正在尝试使用该CSS3 border-radius属性制作带圆角的桌子.我正在使用的表格样式如下所示:

table {
    -moz-border-radius:10px;
    -webkit-border-radius:10px;
    border-radius:10px
}
Run Code Online (Sandbox Code Playgroud)

这是问题所在.我也想设置border-collapse:collapse属性,当设置border-radius不再有效时.是否有基于CSS的方式我可以获得与border-collapse:collapse没有实际使用它相同的效果?

编辑:

我做了一个简单的页面来演示这里的问题(仅限Firefox/Safari).

似乎问题的很大一部分是将表设置为圆角不会影响角td元素的角落.如果表格都是一种颜色,这不会是一个问题,因为我可以td分别为第一行和最后一行制作圆角和倒角.但是,我使用不同的背景颜色来区分标题和条纹,因此内部td元素也会显示其圆角.

建议的解决方案摘要:

桌子周围有另一个圆角的元素不起作用,因为桌子的方角"渗透".

将边框宽度指定为0不会折叠表.

底部td四角设置CELLSPACING零后仍然广场.

使用JavaScript代替 - 避免问题.

可能的解决方案:

这些表是用PHP生成的,所以我可以为每个外部的t/tds应用一个不同的类,并分别为每个角设置样式.我宁愿不这样做,因为它不是很优雅,并且应用于多个表格有点痛苦,所以请保持建议.

可能的解决方案2是使用JavaScript(特别是jQuery)来设置角落的样式.这个解决方案也有效,但仍然不是我想要的(我知道我很挑剔).我有两个保留意见:

  1. 这是一个非常轻量级的网站,我希望将JavaScript保持在最低限度
  2. 使用border-radius对我来说具有优雅降级和渐进增强的部分吸引力.通过对所有圆角使用border-radius,我希望在支持CSS3的浏览器中拥有一致的圆形网站,在其他浏览器中拥有一致的方形网站(我正在看着你,IE).

我知道今天尝试用CSS3做这件事似乎是不必要的,但我有我的理由.我还想指出,这个问题是w3c规范的结果,而不是CSS3支持不好,所以当CSS3得到更广泛的支持时,任何解决方案仍然具有相关性和实用性.

vam*_*min 222

我想到了.你只需要使用一些特殊的选择器.

圆角的问题是td元素也没有变圆.您可以通过执行以下操作来解决此问题:

table tr:last-child td:first-child {
    border-bottom-left-radius: 10px;
}

table tr:last-child td:last-child {
    border-bottom-right-radius: 10px;
}
Run Code Online (Sandbox Code Playgroud)

现在一切顺利,除了仍然存在border-collapse: collapse打破一切的问题.解决方法是border-spacing: 0在html中设置(感谢Joel).

  • 而不是乱用HTML,为什么不添加`border-spacing:0;`作为边框样式? (71认同)
  • 我在设置TR标签的背景颜色而不是TD标签时遇到了问题.如果你正在剥离你的桌子,你要设置TD的背景颜色而不是TR. (3认同)
  • 只需添加 `border-spacing: 0;` 就像 Ramon 建议的那样为我修复了它。确保将“border-radius”和“border-spacing”样式添加到“<th>”或“<td>”元素,而不是“<thead>”或“<tbody>”。 (2认同)
  • 我正在使用 bootstrap,并且通过 Ramon 的建议找到了解决方案,如下所示:`border-spacing: 0; 边框折叠:分开;` (2认同)

小智 78

以下方法使用box-shadow带有扩展1px而不是"真实"边框的方法(在Chrome中测试).

table {
    border-collapse: collapse;
    border-radius: 30px;
    border-style: hidden; /* hide standard table (collapsed) border */
    box-shadow: 0 0 0 1px #666; /* this draws the table border  */ 
}

td {
    border: 1px solid #ccc;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的东西.虽然很难在桌边上获得正确的颜色. (5认同)
  • @g.pickardou 这个问题可以通过在表元素上添加“overflow:hidden”来解决。 (5认同)
  • 如果您的桌子的背景颜色与周围区域不同,则它不可用。 (3认同)

vxs*_*xsx 57

如果你想要一个只有CSS的解决方案(不需要cellspacing=0在HTML中设置)允许1px边框(你不能用border-spacing: 0解决方案),我更喜欢做以下事情:

  • 设置一个border-rightborder-bottom表格单元格(tdth)
  • 第一行中的单元格aborder-top
  • 第一列中的单元格aborder-left
  • 使用first-childlast-child选择器,围绕四个角中的表格单元格的相应角.

在这里看一个演示.

给出以下HTML:

请参见下面的示例:

   

 .custom-table{margin:30px;}
    table {
        border-collapse: separate;
        border-spacing: 0;
        min-width: 350px;
        
    }
    table tr th,
    table tr td {
        border-right: 1px solid #bbb;
        border-bottom: 1px solid #bbb;
        padding: 5px;
    }
    table tr th:first-child, table tr th:last-child{
    border-top:solid 1px      #bbb;}
    table tr th:first-child,
    table tr td:first-child {
        border-left: 1px solid #bbb;
        
    }
    table tr th:first-child,
    table tr td:first-child {
        border-left: 1px solid #bbb;
    }
    table tr th {
        background: #eee;
        text-align: left;
    }
    
    table.Info tr th,
    table.Info tr:first-child td
    {
        border-top: 1px solid #bbb;
    }
    
    /* top-left border-radius */
    table tr:first-child th:first-child,
    table.Info tr:first-child td:first-child {
        border-top-left-radius: 6px;
    }
    
    /* top-right border-radius */
    table tr:first-child th:last-child,
    table.Info tr:first-child td:last-child {
        border-top-right-radius: 6px;
    }
    
    /* bottom-left border-radius */
    table tr:last-child td:first-child {
        border-bottom-left-radius: 6px;
    }
    
    /* bottom-right border-radius */
    table tr:last-child td:last-child {
        border-bottom-right-radius: 6px;
    }
         
Run Code Online (Sandbox Code Playgroud)
<div class="custom-table">
    <table>
        <tr>
            <th>item1</th>
            <th>item2</th>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
    </table>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案,但它有点难以阅读.我重写了一些样式规则并添加了代码的解释,所以希望这会有所帮助. (3认同)

Ces*_*sar 27

你试过用table{border-spacing: 0}而不是table{border-collapse: collapse}???

  • `border-spacing:0`的问题是你不能有1px的边框,对吗?因为边框堆叠而不是折叠. (12认同)
  • `边界折叠:分开;边框间距:0;边框半径:10px;溢出:隐藏;` 正是我所需要的。 (3认同)

小智 23

您可能需要在表格周围放置另一个元素并使用圆形边框进行样式设置.

工作草案指定是border-radius不适用于表格元素时的值border-collapsecollapse.

  • @vamin"流血" - 如果你使用`overflow:hidden;`则不然 (3认同)

小智 14

正如Ian所说,解决方案是将表嵌套在div中并将其设置为:

.table_wrapper {
  border-radius: 5px;
  overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)

有了overflow:hidden,方角不会通过div流血.

  • 请记住,无论谁想使用它,使用“overflow:hidden”,任何弹出框/工具提示都会被包装器尺寸剪切。 (4认同)

小智 8

这是一个方法:

div {
  border: 2px solid red;
  overflow: hidden;
  border-radius: 14px;
  transform: rotate(0deg);
}
table {
  border-spacing: 0;
  background-color: blue;
  height: 100%;
  width: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<div>
  <table>
    <tr>
      <td><br></td> 
    </tr>
  </table>
</div>
Run Code Online (Sandbox Code Playgroud)

或者

    div {
      ...
      overflow: hidden;
      border-radius: 14px;
      position: relative;
      z-index: 1;
    }
        
        
Run Code Online (Sandbox Code Playgroud)


Joe*_*oel 7

据我所知,你能做到的唯一方法是修改所有单元格,如下所示:

table td {
  border-right-width: 0px;
  border-bottom-width: 0px;
}
Run Code Online (Sandbox Code Playgroud)

然后在底部和右后方获得边框

table tr td:last-child {
  border-right-width: 1px;
}
table tr:last-child td {
  border-bottom-width: 1px;
}
Run Code Online (Sandbox Code Playgroud)

:last-child在ie6中无效,但如果你使用border-radius我假设你不在乎.

编辑:

查看您的示例页面后,您似乎可以使用单元格间距和填充来解决此问题.

您看到的厚灰色边框实际上是表格的背景(如果将边框颜色更改为红色,则可以清楚地看到这一点).如果将cellspacing设置为零(或等效:),td, th { margin:0; }灰色"边框"将消失.

编辑2:

我只能用一张桌子找不到办法.如果您将标题行更改为嵌套表,您可能可以获得所需的效果,但它将更多工作,而不是动态.


ada*_*ign 6

我尝试了解决方法使用伪元素:before,并:afterthead th:first-childthead th:last-child

与用桌子包裹桌子相结合 <div class="radius borderCCC">

table thead th:first-child:before{ 
    content:" ";
    position:absolute;
    top:-1px;
    left:-1px;
    width:15px;
    height:15px;
    border-left:1px solid #ccc;
    border-top:1px solid #ccc; 
    -webkit-border-radius:5px 0px 0px;
}
table thead th:last-child:after{ 
    content:" "; 
    position:absolute; 
    top:-1px;
    right:-1px; 
    width:15px;
    height:15px;
    border-right:1px solid #ccc;
    border-top:1px solid #ccc;
    -webkit-border-radius:0px 5px 0px 0px;
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle

适用于我的Chrome(13.0.782.215)让我知道这是否适用于其他浏览器.


rob*_*613 5

给定的答案仅在桌子周围没有边框时才有效,这是非常有限的!

我在 SASS 中有一个宏来执行此操作,它完全支持外部内部边框,实现与 border-collapse: collapse 相同的样式,而无需实际指定它。

在 FF/IE8/Safari/Chrome 中测试。

在所有浏览器中的纯 CSS 中提供漂亮的圆形边框,但 IE8(优雅地降级),因为 IE8 不支持边框半径 :(

一些较旧的浏览器可能需要供应商前缀才能使用border-radius,因此可以根据需要随意将这些前缀添加到您的代码中。

这个答案不是最短的 - 但它有效。

.roundedTable {
  border-radius: 20px / 20px;
  border: 1px solid #333333;
  border-spacing: 0px;
}
.roundedTable th {
  padding: 4px;
  background: #ffcc11;
  border-left: 1px solid #333333;
}
.roundedTable th:first-child {
  border-left: none;
  border-top-left-radius: 20px;
}
.roundedTable th:last-child {
  border-top-right-radius: 20px;
}
.roundedTable tr td {
  border: 1px solid #333333;
  border-right: none;
  border-bottom: none;
  padding: 4px;
}
.roundedTable tr td:first-child {
  border-left: none;
}
Run Code Online (Sandbox Code Playgroud)

要应用此样式,只需更改您的

<table>
Run Code Online (Sandbox Code Playgroud)

标记到以下内容:

<table class="roundedTable">
Run Code Online (Sandbox Code Playgroud)

并确保在您的 HTML 中包含上述 CSS 样式。

希望这可以帮助。


Jac*_*Dev 5

我刚刚为此编写了一组疯狂的 CSS,看起来效果很好:

    table {
      border-collapse: separate;
      border-spacing: 0;
      width: 100%;
    }
    table td,
    table th {
      border-right: 1px solid #CCC;
      border-top: 1px solid #CCC;
      padding: 3px 5px;
      vertical-align: top;
    }
    table td:first-child,
    table th:first-child {
      border-left: 1px solid #CCC;
    }
    table tr:last-child td,
    table tr:last-child th {
      border-bottom: 1px solid #CCC;
    }
    table thead + tbody tr:first-child td {
      border-top: 0;
    }
    table thead td,
    table th {
      background: #EDEDED;
    }
    
    /* complicated rounded table corners! */
    table thead:first-child tr:last-child td:first-child {
      border-bottom-left-radius: 0;
    }
    table thead:first-child tr:last-child td:last-child {
      border-bottom-right-radius: 0;
    }
    table thead + tbody tr:first-child td:first-child {
      border-top-left-radius: 0;
    }
    table thead + tbody tr:first-child td:last-child {
      border-top-right-radius: 0;
    }
    table tr:first-child td:first-child,
    table thead tr:first-child td:first-child {
      border-top-left-radius: 5px;
    }
    table tr:first-child td:last-child,
    table thead tr:first-child td:last-child {
      border-top-right-radius: 5px;
    }
    table tr:last-child td:first-child,
    table thead:last-child tr:last-child td:first-child {
      border-bottom-left-radius: 5px;
    }
    table tr:last-child td:last-child,
    table thead:last-child tr:last-child td:last-child {
      border-bottom-right-radius: 5px;
    }
Run Code Online (Sandbox Code Playgroud)
<table>
  <thead>
    <tr>
      <th>
        Table Head
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        Table Data
      </td>
    </tr>
  </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

/* end complicated rounded table corners !*/
Run Code Online (Sandbox Code Playgroud)


Ame*_*icA 5

实际上你可以添加你的table内部div作为其包装.然后将这些CSS代码分配给包装器:

.table-wrapper {
  border: 1px solid #f00;
  border-radius: 5px;
  overflow: hidden;
}

table {
  border-collapse: collapse;
}
Run Code Online (Sandbox Code Playgroud)