Как установить интервал между элементами TBODY


99

У меня есть такая таблица:

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

Я хотел бы поставить некоторый интервал между каждым элементом tbody, но отступы и поля не действуют. Любые идеи?


Правильно ли повторять теги «tbody»? Я всегда видел, что все «<tr> .. </tr>» находятся внутри одного тега «
tbody»

25
Да, это действительно так. В спецификации сказано: <! ELEMENT TABLE - - (CAPTION ?, (COL * | COLGROUP *), THEAD ?, TFOOT ?, TBODY +)>, что означает, что должно быть одно или несколько tbody. w3.org/TR/html4/struct/tables.html#h-11.2.1
nickf,

Ответы:


58

Попробуйте это, если вы не против отсутствия границ.

<style>
table {
  border-collapse: collapse;
}

table tbody {
  border-top: 15px solid white;
}
</style>

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

8
Попробуйте border-top: 15px solid transparent;
Стив Алмонд,

3
Хотел это подчеркнуть. Использовать transparentкак цвет границы. Что сказал @SteveAlmond.
iheartcsharp

если таблица / tbody / tr / td имеет цвет фона, установка цвета границы transparentдаст ему цвет фона элемента, практически неотличимый от тела элемента. Вам нужно будет явно окрасить границу в тот цвет, в который вы хотите, чтобы она отображалась (чтобы сделать ее якобы невидимой)
Гай Пасси,

83

Примерно так будет работать, в зависимости от требований поддержки вашего браузера:

tbody::before
{
  content: '';
  display: block;
  height: 15px;

}

1
Это единственное решение, которое работает, когда у ваших ячеек есть фон, которого не должно быть в пространстве.
Laradda

У меня это сработало. Есть ли недостатки? Кроме того, почему два двоеточия?
nh2

Отличное решение. Всё доступно!
Jason T Featheringham

1
@ nh2: двойные двоеточия предназначены для псевдосодержания, а одинарное двоеточие - для псевдоселекторов. Это обновление синтаксиса CSS. Раньше все использовали только одно двоеточие. Старые браузеры не поддерживают двойное двоеточие (например, IE <= 8).
dbmikus

3
Разве не безопаснее пользоваться display: table-row;?
Рэйчел

20

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

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

    .separator{
             height: 50px;
    }

   <table>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>

           <tr class="separator" colspan="2"></tr>

           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>

           <tr class="separator" colspan="2"></tr>

           tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
   </table>

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

tr{
   height: 40px;
}

ну, если вы собираетесь добавить дополнительную разметку, почему бы просто не поместить класс в первую строку каждого тела?
nickf

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

12
Голосуйте вниз, сколько хотите, но это единственное решение без недостатков - и даже если оно нарушает разделение, пустая строка не такая уж большая проблема, IMO.
Xkeeper

11
Без недостатков моя задница! Попробуйте использовать для этого программу чтения с экрана и обратите внимание на неправильное количество строк. А еще лучше попробуйте скопировать и вставить таблицу в электронную таблицу. Если у вас много контента, вы будете переформатировать его часами. Таблицы предназначены для отображения данных (и должны быть чрезвычайно доступными), а не для отображения разделов между разделами.
Джейсон Т. Фезерингем

Это только наглядно. Имейте в виду, что HTML - это также документы, которые можно обрабатывать, поэтому содержимое внутри них должно быть хорошо отформатировано. Как упоминалось выше, скопировать и вставить таблицу или использовать программу чтения с экрана просто не удастся. Такой дизайн не следует поощрять. :: контентное решение лучше, потому что оно не портит разметку.
павел-кузник

12

Я был в беде расстояние между правильно множественным <tbody>с ::beforeпсевдо, в присутствии <tr>содержащий <td>с RowSpan в нескольких браузерах.

В принципе, если у вас есть такая <tbody>структура:

<tbody>
    <tr>
        <td>td 1</td>
        <td rowspan"2">td 2</td>
        <td>td 3</td>
        <td>td 4</td>
    </tr>
    <tr>
        <td>td 1</td>
        <td>td 2</td>
        <td>td 4</td>
    </tr>
</tbody>

И вы следите за тем, кто советует писать css на ::beforeпсевдоэлементе вот так:

tbody::before
{
    content: '';
    display: block;
    height: 10px;
}

Это повлияет на rowspan, заставляя таблицу "проигрывать" в течение второго, <tr>сколько <td>-rowspan присутствует в первом.

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

tbody::before
{
    content: '';
    display: table-row;
    height: 10px;
}

Вот скрипка


6

Вот еще одна возможность, которая зависит от: first-child, который доступен не во всех браузерах:

<style>
table {
  border-collapse: collapse;
}

td {
  border: 1px solid black;
}

tbody tr:first-child td {
  padding-top: 15px;
}

</style>

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

3
Это не будет работать очень хорошо, если у вас есть что-то, что зависит от положения содержимого относительно размера ячейки, например, тень блока, фоновые изображения или многое другое.
Xkeeper

1
Чтобы прояснить, как другие находят этот ответ в Google, я полагаю, поскольку это было написано в 2008 году, этот ответ сейчас (2015) имеет полную поддержку во всех основных браузерах? По крайней мере, проверка на caniuse.com первенца, кажется, хорошо поддерживается?
redfox05 08

6

Просто установите displayкак, blockи он будет работать.

table tbody{
    display:block;
    margin-bottom:10px;
    border-radius: 5px;
}

1
этот ответ должен быть принятым ответом, потому что он единственный, который позволяет использовать тело с границами и столбцы без границ.
robsonrosa 05

13
display:blockнарушает выравнивание столбцов между элементами тела. Вы больше не пользуетесь преимуществами механизма компоновки стола
М. Конрад,

4

Из всех ответов, приведенных выше, только ответы djenson47 сохраняют разделение представления и содержания . Недостатком метода модели свернутой границы является то, что вы больше не можете использовать атрибуты границы таблицы или пространства ячеек для разделения отдельных ячеек. Вы можете возразить, что это хорошо, и есть некоторые обходные пути, но это может быть проблемой. Поэтому я считаю, что метод первого ребенка самый элегантный.

В качестве альтернативы вы также можете установить свойство переполнения вашего класса TBODY на любое другое значение, кроме «visible». Этот метод также позволяет сохранить модель разделенных границ:

<style>
tbody {
    overflow: auto;
    border-top: 1px solid transparent;
}
</style>
<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

Я хотел сделать что-то подобное, это идеально подходит для меня
Эруант

4

Поскольку отступы можно применять к TD, вы можете сделать трюк со знаком +. Тогда можно будет добавить верхний отступ к TD первого TR тела:

// The first row will have a top padding
table tbody + tbody tr td {
    padding-top: 20px;
}

// The rest of the rows should not have a padding
table tbody + tbody tr + tr td {
    padding-top: 0px;
}

Я добавил «tbody + tbody», чтобы у первого тела не было верхнего отступа. Однако это не обязательно.

Насколько я знаю, недостатков нет :), хотя старые браузеры не тестировал.


2

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

<table>
  <thead>
    ...
  </head>
  <tbody>
    ...
  </tbody>
  <tbody>
    ...
  </tbody>
  <tfoot>
    ...
  </tfoot>
</table>

CSS

table {
  border-spacing: 0px 10px; /* h-spacing v-spacing */
}

0

НОВЫЙ ОТВЕТ

Вы можете использовать столько <tbody>тегов, сколько захотите. До сих пор я не понимал, что W3C устраивает. Не хочу сказать, что мое нижеприведенное решение не работает (оно работает), но чтобы сделать то, что вы пытаетесь сделать, назначьте <tbody>классы своих тегов, а затем ссылайтесь на их отдельные <td>теги через CSS следующим образом:

table tbody.yourClass td {
    padding: 10px;
}

и ваш HTML таким образом:

<table> 
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
<tbody class="yourClass">    
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
</table>

Попробуйте этого парня :)

СТАРЫЙ ОТВЕТ

что бы вы ни делали, НЕ вставляйте пустые строки ...

у вас не должно быть более одного элемента tbody в вашей таблице. что вы можете сделать, так это установить атрибут class или id в своих <tr>элементах и указать соответствующие им <td>теги заполнения:

table {
    border-collapse: collapse;
}

tr.yourClass td {
    padding: 10px;
}

Вы даже можете назначить <tr>дополнительный класс top и bottom, чтобы они выполняли только верхний или нижний отступ соответственно:

tr.yourClass.topClass td {
    padding: 10px 0 0 0;
}

tr.yourClass.bottomClass td {
    padding: 0 0 10px 0;
}

и в вашем HTML ваш <tr>тег будет выглядеть так:

<table> 
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr class="yourClass topClass"><td>Text</td></tr>
<tr class="yourClass"><td>Text</td></tr>
<tr class="yourClass bottomClass"><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
</table>

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


0

Ответ djensen47 отлично подходит для новых браузеров, однако, как было указано, в IE7 он не работает.

Мое решение этой проблемы для поддержки старых браузеров заключалось в том, чтобы обернуть содержимое каждой ячейки в div. Затем добавьте верхний край к div.

<table class="tbl">
<tr></tr>
<tr></tr>
<tr></tr>
<tr><td><div></div></td></tr>
</table>

CSS

.tbl tr td div {
    height:30px;
    margin-top:20px;
}

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


0

Наткнулся на это, пытаясь решить сам. Мне удалось поставить <br>тег прямо перед закрывающим </tbody>тегом. Это чисто визуальное исправление, но, похоже, оно работает в большинстве протестированных мной браузеров.

<table>
    <tbody>
        <tr>
            <td></td>
        </tr>
        <br>
    </tbody>
    <tbody>
        <tr>
            <td></td>
        </tr>
    </tbody>
</table>

Также должен быть доступен.


0

С благодарностью всем, кто ответил первым ...

table {
  border-collapse: collapse;
  table-layout: fixed;
  width: 50%;
}
tbody:before {
  content: "";
  display:block;
  border-top: 15px solid white;
}
tbody tr {
  border-color: #000;
  border-style: solid;
}
tbody tr:first-of-type{
  border-width: 2px 2px 0 2px;
}
tbody tr:nth-of-type(1n+2){
  border-width: 0 2px 0 2px;
}
tbody tr:last-of-type{
  border-width: 0 2px 2px 2px;
}
tbody tr:nth-child(odd) {
  background-color: #ccc;
}
tbody tr:hover {
  background-color: #eee;
}
td {
  text-align: right;
}
<table>
  <tbody>
    <tr>
      <th colspan="3">One</th>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <th colspan="3">Two</th>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.