Как я могу применить границы только внутри таблицы?

195

Я пытаюсь выяснить, как добавить границу только внутри таблицы. Когда я делаю:

table {
    border: 0;
}
table td, table th {
    border: 1px solid black;
}

Граница вокруг всей таблицы, а также между ячейками таблицы. Чего я хочу добиться, так это иметь рамку только внутри таблицы вокруг ячеек таблицы (без внешней границы вокруг таблицы).

Вот разметка, которую я использую для таблиц (хотя я думаю, что это не важно):

<table>
    <tr>
        <th>Heading 1</th>
        <th>Heading 2</th>
    </tr>
    <tr>
        <td>Cell (1,1)</td>
        <td>Cell (1,2)</td>
    </tr>
    <tr>
        <td>Cell (2,1)</td>
        <td>Cell (2,2)</td>
    </tr>
    <tr>
        <td>Cell (3,1)</td>
        <td>Cell (3,2)</td>
    </tr>
</table>

И вот несколько основных стилей, которые я применяю к большинству моих таблиц:

table {
    border-collapse: collapse;
    border-spacing: 0;
}
Ричард Кноп
источник
Я вижу только границы только вокруг клеток. Поскольку каждая из ячеек имеет границу, кажется, что таблица имеет границу. Возможно, я не понимаю вопрос?
Четан С
3
Также называется внутренними границами .
Механическая улитка

Ответы:

203

Если вы делаете то, что, как я считаю, вы пытаетесь сделать, вам понадобится что-то более похожее на это:

table {
  border-collapse: collapse;
}
table td, table th {
  border: 1px solid black;
}
table tr:first-child th {
  border-top: 0;
}
table tr:last-child td {
  border-bottom: 0;
}
table tr td:first-child,
table tr th:first-child {
  border-left: 0;
}
table tr td:last-child,
table tr th:last-child {
  border-right: 0;
}

jsFiddle Demo

Проблема заключается в том, что вы устанавливаете «полную рамку» вокруг всех ячеек, что создает видимость, как будто у вас есть рамка вокруг всей таблицы.

Приветствия.

РЕДАКТИРОВАТЬ: немного больше информации об этих псевдоклассах можно найти в quirksmode , и, как и следовало ожидать, вы в значительной степени SOL с точки зрения поддержки IE.

theIV
источник
С такими простыми таблицами есть гораздо более короткое решение, которое позволяет избежать использования псевдоклассов с помощью следующего братского комбинатора. Смотри мой ответ.
Далгард
1
@theIV, с ответом 5+ лет назад, есть ли «новый» / «более эффективный» способ, которым это?
jbutler483
Не работает, если вы когда-либо использовали rowspan в первом столбце таблицы.
Джек,
192

это работает для меня:

table {
    border-collapse: collapse;
    border-style: hidden;
}

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

посмотреть пример ...

протестирован в FF 3.6 и Chromium 5.0, IE не поддерживает; из W3C :

Границы с «пограничным стилем» «скрытого» имеют приоритет над всеми остальными конфликтующими границами. Любая граница с этим значением подавляет все границы в этом месте.

anthonyrisinger
источник
1
Пока вам не нужна граница таблицы, это определенно самое элегантное решение.
cjroth
42

Пример очень простого для вас способа достижения желаемого эффекта:

<table border="1" frame="void" rules="all">
    <tr>
        <td>1111</td>
        <td>2222</td>
        <td>3333</td>
    </tr>
    <tr>
        <td>4444</td>
        <td>5555</td>
        <td>6666</td>
    </tr>
</table>
Jony
источник
13
«MAGIC» ОБЪЯСНЕНО: frame и rulesявляются СТАРЫМИ (не HTML5) table атрибутами (вместо этого следует использовать CSS). frameговорит, какие части внешних границ таблицы должны быть видны - voidзначит скрывать все внешние границы ... rulesговорит, какие части внутренних границ таблицы должны быть видны - allозначает все их ... очевидно ... Пожалуйста, не используйте это, если вы фанатичны HTML3 ... :)
jave.web
1
Добавление чего-то вроде границы: 1px сплошной черный цвет гарантирует, что внешняя граница таблицы получит границу.
Аарон Лю
1
Работал как шарм в 2020 году, чтобы быстро добавить читаемость к смехотворно разнесенной таблице на веб-сайте, который я читал. Собственно, только этого было достаточно для внутренних границ: rules = "all"
Эдоардо Фаччинелли
11

Из-за совместимости mantain с ie7, ie8 я предлагаю использовать first-child, а не last-child, для этого:

table tr td{border-top:1px solid #ffffff;border-left:1px solid #ffffff;}

table tr td:first-child{border-left:0;}

table tr:first-child td{border-top:0;}

Вы можете узнать о псевдоклассах CSS 2.1 по адресу: http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx

Crisboot
источник
Это отличное решение. Но будьте осторожны, если у вас есть другая таблица в одной из ваших ячеек таблицы и вы хотите увидеть внутренние границы, вам нужен еще один набор строк CSS для вашей «внутренней» таблицы
Майкл Бирманн
10

Для обычной разметки таблиц, вот краткое решение, которое работает на всех устройствах / браузерах в BrowserStack, кроме IE 7 и ниже:

table { border-collapse: collapse; }

td + td,
th + th { border-left: 1px solid; }
tr + tr { border-top: 1px solid; }

Для поддержки IE 7 добавьте это:

tr + tr > td,
tr + tr > th { border-top: 1px solid; }

Тестовый пример можно увидеть здесь: http://codepen.io/dalgard/pen/wmcdE

Dalgard
источник
Великолепно - так как это также позволяет установить другую границу таблицы, скорее, чем просто не отображать ее.
jsbueno
5

это должно работать:

table {
 border:0;
}

table td, table th {
    border: 1px solid black;
    border-collapse: collapse;
}

редактировать:

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

это тестовый файл:

<html>
<head>
<style type="text/css">
table {
    border-collapse: collapse;
    border-spacing: 0;
}


table {
    border: 0;
}
table td, table th {
    border: 1px solid black;
}


</style>
</head>
<body>
<table>
    <tr>
        <th>Heading 1</th>
        <th>Heading 2</th>
    </tr>
    <tr>
        <td>Cell (1,1)</td>
        <td>Cell (1,2)</td>
    </tr>
    <tr>
        <td>Cell (2,1)</td>
        <td>Cell (2,2)</td>
    </tr>
    <tr>
        <td>Cell (3,1)</td>
        <td>Cell (3,2)</td>
    </tr>
</table>

</body>
</html>
Руфин
источник
Нет, это не сработало, я попробовал это. Я отредактирую свой первый пост.
Ричард Кноп
0

Добавьте границу к каждой ячейке с этим:

table > tbody > tr > td { border: 1px solid rgba(255, 255, 255, 0.1); }

Удалите верхнюю границу со всех ячеек в первом ряду:

table > tbody > tr:first-child > td { border-top: 0; }

Удалите левую границу из ячеек в первом столбце:

table > tbody > tr > td:first-child { border-left: 0; }

Удалите правую границу из ячеек в последнем столбце:

table > tbody > tr > td:last-child { border-right: 0; }

Удалите нижнюю границу из ячеек в последнем ряду:

table > tbody > tr:last-child > td { border-bottom: 0; }

http://jsfiddle.net/hzru0ytx/

Брайан
источник
0

Работает для любой комбинации tbody / thead / tfoot и td / th

table.inner-border {
    border-collapse: collapse;
    border-spacing: 0;
}

table.inner-border > thead > tr > th,
table.inner-border > thead > tr > td,
table.inner-border > tbody > tr > th,
table.inner-border > tbody > tr > td,
table.inner-border > tfoot > tr > th,
table.inner-border > tfoot > tr > td {
    border-bottom: 1px solid black;
    border-right: 1px solid black;
}

table.inner-border > thead > tr > :last-child,
table.inner-border > tbody > tr > :last-child,
table.inner-border > tfoot > tr > :last-child {
    border-right: 0;
}

table.inner-border > :last-child > tr:last-child > td,
table.inner-border > :last-child > tr:last-child > th {
    border-bottom: 0;
}
<table class="inner-border">
    <thead>
    <tr>
        <th>head1,1</th>
        <td>head1,2</td>
        <td>head1,3</td>
    </tr>
    <tr>
        <td>head2,1</td>
        <td>head2,2</td>
        <th>head2,3</th>
    </tr>
    </thead>
    <tr>
        <td>1,1</td>
        <th>1,2</th>
        <td>1,3</td>
    </tr>
    <tr>
        <td>2,1</td>
        <td>2,2</td>
        <td>2,3</td>
    </tr>
    <tr>
        <td>3,1</td>
        <td>3,2</td>
        <td>3,3</td>
    </tr>
    <thead>
    <tr>
        <th>foot1,1</th>
        <td>foot1,2</td>
        <td>foot1,3</td>
    </tr>
    <tr>
        <td>foot2,1</td>
        <th>foot2,2</th>
        <th>foot2,3</th>
    </tr>
    </thead>
</table>

user1119279
источник