Свойство CSS3 border-radius и border-collapse: collapse не смешиваются. Как я могу использовать border-radius для создания свернутой таблицы с закругленными углами?

256

Изменить - Исходное название: Есть ли альтернативный способ достижения 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 углы по-прежнему квадрат после установки ячейки в ноль.

Использование JavaScript вместо этого позволяет избежать проблемы.

Возможные решения:

Таблицы генерируются в PHP, поэтому я могу просто применить другой класс к каждому из внешних th/tds и пометить каждый угол отдельно. Я бы предпочел не делать этого, поскольку он не очень изящный и немного боль для применения к нескольким таблицам, поэтому, пожалуйста, продолжайте предлагать предложения.

Возможное решение 2 - использовать JavaScript (jQuery, в частности) для создания углов. Это решение также работает, но все же не совсем то, что я ищу (я знаю, что я придирчив). У меня есть две оговорки:

  • Это очень легкий сайт, и я бы хотел, чтобы JavaScript был максимально минимальным
  • часть обращения, использующего радиус границы, для меня - грациозная деградация и прогрессивное совершенствование. Используя граничный радиус для всех закругленных углов, я надеюсь иметь последовательно округленный сайт в браузерах с поддержкой CSS3 и последовательно квадратный сайт в других (я смотрю на вас, IE).

Я знаю, что попытка сделать это с помощью CSS3 сегодня может показаться ненужной, но у меня есть причины. Я также хотел бы отметить, что эта проблема является результатом спецификации w3c, а не плохой поддержки CSS3, поэтому любое решение будет по-прежнему актуальным и полезным, когда CSS3 будет иметь более широкую поддержку.

  • 0
    Плагин jquery.corner предоставляет хорошую альтернативу: http://www.malsup.com/jquery/corner/ имеет хорошую демонстрацию своих возможностей. Вы можете указать, какие углы изменить и какой стиль изменения вы хотите выполнить, определив радиус и т. Д.
  • 2
    Я хотел бы, чтобы было решение для этого .... Я смотрю на это сам ...
Показать ещё 3 комментария
Теги:
html-table
rounded-corners

21 ответ

206
Лучший ответ

Я понял это. Вам просто нужно использовать специальные селектора.

Проблема с округлением углов таблицы заключалась в том, что элементы 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 вместо этого (спасибо, Joel).

  • 66
    Вместо того, чтобы возиться с HTML, почему бы не добавить border-spacing: 0; как стиль границы?
  • 3
    У меня возникла проблема с установкой цвета фона тега TR вместо тега TD. Если вы раздеваете свой стол, убедитесь, что вы устанавливаете цвет фона TD, а не TR.
Показать ещё 7 комментариев
60

Следующий метод работает (протестирован в 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;
}
  • 5
    Это единственное, что сработало для меня. Трудно получить правильный цвет на границе стола, хотя.
  • 0
    Он не может использоваться, если ваш стол имеет другой цвет фона, чем окружающая область.
Показать ещё 2 комментария
52

Если вы хотите использовать только CSS-решение (нет необходимости устанавливать cellspacing=0 в HTML), что позволяет использовать границы 1px (что вы не можете сделать с решением border-spacing: 0), я предпочитаю делать следующее:

  • Установите border-right и border-bottom для ваших ячеек таблицы (td и th)
  • Дайте ячейкам в первой строке border-top
  • Дайте ячейкам в первом столбце border-left
  • Используя селектора first-child и last-child, обогните соответствующие углы для ячеек таблицы в четырех углах.

См. Демонстрацию здесь.

Учитывая следующий HTML:

Пример SEE ниже:

   

 .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>
  • 1
    Пожалуйста, напишите ответы, которые включают (постоянный) код. Если в ответе много кода, просто опубликуйте соответствующие биты и объясните, почему они актуальны.
  • 3
    Это отличное решение, но его было немного сложно прочитать. Я переписал некоторые правила стиля и добавил объяснение кода, так что, надеюсь, это поможет.
Показать ещё 2 комментария
26

Пробовали ли вы использовать table{border-spacing: 0} вместо table{border-collapse: collapse}???

  • 0
    Спасибо, это позволило мне сделать то, что мне нужно было сделать (что включало ряд элементов TH в верхней части поля «закругленный угол», содержащего все TD ниже)
  • 10
    Проблема с border-spacing: 0 том, что у вас не может быть границы в 1 пиксель, верно? Потому что границы складываются, а не разрушаются.
Показать ещё 1 комментарий
22

Вам, вероятно, придется поместить еще один элемент вокруг таблицы и стиль, который будет округлен.

рабочий проект указывает, что border-radius не применяется к элементам таблицы, когда значение border-collapse равно collapse.

  • 0
    Я тоже подумал об этом, но если я создам div, чтобы окружить стол и установил его закругленными углами, квадратные углы стола все равно будут просвечивать. Смотрите недавно опубликованный пример.
  • 0
    Лучший компромисс, который я смог найти, - это добавить блок THEAD в таблицу и применить к нему серый фон (с #eee на самой таблице). Ячейки заголовка переполнились за границей ТАБЛИЦЫ, а не перед ней. Затем я увеличил границу таблицы до 3px, чтобы скрыть переполнение.
Показать ещё 2 комментария
11

Как сказал Ян, решение состоит в том, чтобы вложить таблицу в div и установить ее так:

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

С overflow:hidden квадратные углы не будут проходить через div.

  • 0
    Имейте в виду, кто бы ни захотел его использовать, что с overflow: hidden любой popover / tooltip будет обрезан размерами оболочки.
7

Насколько я знаю, единственный способ сделать это - изменить все ячейки следующим образом:

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:

После просмотра страницы с примерами, возможно, вы сможете обойти это с помощью интервала между ячейками и отступов.

Толстые серые границы, которые вы видите, на самом деле являются фоном таблицы (это можно увидеть, если вы измените цвет рамки на красный). Если вы установите для ячейки значение нуля (или эквивалентно: td, th { margin:0; }), серые "границы" исчезнут.

ИЗМЕНИТЬ 2:

Я не могу найти способ сделать это только с одной таблицей. Если вы измените строку заголовка на вложенную таблицу, возможно, вы сможете получить нужный эффект, но это будет больше работы, а не динамической.

  • 0
    Спасибо Ити, но это не работает для меня.
  • 0
    Я добавил пример с cellspacing = 0, и он намного ближе. Нежелательные границы исчезают, но нижние углы все еще кровоточат.
Показать ещё 1 комментарий
6

Я пробовал обходной путь с использованием псевдоэлементов :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). Сообщите мне, если это работает для вас в других браузерах.

5

На самом деле вы можете добавить table внутри div в качестве своей оболочки. и затем назначьте эти коды CSS оболочке:

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

table {
  border-collapse: collapse;
}
  • 2
    лучшее простое решение, спасибо
5

У меня была та же проблема. полностью удалите border-collapse и используйте: cellspacing="0" cellpadding="0" в html-документе. Пример:

<table class="top_container" align="center" cellspacing="0" cellpadding="0">
  • 0
    Это работает, но требует, чтобы вы впоследствии использовали трюки firstchild / lastchild, чтобы получить эффект.
4

Я просто написал сумасшедший набор 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 !*/
4

Для граничной и прокручиваемой таблицы используйте это (замените переменные, $ начальные тексты)

Если вы используете 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>
4

Данные ответы работают только тогда, когда нет границ вокруг таблицы, что очень важно!

У меня есть макрос в SASS для этого, который полностью поддерживает внешние и внутренние границы, достигая того же стиля, что и пограничный коллапс: свернуть, фактически не указывая его.

Протестировано в 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.

Надеюсь, что это поможет.

  • 0
    Вам больше не нужны префиксы для border-radius, ожидайте FF 3.6 (-moz). Кроме того, -khtml больше не нужен.
  • 0
    @JonatanLittke, вы всегда можете отредактировать ответ, если считаете, что его можно улучшить. Я удалил все префиксы и добавил ссылку на caniuse.com, чтобы люди могли сами принимать решения о префиксах для border-radius .
3

Нашел этот ответ, столкнувшись с той же проблемой, но нашел его довольно простым: просто дайте переполнение таблицы: hidden

Нет необходимости в элементе обертывания. Конечно, я не знаю, работало бы это 7 лет назад, когда вопрос был первоначально задан, но он работает сейчас.

  • 0
    Это умное решение, но оно также «удаляет» фактическую границу. На Chrome исчезают правая и нижняя границы таблицы, а все закругленные углы не имеют границ.
3

Я новичок в 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
}

Я пытаюсь, думаю, что это работает:)

3

Решение с пограничным обвалом: отдельный для таблицы и отображения: встроенная таблица для 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;        
}
  • 0
    нет причин делать такой ответ сообществу вики. Это позволит вам не получить репутацию от вашего ответа.
2

Я начал эксперимент с "дисплеем", и я обнаружил, что: 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;
}

Но нам нужно установить a width каждого столбца

tr td.first-column {
  width: 100px;
}
tr td.second-column {
  width: 860px;
}
  • 0
    Не работал в FF 31.0
2

Вот недавний пример того, как реализовать таблицу с закругленными углами из 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;
}
1

Стол с закругленными углами и с граничными ячейками. Использование решения @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;
  }
}
-2

Я всегда так делаю, используя 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;
    }
  }
}
  • 0
    Я полагаю, что вы, возможно, этого не поняли, он пытается сделать это с помощью border-collapse: collapse enabled.
  • 0
    @giovannipds Взгляните на его собственный ответ (принятый ответ). Мой путь - это просто другой путь. Теперь удалите «-1».
Показать ещё 1 комментарий
-2

Радиус границы теперь официально поддерживается. Таким образом, во всех приведенных выше примерах вы можете удалить префикс "-moz-".

Другой трюк заключается в том, чтобы использовать тот же цвет для верхней и нижней строк, что и ваша граница. Со всеми тремя цветами то же самое, он вписывается и выглядит как идеально округленный стол, хотя это физически не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню