解决表圆角CSS

时间:2013-05-19 13:30:55

标签: html css html-table rounded-corners

我有圆角的CSS规则:

th, td { padding: 8px;
         background: #E8ECE0;
         text-align: center;
         border: 1px solid #444;
         border-bottom-width: 0px;
}
thead { background-color: #446bb3  ; color :#fff; padding:4px; line-height:30px }
tbody tr:nth-child(even) {background: #F6F6EC;}
tbody tr:nth-child(odd) {background: #FFF}

tr:first-child td, tr:first-child th {
    border-top-left-radius: 12px; border-top-right-radius: 12px;
}
tr:last-child td {
    border-bottom: 1px solid #444;
    border-bottom-left-radius: 12px; border-bottom-right-radius: 12px;
}
table { border-spacing: 0; border: 0; margin:0px; width:100%; padding:5px}
td.pd {border-bottom-left-radius: 12px; border-bottom-right-radius: 12px;}
td.pu {border-top-left-radius: 12px; border-top-right-radius: 12px;}

我的html表是:

<table >
    <tbody>
      <tr >
        <td >Hello</td><td >Hello</td>
      </tr>
      <tr >
         <td >Hello</td><td >Hello</td>
      </tr>
      <tr >
         <td >Hello</td><td >Hello</td>
      </tr>
      <tr >
      <td >Hello</td><td >Hello</td>
      </tr>
    </tbody>
  </table>

给了我这个

table with rounded corner

如何修复此问题,因为表格和表格中间的td元素也有圆角?我只需要第一行和最后一行有圆角。

7 个答案:

答案 0 :(得分:7)

假设您的table的html类似于以下内容:

<table>
    <thead>
        <tr>
            <th>First column</th>
            <th>Second column</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Row one, cell one</td>
            <td>Row one, cell two</td>
        </tr>
        <tr>
            <td>Row two, cell one</td>
            <td>Row two, cell two</td>
        </tr>
        <tr>
            <td>Row three, cell one</td>
            <td>Row four, cell two</td>
        </tr>
    </tbody>
</table>

以下CSS应该有效:

table {
    border-spacing: 0;
}
th, td {
    border: 1px solid #000;
    padding: 0.5em 1em;
}
/* the first 'th' within the first 'tr' of the 'thead': */
thead tr:first-child th:first-child {
    border-radius: 0.6em 0 0 0;
}
/* the last 'th' within the first 'tr' of the 'thead': */
thead tr:first-child th:last-child {
    border-radius: 0 0.6em 0 0;
}
/* the first 'td' within the last 'tr' of the 'tbody': */
tbody tr:last-child td:first-child {
    border-radius: 0 0 0 0.6em;
}
/* the last 'td' within the last 'tr' of the 'tbody': */
tbody tr:last-child td:last-child {
    border-radius: 0 0 0.6em 0;
}

JS Fiddle demo

回应OP的问题编辑:

  

表中的边框有点想,我怎么做它1px

单元格之间的边框有点厚,因为一个单元格的左边框与前一个单元格的右边框相对(顶部/底部边框相同)。

删除该效果的一种方法是在border-collapse: collapse;元素上指定table。不幸的是,这样做的效果是删除/取消设置/覆盖border-radius声明:demo

更复杂的方法是手动删除前一行的行的顶部边框,以及单元格后面的单元格的左边框,将以下内容添加到上一个CSS:

thead + tbody tr td,
tr + tr td {
    border-top: 0;
}

tr th + th,
tr td + td {
    border-left: 0;
}

JS Fiddle demo

编辑减少使CSS更耐用(对于单格单元格行,添加tfoot或删除thead):

table {
    border-spacing: 0;
}
th, td {
    border: 1px solid #000;
    padding: 0.5em 1em;
}
thead tr:first-child th:first-child,
tbody:first-child tr:first-child td:first-child {
    border-top-left-radius: 0.6em;
}
thead tr:first-child th:last-child,
tbody:first-child tr:first-child td:last-child {
    border-top-right-radius: 0.6em;
}

thead + tbody tr:last-child td:first-child,
tfoot tr:last-child td:first-child {
    border-bottom-left-radius: 0.6em;
}
thead + tbody tr:last-child td:last-child,
tfoot tr:last-child td:last-child {
    border-bottom-right-radius: 0.6em;
}

thead + tbody tr td,
tfoot + tbody tr td,
tfoot tr td,
tbody + tbody tr td,
tr + tr td {
    border-top: 0;
}

tr th + th,
tr td + td {
    border-left: 0;
}

JS Fiddle demo

在没有tbody元素的情况下,多个tfoot元素存在问题,目前第一个tbody将在其下边框保留border-radius。< / p>

答案 1 :(得分:6)

你可以把表放入div。 div的样式(示例):

div {
  border-radius: 4px;
  -moz-border-radius: 4px
  -webkit-border-radius: 4px;
  overflow: hidden; /*notice*/
}

因此桌角将被隐藏。

答案 2 :(得分:2)

这个答案没有直接回答你的问题,而是一个变体。 如果您不希望中间列有圆角,这是一个可能的解决方案:

插图:

enter image description here

表行(tr)的属性:更新最左列的表数据(td):

tbody tr td:first-child
{
    border-radius: 0.6em 0 0 0.6em;
}

表行(tr)的属性:更新第二列的表数据(td):

tbody td:nth-child(2)
{
    border-radius: 0 0.6em 0.6em 0;
}

以下是一个示例:JS Fiddle demo

如果你有多个列(td或th),你只需添加如下内容:

tbody td:nth-child(2) /* This is now the middle element out of three */
{
    border-radius: 0 0 0 0;
}
tbody td:nth-child(3) /* This is now the right most column */
{
    boder-radius: 0 0.6em 0.6em 0;
}

答案 3 :(得分:0)

您可以重置td元素的边框半径。那应该解决它。

答案 4 :(得分:0)

您可以为td元素指定id,并使用td元素的id将边框半径设置为0px。

答案 5 :(得分:0)

你应该尝试一下 clear:both; 它将被重置。 您也可以尝试!important,因为您可能会忘记其他html代码中的其他“内联css规则”。

答案 6 :(得分:0)

虽然这是一个陈旧的答案,但我想通过添加我的发现来加强它。除了David Thomas的超级智能answer之外,我发现了一个不完全适合的边缘情况:单细胞行!例如:

<table>
   <tr><th colspan="3">My header</th></tr>
   <tr><td>row1-cell1</td><td>row1-cell2</td><td>row1-cell3</td></tr>
   <tr><td>row2-cell1</td><td>row2-cell2</td><td>row2-cell3</td></tr>
   <tr><th colspan="3">My footer</th></tr>
</table>

右上角的规则会覆盖左上角的规则(因为它在它之后),而右下角的规则会覆盖左下角的规则(对于同样的原因)。见下面的屏幕截图:

Overriden Corners http://i57.tinypic.com/v41091.jpg

对此的补救措施是下面的CSS(我根据需要为各种table-tr,tbody-tr,thead-tr组合添加了更多选择器,所以你也可以扩展它以适合你的标记):

        table td,
        table th{
            border: 1px solid #666;
        }

        table{
            width: 98%;
            border-spacing: 0px;
        }

         /* alternating table row colors*/
        tr:nth-child(even)  { background-color:#f6f6f6; }
        tr:nth-child(odd)   { background-color:#ffffff; }

        /* set all corner radii initially to zero */
        th, td {
            border-radius: 0;
        }

        /*set only specific radii per corner (don't use the border-radius shorthand)*/
        thead tr:first-child th:first-child, 
        table tr:first-child td:first-child,
        tbody tr:first-child th:first-child {
            border-top-left-radius: 0.6em;
        }
        thead tr:first-child th:last-child, 
        table tr:first-child td:last-child,
        tbody tr:first-child th:last-child {
            border-top-right-radius: 0.6em;
        }
        tbody tr:last-child td:first-child, 
        table tr:last-child td:first-child,
        tbody tr:last-child th:first-child {
            border-bottom-left-radius: 0.6em;
        }
        tbody tr:last-child td:last-child, 
        table tr:last-child td:last-child,
        tbody tr:last-child th:last-child {
            border-bottom-right-radius: 0.6em;
        }

        thead + tbody tr td,
        tr + tr td ,
        tr + tr th {
            border-top: 0;
        }

        tr th + th,
        tr td + td {
            border-left: 0;
        }

        /* shade th cells */
        table th {
            background-color: #888;
            color: #FFF;
        }

根据需要,这会产生下面的屏幕截图:

Fixed Corners http://i57.tinypic.com/5bqwqq.jpg

此解决方案的所有功劳仍归David Thomas,特别是对于相邻的单元格边界技巧!