it-swarm.com.ru

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

Правка - Исходное название: Есть ли альтернативный способ получения border-collapse:collapse в CSS (для того, чтобы иметь свернутую таблицу закругленных углов)?

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

Я пытаюсь создать таблицу со скругленными углами , используя свойство CSS3border-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) для стилизации углов. Это решение также работает, но все еще не совсем то, что я ищу (я знаю, что я привередлива). У меня есть две оговорки:

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

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

288
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, ломающая все. Обходное решение - вместо этого установить cellspacing="0" в html (спасибо, Джоэл ).

213
vamin

Следующий метод работает (проверено в 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;
}
74
cmrd.Kaash

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

  • Установите border-right и border-bottom для ячеек таблицы (td и th)
  • Дайте ячейкам в первой строке border-top
  • Дайте ячейкам в первом столбце 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>
55
vxsx

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

27
Cesar

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

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

23
user59200

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

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

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

14
Chris

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

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:

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

7
Joel

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

6
adardesign

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

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

table {
  border-collapse: collapse;
}
5
AmerllicA

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

<table class="top_container" align="center" cellspacing="0" cellpadding="0">
5
lars

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

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

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

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

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

Протестировано в FF/IE8/Safari/Chrome.

Дает хорошие округленные границы в чистом CSS во всех браузерах, но IE8 (изящно ухудшается), так как IE8 не поддерживает border-radius :(

Некоторые старые браузеры могут требовать префиксов поставщиков для работы с 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.

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

4
robbie613

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

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

3
Akexis

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

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

Решение с 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;        
}
3
Tommer

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

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

Я всегда так делаю, используя 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
Diego Mello