Расстояние между телом и телом

У меня есть простая таблица html вроде этой:

<table>
  <thead>
    <tr><th>Column 1</th><th>Column 2</th></tr>
  </thead>
  <tbody>
    <tr class="odd first-row"><td>Value 1</td><td>Value 2</td></tr>
    <tr class="even"><td>Value 3</td><td>Value 4</td></tr>
    <tr class="odd"><td>Value 5</td><td>Value 6</td></tr>
    <tr class="even last-row"><td>Value 7</td><td>Value 8</td></tr>
  </tbody>
</table>

И я бы хотел оформить его следующим образом:

  • строка заголовка с тенью блока
  • пробел между строкой заголовка и первой строкой тела

Тень блока на заголовке + расстояние до тела

Я пробовал разные вещи:

table {
    /* collapsed, because the bottom shadow on thead tr is hidden otherwise */
    border-collapse: collapse;
}
/* Shadow on the header row*/
thead tr   { box-shadow: 0 1px 10px #000000; }
/* Background colors defined on table cells */
th         { background-color: #ccc; }
tr.even td { background-color: yellow; }
tr.odd td  { background-color: orange; }

/* I would like spacing between thead tr and tr.first-row */

tr.first-row {
    /* This doesn't work because of border-collapse */
    /*border-top: 2em solid white;*/
}

tr.first-row td {
    /* This doesn't work because of border-collapse */
    /*border-top: 2em solid white;*/
    /* This doesn't work because of the td background-color */
    /*padding-top: 2em;*/
    /* Margin is not a valid property on table cells */
    /*margin-top: 2em;*/
}

См. Также: http://labcss.net/#8AVUF

Есть ли у кого-нибудь советы, как я могу это сделать? Или добиться того же визуального эффекта (например, бод-тень + интервал)?


person Ben    schedule 13.02.2012    source источник
comment
может быть похоже на: stackoverflow.com/questions/6012924/box-shadow-on-trs   -  person meo    schedule 13.02.2012
comment
Я не думаю, что у вас может быть сворачивание границы для тела таблицы, но не для головы таблицы. Или, может быть, я не понимаю вашего вопроса.   -  person sinsedrix    schedule 13.02.2012
comment
@sinsedrix Я добавил рисунок, чтобы показать, как должен выглядеть стиль. Это проясняет?   -  person Ben    schedule 13.02.2012


Ответы (7)


Я думаю, что он у меня есть в этой скрипке, и я обновил ваш:

tbody:before {
    content: "-";
    display: block;
    line-height: 1em;
    color: transparent;
}

ИЗМЕНИТЬ лучше и проще:

tbody:before {
    content:"@";
    display:block;
    line-height:10px;
    text-indent:-99999px;
}

Таким образом текст действительно невидим

person sinsedrix    schedule 13.02.2012
comment
Очень здорово, выглядит многообещающе! Спасибо! К сожалению, все это работает только в firefox ... - person Ben; 13.02.2012
comment
Он работает во всех браузерах, кроме IE7. У кого-нибудь есть исправление для IE7? - person Srdjan Dejanovic; 14.06.2013
comment
Может, лучше установить видимость: скрытый; вместо того, чтобы окрашивать текст в белый цвет, поскольку вы не хотите зависеть от предполагаемого цвета фона, чтобы легко изменять свои стили. - person Friedrich Große; 05.07.2014
comment
Вы также можете использовать text-indent: -100%; - person Joseph Spens; 16.10.2014
comment
Я сделаю display: table-row, чтобы взять всю ширину строки. - person firebird631; 21.10.2016
comment
@JosephSpens text-indent: -100% - не лучшее решение, если вокруг стола большой запас. - person sinsedrix; 28.10.2016
comment
Вместо color: transparent вы можете использовать visibility: hidden, чтобы пространство было, но ничего не отображалось - person Charles L.; 26.02.2019
comment
@CharlesL. Верно, но в 2012 году это был лучший способ заставить его работать в большинстве браузеров. Может сегодня мне стоит обновить - person sinsedrix; 28.02.2019
comment
Удивительно, что сейчас почти 2020 год, и нам все еще приходится прибегать к подобным хитростям, чтобы создавать пространство между заголовком и телом таблицы, это безумие :) - person Alexander Cherednichenko; 30.12.2019
comment
@AlexanderCherednichenko, это пост 2012 года, так что возвращайся в 2022 году на 10-летие :) - person sinsedrix; 31.12.2019

Кроме того, вы можете использовать функцию без объединения с нулевой шириной, чтобы минимизировать CSS sinsedrix:

tbody:before {line-height:1em; content:"\200C"; display:block;}
person user2718944    schedule 26.08.2013
comment
Я хотел разбить таблицу на части, разделив разделы тела. Вариант вашего кода помог: table tbody:not(:last-child):after Мне особенно понравилось, что :not() работал во всех основных браузерах, поэтому мне не пришлось писать отдельный бит, чтобы освободить место в конце таблицы. - person Stephen R; 29.09.2017

Это даст вам некоторое пространство между заголовком и содержимым таблицы.

thead tr {
  border-bottom: 10px solid white;
}

Хотя установка цвета границы - это своего рода читерский метод, он будет работать нормально.

Исследование формы, вы не можете установить box-shadow для строки таблицы, но вы можете для ячеек таблицы:

th {
  box-shadow: 5px 5px 5px 0px #000000 ;
}

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

person ACarter    schedule 13.02.2012
comment
Граница у меня вообще не работает, потому что тень рендерится посередине границы ... Я думаю, что box-shadow на tr - моя проблема. Использование th не дает мне желаемого эффекта, поскольку я в основном хочу, чтобы строка заголовка имела эффект свечения (т.е. тень для строки, а не для отдельных ячеек) - person Ben; 13.02.2012

Таким образом, box-shadow плохо работает с элементом tr ... но он работает с элементом псевдоконтента; sinsedrix поставил меня на правильный путь, и вот что у меня получилось:

table {
    position: relative;
}

td,th {padding: .5em 1em;}

tr.even td { background-color: yellow; }
tr.odd td  { background-color: orange; }

thead th:first-child:before {
    content: "-";

    display: block;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    z-index: -1;

    box-shadow: 0 1px 10px #000000;
    padding: .75em 0;

    background-color: #ccc;
    color: #ccc;
}

thead th {
    padding-bottom: 2em;
}
person Ben    schedule 13.02.2012
comment
Вы сделали это. Я бы посоветовал добавить: td,th {padding: .5em 1em;} table {border-collapse: collapse;} thead th:first-child:before {height:1.8em;} (Чтобы он больше походил на оригинал.) - person ACarter; 13.02.2012
comment
Только что понял, что вы задали вопрос, так что вы, вероятно, разобрались. :) - person ACarter; 13.02.2012
comment
Да ;-) Я обновил ответ, чтобы он выглядел как скриншот в вопросе, на случай, если кто-то еще наткнется на этот вопрос ... - person Ben; 14.02.2012

У меня это сработало в Chrome (для других браузеров я не знаю).

.theTargethead::after
{
    content: "";
    display: block;
    height: 1.5em;
    width: 100%;
    background: white;
}

Такой код css создает пустое пространство между тегом и телом таблицы. Если я установлю фон прозрачным, первый столбец вышеупомянутых элементов tr> th покажет свой собственный цвет (зеленый в моем случае), что сделает около первых 1 см элемента :: after зеленым.

Кроме того, использование знака «-» в строке content : "-"; вместо пустой строки «» может создать проблемы при экспорте напечатанных страниц в файл, то есть в pdf. Конечно, это зависит от парсера / экспортера. Такой экспортированный файл, открытый в редакторе PDF (например: Ms word, Ms Excel, OpenOffice, LibreOffice, Adobe Acrobat Pro), все еще может содержать знак минус. Пустая строка не имеет такой проблемы. Нет проблем в обоих случаях, если распечатанная таблица html экспортируется как изображение: ничего не отображается.

Я не заметил никаких проблем, даже используя

content : "\200C";
person willy wonka    schedule 06.10.2016

Хотя все вышеперечисленные решения великолепны, результат в разных браузерах несовместим, поэтому я нашел лучший способ сделать это, основываясь на моем ужасном опыте работы с шаблонами электронной почты. Просто добавьте фиктивный tbody между фактическим tbody и thead, вложенный в фиктивный tbody должен быть td с высотой, установленной на желаемый интервал. Пример ниже

<table>
  <thead>
    <tr>
      <td>
      </td>
    </tr>
  </thead>
  // Dummy tbody
  <tbody>
    <tr>
      <td class="h-5"></td>
    </tr>
  </tbody>
  // Actual tbody
  <tbody class="rounded shadow-outline">
    <tr v-for="(tableRow, i) in tableBody" :key="`tableRow-${i}`">
      <td v-for="tableRowItem in tableRow" :key="tableRowItem" class="table-body">
        {{ tableRowItem }}
      </td>
    </tr>
  </tbody>
</table>

person AbdulGafar Olamide Ajao    schedule 22.09.2020

Это должно помочь:

table {
  position: relative;
}
thead th { 
  // your box shadow here
}
tbody td {
  position: relative;
  top: 2rem; // or whatever space you want between the thead th and tbody td
}

И это должно хорошо работать с большинством браузеров.

person David Gaskin    schedule 03.12.2016