Пространство между двумя строками в таблице?

756

Это возможно через CSS?

Я пытаюсь

tr.classname {
  border-spacing: 5em;
}

но безрезультатно. Может я что то не так делаю?

Marin
источник
Что такое браузер и можете ли вы предоставить фрагмент кода (html / css)?
Патрик Дежарден
Ну, я использую ff3, так как я знаю, что якобы поддерживает правила, но сейчас я ищу исправления в ff3. я пробовал пробелы и отступы до сих пор не повезло. productlistingitem является основной таблицей <table class = "productListingItem" border = "0" cellpadding = "10" cellspacing = "0"> <tr> <tr> <td class = "dragItem">
Marin
1
Может быть, это потому, что border-spacingэто атрибут, связанный tableи нет tr. Попробуй table.classname {border-spacing:5em}. Note: IE8 поддерживает свойство border-spacing, если указан! DOCTYPE.
Варун Натраадж
Я использую высоту строки, когда нет границ.
Лия
Отвечает ли это на ваш вопрос? CSS: как создать разрыв между строками в таблице?
alexalejandroem

Ответы:

523

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

В приведенном ниже коде CSS знак «больше чем» означает, что заполнение применяется только к tdэлементам, которые являются прямыми дочерними trэлементами для элементов класса spaceUnder. Это позволит использовать вложенные таблицы. (Ячейки C и D в примере кода.) Я не слишком уверен в поддержке браузером прямого дочернего селектора (думаю, IE 6), но он не должен нарушать код в любых современных браузерах.

/* Apply padding to td elements that are direct children of the tr elements with class spaceUnder. */

tr.spaceUnder>td {
  padding-bottom: 1em;
}
<table>
  <tbody>
    <tr>
      <td>A</td>
      <td>B</td>
    </tr>
    <tr class="spaceUnder">
      <td>C</td>
      <td>D</td>
    </tr>
    <tr>
      <td>E</td>
      <td>F</td>
    </tr>
  </tbody>
</table>

Это должно выглядеть примерно так:

+---+---+
| A | B |
+---+---+
| C | D |
|   |   |
+---+---+
| E | F |
+---+---+
Ян Агаард
источник
1
code.google.com/p/ie7-js добавляет поддержку дочернего селектора в ie5.5, ie6, ie7, а также
Antony Hatchkins
403
За исключением того, что это вообще не решает проблему, когда ваши строки имеют цвет фона, и вы действительно хотите WHITESPACE между строками.
Саймон Ист
6
@Simon: Пробел обычно относится к пустому пространству, а не конкретно к белому цвету. Если вы хотите раскрасить пространство между строками, вы можете попробовать использовать свойство CSS <code> border-bottom </ code> для элементов td. Это, вероятно, будет правильно отображаться только с 1px границей. Другим, но не очень элегантным решением будет использование пустой строки.
Ян Аагард
18
@Jan: Да, именно моя точка зрения ... Довольно сложно поместить прозрачное пустое пространство между рядами. Ваше решение помогает в некоторых случаях, но не решает эту проблему. Вставка пустой строки таблицы может работать, но это не так. bottom-borderНабор прозрачных также могут работать, но я не знаю , как кросс-браузер , совместимое это.
Саймон Ист
388

В родительской таблице попробуйте установить

border-collapse:separate; 
border-spacing:5em;

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

user37731
источник
5
Да, этот метод был бы идеальным, за исключением того, что IE 7 не поддерживает его. Для поддержки браузера см .: quirksmode.org/css/tables.html
Саймон Ист,
7
Кроме того, он контролирует интервал между всеми строками в таблице, вы не можете установить интервал между строками для отдельных строк (это то, чего может достичь OP).
Саймон Ист
1
Это несовместимо между Chrome и Firefox. Если у вас есть theadи tbody, он будет отображать двойное число border-spacingмежду ними в Chrome (но одно в Firefox).
Камило Мартин
91
Это фактический ответ, специально настроенный border-spacing: 0 1emна получение расстояния между строками.
игнозавр
1
@igneosaur Я пытался сделать то, что вы сказали, но это все равно добавило расстояние между всеми строками, а не только первые два. Можете ли вы предоставить работающий jsfiddle?
user3281466
184

У вас есть таблица с альбомами идентификаторов с любыми данными ... Я опустил trs и tds

<table id="albums" cellspacing="0">       
</table>

В css:

table#albums 
{
    border-collapse:separate;
    border-spacing:0 5px;
}
Прадьют Бхаттачарья
источник
15
это хорошо сработало для меня. первый аргумент border-spacing - горизонтальный интервал между ячейками, а второй - вертикальный.
Не всегда нужно придумывать CSS, если старый добрый HTML может сделать эту работу :)
luator
можно ли подать заявку только на tr внутри "tbody"?
Джейсон
129

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

<tr class="spacer"><td></td></tr>

затем используйте css для придания строкам распорок определенной высоты и прозрачного фона.

Coleman
источник
3
Я думаю, это более гибко. Вы не всегда можете контролировать, когда заранее вам понадобится место (динамически генерируемые страницы).
Стефан Кендалл
10
Это напоминает мне 90-е годы, когда поддержка CSS почти отсутствовала, и таблицы использовались для большинства макетов. Я по-прежнему даю ему +1, потому что другие «ответы» не лучше с точки зрения фактического создания пространства между строками таблицы.
Лабиринт
@labyrinth С 90-х годов мало что изменилось. Что касается HTML, все это стало гораздо более мощным и гораздо более грязным.
Maaartinus
73

Из Сети разработчиков Mozilla :

CSS-свойство border-spacing определяет расстояние между границами соседних ячеек (только для модели с разделенными границами). Это эквивалентно атрибуту cellspacing в презентационном HTML, но необязательное второе значение может использоваться для установки разного расстояния по горизонтали и вертикали.

Эта последняя часть часто контролируется. Пример:

.your-table {
    border-collapse: separate; /* allow spacing between cell borders */
    border-spacing: 0 5px; /* NOTE: syntax is <horizontal value> <vertical value> */

ОБНОВИТЬ

Теперь я понимаю, что ОП хочет, чтобы отдельные отдельные строки имели увеличенный интервал. Я добавил установку с tbodyэлементами, которая выполняет это, не разрушая семантику. Однако я не уверен, поддерживается ли он во всех браузерах. Я сделал это в Chrome.

Приведенный ниже пример показывает, как вы можете сделать так, чтобы таблица выглядела так, будто таблица существует из отдельных строк, полноценная сладость CSS. Также дал первый ряд больше расстояния сtbody настройкой. Не стесняйтесь использовать!

Уведомление о поддержке: IE8 +, Chrome, Firefox, Safari, Opera 4+

.spacing-table {
  font-family: 'Helvetica', 'Arial', sans-serif;
  font-size: 15px;
  border-collapse: separate;
  table-layout: fixed;
  width: 80%;
  border-spacing: 0 5px; /* this is the ultimate fix */
}
.spacing-table th {
  text-align: left;
  padding: 5px 15px;
}
.spacing-table td {
  border-width: 3px 0;
  width: 50%;
  border-color: darkred;
  border-style: solid;
  background-color: red;
  color: white;
  padding: 5px 15px;
}
.spacing-table td:first-child {
  border-left-width: 3px;
  border-radius: 5px 0 0 5px;
}
.spacing-table td:last-child {
  border-right-width: 3px;
  border-radius: 0 5px 5px 0;
}
.spacing-table thead {
  display: table;
  table-layout: fixed;
  width: 100%;
}
.spacing-table tbody {
  display: table;
  table-layout: fixed;
  width: 100%;
  border-spacing: 0 10px;
}
<table class="spacing-table">
  <thead>
    <tr>
        <th>Lead singer</th>
        <th>Band</th>
    </tr>
  </thead>
  <tbody>
    <tr>
        <td>Bono</td>
        <td>U2</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
        <td>Chris Martin</td>
        <td>Coldplay</td>
    </tr>
    <tr>
        <td>Mick Jagger</td>
        <td>Rolling Stones</td>
    </tr>
    <tr>
        <td>John Lennon</td>
        <td>The Beatles</td>
    </tr>
  </tbody>
</table>

Юстус Ромейн
источник
Если мне нужно было вертикальное пространство между двумя конкретными строками, я просто добавил строку-разделитель <tr> <td colspan = "2" style = "padding-bottom: 1em;"> </ td> </ tr>
Пол Тейлор,
Это будет работать, но семантически неверно (например, строка с разделителем не является реальной строкой с данными, как другие строки. Это может раздражать людей, использующих программы чтения с экрана или другие вспомогательные устройства, а также для целей индексации и нравится. Это может не иметь большого значения, но хорошо держать это в голове при разработке сайта :)
Justus Romijn
Это правда, если он на самом деле использует таблицу для представления таблицы. Если он просто использует таблицу как способ отображения данных в табличной форме, то я бы сказал, что имеет смысл вставлять строку, представляющую пробел между двумя элементами, а не просто добавлять пробел к любому из указанных выше элементов. или ниже линии, потому что пользователь хочет добавить пробел между двумя строками, а не увеличивать размер элементов в строке.
Пол Тейлор
53

Вы можете попробовать добавить строку разделителя:

HTML:

<tr class="separator" />

CSS:

table tr.separator { height: 10px; }
Денис
источник
7
Для IE tr без тела не будет распознан. добавить пустышку тд тег тоже.
Сон
Проблема в том, что в HTML5 валидатор W3C выдаст ошибку, говорящую: «Строка таблицы имела ширину 0 столбцов, что меньше количества столбцов, установленного первой строкой».
Дэвид Грейсон
Хорошо, я добавил еще <tr>, <td> и <p> и установил видимость p-тега скрытым. Работает тоже. :-)
Jeppe
47

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

Роберт С. Барт
источник
Да, заполнение будет сдвигать границу вниз, border-bottomа это padding-bottomзначит, что граница будет ниже отступа.
Дан Даскалеску
21

Взгляните на border-collapse: отдельный атрибут (по умолчанию) и свойство border-spacing .

Сначала вы должны разделить их с помощью border-collapse , затем вы можете определить пространство между столбцами и строками с интервалом границы .

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

table     {border-collapse: separate;  border-spacing: 10px 20px;}

table, 
table td,
table th  {border: 1px solid black;}
<table>
  <tr>
    <td>Some text - 1</td>
    <td>Some text - 1</td>
  </tr>
  <tr>
    <td>Some text - 2</td>
    <td>Some text - 2</td>
  </tr>
  <tr>
    <td>Some text - 3</td>
    <td>Some text - 3</td>
  </tr>
</table>

Syno
источник
20

Хорошо, вы можете сделать

tr.classname td {background-color:red; border-bottom: 5em solid white}

Убедитесь, что цвет фона установлен на тд, а не на строку. Это должно работать в большинстве браузеров ... (Chrome, т.е. & ff протестировано)

Павел
источник
Это создает странные проблемы с вертикальным выравниванием, по крайней мере, в Firefox
cjohansson
20

Вам нужно установить border-collapse: separate;на стол; большинство стилей браузеров по умолчанию начинаются с того border-collapse: collapse;, что ограничивает интервал границ.

Кроме того, интервал между границами: идет TD, а не TR.

Пытаться:

<html><head><style type="text/css">
    #ex    { border-collapse: separate; }
    #ex td { border-spacing: 1em; }
</style></head><body>
    <table id="ex"><tr><td>A</td><td>B</td></tr><tr><td>C</td><td>D</td></tr></table>
</body>
Джон Хаугеланд
источник
1
межстрочный интервал также для таблицы, не тд
Silversky
4
Спасибо. Ранее я поблагодарил вас за исправление комментария, но чрезмерно усердный редактор, который хотел изменить мой стиль и нарушил код в процессе, также удалил мое высказывание «спасибо». Я помещаю это здесь, где это не может быть отредактировано.
Джон Хаугеланд
18

Вы можете использовать высоту строки в таблице:

<table style="width: 400px; line-height:50px;">
alansiqueira27
источник
Вы правы, но текст также получит высоту строки, что не очень хорошо, я думаю, вы должны увидеться с Колманом! У него есть хорошее решение
Waqas Tahir
13
tr { 
    display: block;
    margin-bottom: 5px;
}
Моу
источник
я бы предпочел дисплей: встроенный блок;
DS_web_developer
11

Слишком поздний ответ :)

Если вы примените float к trэлементам, вы можете пробелить между двумя строками с marginатрибутом.

table tr{
float: left
width: 100%;
}

tr.classname {
margin-bottom:5px;
}
Огужан Озел
источник
12
Это страшно. Что это на самом деле делает, так это устанавливает displayсвойство blockдля строки. Это позволяет строке иметь запас. Вертикальное поле « Применяется к: всем элементам, кроме элементов с типами отображения таблицы, кроме заголовка таблицы, таблицы и встроенной таблицы ». Поскольку table-rowэто не исключение, оно не считается. Вероятно, вы могли бы добиться того же эффекта, выполнив tr {display:block;}Но я бы с осторожностью использовал любой из этих методов в сложной таблице. Скорее всего, это не приведет к тому, что вы ожидаете.
Шолзингер
Это страшно, но это сработало. Не в ie7, но клеточное пространство непосредственно в таблице работает в ie7.
Liko
плавающие строки не очень хорошее решение .. особенно если ваша страница в 2 раза больше ширины строки. добавить атрибут ширины к обоим тегам
AndreaCi
11

Для создания иллюзии расстояния между рядами примените к строке цвет фона, а затем создайте толстую рамку белого цвета, чтобы создать «пробел» :)

tr 
{
   background-color: #FFD700;
   border: 10px solid white;
}
Варун Натраадж
источник
9

Правильный способ дать интервал для таблиц - использовать cellpadding и cellspacing, например

<table cellpadding="4">
Усман Захир
источник
5
Вы можете сделать это с помощью CSS, что, я бы сказал, более «правильно» (помимо того, что это более элегантно, переход от разметки к CSS экономит трафик).
Камило Мартин
2
Это не экономит пропускную способность. Я на самом деле использую больше. Предполагая, что вы не добавляете таблицу стилей только для этого, вам нужно добавить селектор и, возможно, идентификатор или имя в эту таблицу. Это больше байтов, а не меньше.
Majinnaibu
9

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

td { border: 1em solid transparent; }

Прозрачные границы по-прежнему имеют ширину.

Thoronwen
источник
6

Работает для большинства последних браузеров в 2015 году. Простое решение. Это не работает для прозрачности, но в отличие от ответа Торонвена, я не могу получить прозрачность для рендеринга с любым размером.

    tr {
      border-bottom:5em solid white;
    }
FlavorScape
источник
3

Просто поместите divвнутрь tdи установите следующие стили div:

margin-bottom: 20px;
height: 40px;
float: left;
width: 100%;
Nad
источник
2

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

У меня было 2 ячейки таблицы, одна с цветом фона, другая с цветом рамки. Вышеуказанные решения убирают границу, поэтому ячейка справа, казалось бы, плавает в воздухе. Решение, которое сделало трюк, состояло в том table, чтобы заменить , trи tdс divs и соответствующими классами: таблица будет div id="table_replacer", tr будетdiv class="tr_replacer" и td будетdiv class="td_replacer" (очевидно, также измените закрывающие теги на div)

Чтобы получить решение для моей проблемы, CSS:

#table_replacer{display:table;}
.tr_replacer {border: 1px solid #123456;margin-bottom: 5px;}/*DO NOT USE display:table-row! It will destroy the border and the margin*/
.td_replacer{display:table-cell;}

Надеюсь, это кому-нибудь поможет.

bolvo
источник
Имхо, это решение эквивалентно использованию обычной таблицы, tr, td pattern и style tr {display: block;}, которые я пробовал. Проблема: таблица выглядит иначе, так как элементы td не отображаются на ширину таблицы, а плавают влево в пределах tr. Значит, элементы td всех строк больше не выровнены по вертикали.
Андреас Станкевич
0

Вы можете заполнить элементы <td /> элементами <div /> и применить любое поле к тем элементам div, которые вам нравятся. Для визуального пространства между строками вы можете использовать повторяющееся фоновое изображение для элемента <tr />. (Это было решение, которое я только что использовал сегодня, и оно работает как в IE6, так и в FireFox 3, хотя я больше не тестировал его.)

Кроме того, если вы не хотите изменять свой серверный код, чтобы помещать <div /> s внутри <td /> s, вы можете использовать jQuery (или что-то подобное) для динамического переноса содержимого <td /> в <div / >, что позволяет применять CSS по желанию.

Джон Фишер
источник
0

Или просто добавьте пробел с высотой поля между строками, который вы хотите добавить интервал

Джон Магнолия
источник
0

Вот простое и элегантное решение с несколькими оговорками:

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

Имея это в виду, попробуйте это:

td {padding:5px 8px;border:2px solid blue;background:#E0E0E0}  /* lets say the cells all have this padding and border, and the gaps should be white */

tr.gapbefore td {overflow:visible}
tr.gapbefore td::before,
tr.gapbefore th::before
{
  content:"";
  display:block;
  position:relative;
  z-index:1;
  width:auto;
  height:0;
  padding:0;
  margin:-5px -10px 5px;  /* 5px = cell top padding, 10px = (cell side padding)+(cell side border width)+(table side border width) */
  border-top:16px solid white;  /* the size & color of the gap you want */
  border-bottom:2px solid blue; /* this replaces the cell's top border, so should be the same as that. DOUBLE IT if using border-collapse:separate */
}

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

Обратите внимание, что если у вас есть рамка вокруг самой таблицы, а также ячеек, вам нужно будет еще больше увеличить горизонтальное поле ваших «блоков». Так что для границы таблицы 4px вы бы вместо этого использовали:

margin:-5px -12px 5px;     /* 14px = original 10px + 2px for 'uncollapsed' part of table border */

И если ваша таблица использует border-collapse:separateвместо border-collapse:collapse, то вам нужно (а) использовать полную ширину границы таблицы:

margin:-5px -14px 5px;     /* 14px = original 10px + 4px full width of table border */

... а также (b) замените двойную ширину границы, которая теперь должна появиться ниже разрыва:

border-bottom:4px solid blue;     /* i.e. 4px = cell top border + previous row's bottom border */

Техника легко адаптируется к версии .gapafter, если вы предпочитаете, или к созданию вертикальных (столбцовых) пропусков вместо пропусков строк.

Вот кодекс, где вы можете увидеть его в действии: https://codepen.io/anon/pen/agqPpW

Doin
источник
-1

Здесь это работает гладко:

#myOwnTable td { padding: 6px 0 6px 0;}

Я полагаю, вы могли бы разработать более детальный макет, указав, какой тд при необходимости.

Брис Кустильяс
источник
-5

делать это показано выше ...

table tr{ float: left width: 100%; }  tr.classname { margin-bottom:5px; } 

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

richardh
источник
-17

Ты пытался:

tr.classname { margin-bottom:5em; }

Кроме того, каждый тд может быть скорректирована:

td.classname { margin-bottom:5em; }

или

 td.classname { padding-bottom:5em; }
августейший
источник
Это на самом деле работает? У меня есть div.el { display: table-row; margin: 10px; }, и маржа ничего не делает. Я знаю, что это немного отличается от фактического стола, но это не должно быть ...
bradlis7
20
Строки / ячейки таблицы не имеют полей.
Espen