Свойство border-radius CSS3 и border-collapse: collapse не смешиваются. Как использовать border-radius для создания свернутой таблицы со скругленными углами?
Edit-Оригинальное Название: есть ли альтернативный способ достижения border-collapse:collapse
на CSS
(для того, чтобы иметь свернутый, закругленный угловой стол)?
поскольку выясняется, что простое сворачивание границ таблицы не решает корневую проблему, я обновил заголовок, чтобы лучше отразить обсуждение.
Я пытаюсь сделать стол с закругленными углами С помощью 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, поэтому я мог бы просто применить другой класс к каждому из внешних th / tds и стиль каждого угла отдельно. Я бы предпочел не делать этого, так как это не очень элегантно и немного больно применять к нескольким таблицам, поэтому, пожалуйста, продолжайте предложения.
возможное решение 2-использовать JavaScript (в частности, jQuery) для стилизации углов. Это решение также работает, но все еще не совсем то, что я ищу (я знаю, что я придирчивый). У меня две оговорки.:
- это очень легкий сайт, и я хотел бы сохранить JavaScript до минимума
- часть привлекательности, которую для меня имеет использование border-radius, - это изящная деградация и прогрессивное улучшение. Используя border-radius для всех закругленных углов, я надеюсь иметь последовательно закругленный сайт в браузерах с поддержкой CSS3 и последовательно квадратный сайт в других (я смотрю на вас, т. е.).
я знаю, что пытаюсь сделать это с помощью CSS3 сегодняшний день может показаться ненужным, но у меня есть свои причины. Я также хотел бы отметить, что эта проблема является результатом спецификации w3c, а не плохой поддержки CSS3, поэтому любое решение будет по-прежнему актуальным и полезным, когда CSS3 имеет более широкую поддержку.
21 ответов
я понял. Вам просто нужно использовать некоторые специальные селекторы.
проблема с округлением углов таблицы заключалась в том, что элементы 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
ломая все. Только установил cellspacing="0"
в html вместо этого (спасибо,Джоул).
следующий метод работает (проверено в Chrome) с помощью box-shadow
С распространением 1px
вместо "реальной" границы.
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;
}
если вы хотите решение только для CSS (не нужно устанавливать cellspacing=0
в HTML), что позволяет для границ 1px (что вы не можете сделать с border-spacing: 0
решение), я предпочитаю делать следующее:
- поставил
border-right
иborder-bottom
для ячейки таблицы (td
иth
) - дайте клетки в первая строка a
border-top
- дайте клетки в первый столбец a
border-left
- С помощью
first-child
иlast-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;
}
<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>
вам, вероятно, придется поместить другой элемент вокруг таблицы и стиль, который с закругленной границей.
на рабочий проект указывает, что border-radius
не применяется к элементам таблицы, когда значение border-collapse
is collapse
.
Как сказал Ян, решение состоит в том, чтобы вложить таблицу в div и установить ее так:
.table_wrapper {
border-radius: 5px;
overflow: hidden;
}
С overflow:hidden
, квадратные углы не будут кровоточить через div.
насколько мне известно, единственный способ сделать это - изменить все ячейки следующим образом:
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
Я полагаю, вам все равно.
EDIT:
после просмотра вашей страницы примера, кажется, что вы можете обойти это с интервалом между ячейками и заполнением.
толстые серые границы, которые вы видите на самом деле фон таблицы (вы можете видеть это ясно, если вы измените цвет рамки на красный). Если вы установите cellspacing в ноль (или эквивалентно:td, th { margin:0; }
) серые "границы" исчезнут.
EDIT 2:
Я не могу найти способ сделать это только с одной таблицей. Если вы измените строку заголовка на вложенную таблицу, возможно, вы сможете получить желаемый эффект, но это будет больше работа, а не динамика.
я попробовал обходной путь, используя псевдо-элементы :before
и :after
на thead th:first-child
и thead 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;
}
посмотреть jsFiddle
работает для меня в chrome (13.0.782.215) Дайте мне знать, если это работает для вас в других браузерах.
у меня была та же проблема.
удалить border-collapse
полностью и использовать:
cellspacing="0" cellpadding="0"
в HTML-документе.
пример:
<table class="top_container" align="center" cellspacing="0" cellpadding="0">
ответы только тогда, когда нет границ вокруг стола, что очень ограничивает!
у меня есть макрос в 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;
}
, чтобы применить этот стиль просто изменить свой
<table>
тег следующим образом:
<table class="roundedTable">
и обязательно включите вышеупомянутые стили CSS в свой HTML.
надеюсь, что это помогает.
для граничной и прокручиваемой таблицы используйте это (замените переменные,$
начиная с текстов)
если вы используете thead
, tfoot
или th
, просто заменить tr:first-child
и tr-last-child
и td
С ними.
#table-wrap {
border: $border solid $color-border;
border-radius: $border-radius;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
table td { border: $border solid $color-border; }
table td:first-child { border-left: none; }
table td:last-child { border-right: none; }
table tr:first-child td { border-top: none; }
table tr:last-child td { border-bottom: none; }
table tr:first-child td:first-child { border-top-left-radius: $border-radius; }
table tr:first-child td:last-child { border-top-right-radius: $border-radius; }
table tr:last-child td:first-child { border-bottom-left-radius: $border-radius; }
table tr:last-child td:last-child { border-bottom-right-radius: $border-radius; }
HTML-код:
<div id=table-wrap>
<table>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
</table>
</div>
Я только что написал сумасшедший набор 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;
}
/* end complicated rounded table corners !*/
на самом деле вы можете добавить ваш table
внутри div
в качестве обертки. а затем назначьте эти CSS
коды для обертки:
.table-wrapper {
border: 1px solid #f00;
border-radius: 5px;
overflow: hidden;
}
table {
border-collapse: collapse;
}
решение с border-collapse: отдельно для таблицы и отображения: inline-table для tbody и thead.
table {
width: 100%;
border-collapse: separate;
border-spacing: 0px;
background: transparent;
}
table thead {
display: inline-table;
width: 100%;
background: #fc0 url(../images/bg-heading.png) repeat-x 0% 0;
-webkit-border-top-left-radius: 7px;
-moz-border-radius-topleft: 7px;
-webkit-border-top-right-radius: 7px;
-moz-border-radius-topright: 7px;
border-radius: 7px 7px 0px 0px;
padding: 1px;
padding-bottom: 0;
}
table tbody {
border: 1px solid #ddd;
display: inline-table;
width: 100%;
border-top: none;
}
Я новичок в HTML и CSS, и я также искал решение для этого, вот что я нахожу.
table,th,td {
border: 1px solid black;
border-spacing: 0
}
/* add border-radius to table only*/
table {
border-radius: 25px
}
/* then add border-radius to top left border of left heading cell */
th:first-child {
border-radius: 25px 0 0 0
}
/* then add border-radius to top right border of right heading cell */
th:last-child {
border-radius: 0 25px 0 0
}
/* then add border-radius to bottom left border of left cell of last row */
tr:last-child td:first-child {
border-radius: 0 0 0 25px
}
/* then add border-radius to bottom right border of right cell of last row */
tr:last-child td:last-child {
border-radius: 0 0 25px 0
}
Я пробую, угадайте, что он работает:)
нашел этот ответ после запуска той же проблемы, но обнаружил, что это довольно просто: просто дайте переполнение таблицы: hidden
отсутствие потребности для оборачивая элемента. Конечно, я не знаю, сработало бы это 7 лет назад, когда вопрос был первоначально задан, но он работает сейчас.
я начал эксперимент с "дисплеем", и я обнаружил, что: border-radius
, border
, margin
, padding
, в table
отображаются с:
display: inline-table;
table tbody tr {
display: inline-table;
width: 960px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
но нам нужно установить width
каждой колонки
tr td.first-column {
width: 100px;
}
tr td.second-column {
width: 860px;
}
вот недавний пример того, как реализовать таблицу с закругленными углами изhttp://medialoot.com/preview/css-ui-kit/demo.html. Он основан на специальных селекторах, предложенных Джоэлом Поттером выше. Как вы можете видеть, он также включает в себя некоторую магию, чтобы сделать IE немного счастливым. Он включает в себя некоторые дополнительные стили, чтобы чередовать цвет строк:
table-wrapper {
width: 460px;
background: #E0E0E0;
filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#E9E9E9', endColorstr='#D7D7D7');
background: -webkit-gradient(linear, left top, left bottom, from(#E9E9E9), to(#D7D7D7));
background: -moz-linear-gradient(top, #E9E9E9, #D7D7D7);
padding: 8px;
-webkit-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-moz-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-o-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-khtml-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-webkit-border-radius: 10px;
/*-moz-border-radius: 10px; firefox doesn't allow rounding of tables yet*/
-o-border-radius: 10px;
-khtml-border-radius: 10px;
border-radius: 10px;
margin-bottom: 20px;
}
.table-wrapper table {
width: 460px;
}
.table-header {
height: 35px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
text-align: center;
line-height: 34px;
text-decoration: none;
font-weight: bold;
}
.table-row td {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
text-align: left;
text-decoration: none;
font-weight: normal;
color: #858585;
padding: 10px;
border-left: 1px solid #ccc;
-khtml-box-shadow: 0px 1px 0px #B2B3B5;
-webkit-box-shadow: 0px 1px 0px #B2B3B5;
-moz-box-shadow: 0px 1px 0px #ddd;
-o-box-shadow: 0px 1px 0px #B2B3B5;
box-shadow: 0px 1px 0px #B2B3B5;
}
tr th {
border-left: 1px solid #ccc;
}
tr th:first-child {
-khtml-border-top-left-radius: 8px;
-webkit-border-top-left-radius: 8px;
-o-border-top-left-radius: 8px;
/*-moz-border-radius-topleft: 8px; firefox doesn't allow rounding of tables yet*/
border-top-left-radius: 8px;
border: none;
}
tr td:first-child {
border: none;
}
tr th:last-child {
-khtml-border-top-right-radius: 8px;
-webkit-border-top-right-radius: 8px;
-o-border-top-right-radius: 8px;
/*-moz-border-radius-topright: 8px; firefox doesn't allow rounding of tables yet*/
border-top-right-radius: 8px;
}
tr {
background: #fff;
}
tr:nth-child(odd) {
background: #F3F3F3;
}
tr:nth-child(even) {
background: #fff;
}
tr:last-child td:first-child {
-khtml-border-bottom-left-radius: 8px;
-webkit-border-bottom-left-radius: 8px;
-o-border-bottom-left-radius: 8px;
/*-moz-border-radius-bottomleft: 8px; firefox doesn't allow rounding of tables yet*/
border-bottom-left-radius: 8px;
}
tr:last-child td:last-child {
-khtml-border-bottom-right-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-o-border-bottom-right-radius: 8px;
/*-moz-border-radius-bottomright: 8px; firefox doesn't allow rounding of tables yet*/
border-bottom-right-radius: 8px;
}
таблица с округленными углами и с граничными клетками. Используя @Ramon Tayag решение.
ключ должен использовать border-spacing: 0
как он указывает.
решение с помощью SCSS.
$line: 1px solid #979797;
$radius: 5px;
table {
border: $line;
border-radius: $radius;
border-spacing: 0;
th,
tr:not(:last-child) td {
border-bottom: $line;
}
th:not(:last-child),
td:not(:last-child) {
border-right: $line;
}
}
Border-radius теперь официально поддерживается. Таким образом, во всех приведенных выше примерах вы можете удалить префикс "-moz -".
еще один трюк-использовать тот же цвет для верхних и нижних строк, что и ваша граница. Все 3 цвета, он сливается и выглядит как идеально круглый стол, Даже если не физически.
Я всегда делаю так, используя Sass
table {
border-radius: 0.25rem;
thead tr:first-child th {
&:first-child {
border-top-left-radius: 0.25rem;
}
&:last-child {
border-top-right-radius: 0.25rem;
}
}
tbody tr:last-child td {
&:first-child {
border-bottom-left-radius: 0.25rem;
}
&:last-child {
border-bottom-right-radius: 0.25rem;
}
}
}