当前位置:  开发笔记 > 前端 > 正文

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

如何解决《CSS3的border-radius属性和border-collapse:collapse不混合.如何使用border-radius创建带圆角的折叠表?》经验,为你挑选了9个好方法。

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

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

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

table {
    -moz-border-radius:10px;
    -webkit-border-radius:10px;
    border-radius:10px
}

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

编辑:

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

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

建议的解决方案摘要:

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

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

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

使用JavaScript代替 - 避免问题.

可能的解决方案:

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

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

    这是一个非常轻量级的网站,我希望将JavaScript保持在最低限度

    使用border-radius对我来说具有优雅降级和渐进增强的部分吸引力.通过对所有圆角使用border-radius,我希望在支持CSS3的浏览器中拥有一致的圆形网站,在其他浏览器中拥有一致的方形网站(我正在看着你,IE).

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



1> vamin..:

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

圆角的问题是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;
}

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


而不是乱用HTML,为什么不添加`border-spacing:0;`作为边框样式?
我在设置TR标签的背景颜色而不是TD标签时遇到了问题.如果你正在剥离你的桌子,你要设置TD的背景颜色而不是TR.

2> 小智..:

以下方法使用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;
}


这是唯一对我有用的东西.虽然很难在桌边上获得正确的颜色.

3> vxsx..:

如果你想要一个只有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;
    }
         
item1 item2
item1 item2
item1 item2
item1 item2


4> Cesar..:

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


`border-spacing:0`的问题是你不能有1px的边框,对吗?因为边框堆叠而不是折叠.

5> 小智..:

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

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


@vamin"流血" - 如果你使用`overflow:hidden;`则不然

6> 小智..:

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

.table_wrapper {
  border-radius: 5px;
  overflow: hidden;
}

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



7> Joel..:

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

table td {
  border-right-width: 0px;
  border-bottom-width: 0px;
}

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

table tr td:last-child {
  border-right-width: 1px;
}
table tr:last-child td {
  border-bottom-width: 1px;
}

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

编辑:

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

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

编辑2:

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



8> adardesign..:

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

与用桌子包裹桌子相结合

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;
}

见jsFiddle

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



9> 小智..:

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

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

table {
  border-collapse: collapse;
}

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有