#html #css #html-table
#HTML #css #html-таблица #граница
Вопрос:
Я пытаюсь выяснить, как добавить границу только внутри таблицы. Когда я делаю:
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;
}
Комментарии:
1. Я вижу только границы только вокруг ячеек. Поскольку каждая из ячеек имеет границу, создается впечатление, что таблица имеет границу. Возможно, я не понял вопроса?
2. Также называется внутренними границами .
Ответ №1:
Если вы делаете то, что, как я полагаю, вы пытаетесь сделать, вам понадобится что-то более похожее на это:
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;
}
Проблема в том, что вы устанавливаете «полную границу» вокруг всех ячеек, из-за чего создается впечатление, что у вас есть граница вокруг всей таблицы.
РЕДАКТИРОВАТЬ: Немного больше информации об этих псевдоклассах можно найти на quirksmode, и, как и следовало ожидать, вы в значительной степени профессионал в плане поддержки IE.
Комментарии:
1. С простыми таблицами, подобными этой, существует гораздо более короткое решение, которое позволяет избежать использования псевдоклассов, используя комбинатор next sibling. Смотрите мой ответ.
2. @theIV, поскольку на этот вопрос был дан ответ более 5 лет назад, есть ли какой-либо «новый» / «более эффективный» способ сделать это?
3. Не работает, если вы когда-либо используете rowspan для первого столбца в таблице.
Ответ №2:
это работает для меня:
table {
border-collapse: collapse;
border-style: hidden;
}
table td, table th {
border: 1px solid black;
}
протестировано в FF 3.6 и Chromium 5.0, IE не поддерживает; от W3C:
Границы с ‘border-style’ ‘hidden’ имеют приоритет над всеми другими конфликтующими границами. Любая граница с этим значением подавляет все границы в этом местоположении.
Комментарии:
1. Пока вам не нужна граница таблицы, это, безусловно, самое элегантное решение.
Ответ №3:
Пример очень простого способа для достижения желаемого эффекта:
<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>
Комментарии:
1.ОБЪЯСНЕНО «ВОЛШЕБСТВО»:
frame
иrules
являются старыми (не HTML5)table
атрибутами (вместо этого вы должны использовать CSS).frame
указывает, какие части внешних границ таблицы должны быть видны —void
означает скрыть все внешние границы…rules
указывает, какие части внутренних границ таблицы должны быть видны —all
означает все из них … очевидно… Пожалуйста, не используйте это, если вы не фанатик HTML3 … 🙂2. Добавление чего-то вроде границы: сплошной черный размер 1 пиксель гарантирует, что внешняя граница таблицы получит границу.
3. В 2020 году это сработало как по волшебству, быстро добавив некоторую читабельность таблице с нелепыми интервалами на веб-сайте, который я читал. На самом деле, только этого было достаточно для внутренних границ: rules=»all»
Ответ №4:
Для обычной разметки таблицы вот краткое решение, которое работает на всех устройствах / браузерах в 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
Комментарии:
1. Отлично — поскольку это также позволяет установить другую границу для таблицы, а не просто не отображать ее.
2. Это действительно очень умно, и к тому же так коротко. Мне это очень нравится.
Ответ №5:
Из-за совместимости 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
Комментарии:
1. Это отличное решение. Но будьте осторожны, если у вас есть другая таблица в одной из ячеек вашей таблицы и вы хотите увидеть внутренние границы, вам понадобится другой набор строк CSS для вашей «внутренней» таблицы
Ответ №6:
это должно сработать:
table {
border:0;
}
table td, table th {
border: 1px solid black;
border-collapse: collapse;
}
Редактировать:
я только что попробовал, границы таблицы нет. но если я установлю границу таблицы, она будет удалена с помощью border-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>
Комментарии:
1. Нет, это не сработало, я пробовал это. Я отредактирую свой первый пост.
Ответ №7:
это сделает все это без css <TABLE BORDER=1 RULES=ALL FRAME=VOID>
Ответ №8:
Работает для любой комбинации 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>
Ответ №9:
Добавьте границу к каждой ячейке с помощью этого:
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; }
Ответ №10:
Это должно сработать:
HTML:
<table frame="void" rules="all">
CSS — файл:
td, th {
border: 1px solid red;
}