Odstęp między dwoma rzędami w tabeli?

754

Czy jest to możliwe za pomocą CSS?

Próbuję

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

bez skutku. Może robię coś złego?

Marin
źródło
Co to jest przeglądarka i czy możesz podać fragment kodu (html / css)?
Patrick Desjardins,
cóż, używam ff3, ponieważ wiem, że to znaczy podobno obsługuje reguły, ale na razie szukam rozwiązania w ff3. próbowałem do tej pory odstępów i paddingu bez powodzenia. productlistingitem jest główną tabelą <table class = "productListingItem" border = "0" cellpadding = "10" cellspacing = "0"> <tr> <tr> <td class = "dragItem">
Marin
1
Może dlatego, że border-spacingjest to atrybut związany tablei nie związany tr. Spróbować table.classname {border-spacing:5em}. Note: IE8 obsługuje właściwość odstępu między ramkami, jeśli podano! DOCTYPE.
Varun Natraaj
Używam wysokości linii, gdy nie ma granic.
Leah
Czy to odpowiada na twoje pytanie? CSS: jak utworzyć odstęp między wierszami w tabeli?
alexalejandroem

Odpowiedzi:

523

Musisz użyć paddingu na swoich tdelementach. Coś takiego powinno załatwić sprawę. Możesz oczywiście uzyskać ten sam wynik, stosując górne wypełnienie zamiast dolnego wypełnienia.

W poniższym kodzie CSS znak „więcej niż” oznacza, że ​​dopełnienie jest stosowane tylko do tdelementów, które są bezpośrednimi trelementami potomnymi elementów z klasą spaceUnder. Umożliwi to użycie zagnieżdżonych tabel. (Komórki C i D w przykładowym kodzie.) Nie jestem zbyt pewny obsługi przeglądarki dla bezpośredniego selektora potomnego (myślę o IE 6), ale nie powinien on łamać kodu w żadnych współczesnych przeglądarkach.

/* 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>

Powinno to wyglądać mniej więcej tak:

+---+---+
| A | B |
+---+---+
| C | D |
|   |   |
+---+---+
| E | F |
+---+---+
Jan Aagaard
źródło
1
code.google.com/p/ie7-js dodaje obsługę selektora podrzędnego również w ie5.5, ie6, ie7
Antony Hatchkins
403
Tyle że to wcale nie rozwiązuje problemu, gdy wiersze mają kolor tła i rzeczywiście chcesz WHITESPACE między wierszami.
Simon East
6
@ Simon: Białe znaki zwykle oznaczają puste miejsce, a nie konkretnie kolor biały. Jeśli chcesz pokolorować przestrzeń między wierszami, możesz wypróbować właściwość CSS <code> border-bottom </code> na elementach td. Prawdopodobnie będzie to renderowane poprawnie tylko z ramką 1px. Innym, ale nie tak eleganckim rozwiązaniem byłoby użycie pustego rzędu.
Jan Aagaard
18
@Jan: Tak, dokładnie o to mi chodzi ... Trudno jest umieścić przezroczystą pustą przestrzeń między rzędami. Twoje rozwiązanie pomaga w niektórych przypadkach, ale nie rozwiązuje tego problemu. Wstawienie pustego wiersza tabeli może działać, ale jest bardzo trudne. bottom-borderZestaw do przezroczystego może również pracować, ale nie jestem pewien, jak cross-browser zgodny jest.
Simon East
387

W tabeli nadrzędnej spróbuj ustawić

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

Plus deklaracja graniczna i sprawdź, czy osiągnie to pożądany efekt. Uważaj jednak, że IE nie obsługuje modelu „oddzielnych granic”.

użytkownik37731
źródło
5
Tak, ta metoda byłaby idealna, z wyjątkiem tego, że IE 7 jej nie obsługuje. Aby uzyskać informacje na temat obsługi przeglądarki, patrz: quirksmode.org/css/tables.html
Simon East
7
Ponadto kontroluje odstępy między wszystkimi wierszami w tabeli, nie można ustawić odstępów między wierszami dla poszczególnych wierszy (to jest to, co OP może chcieć osiągnąć).
Simon East
1
Jest to niespójne między Chrome i Firefox. Jeśli masz znak „ theadi” tbody, będzie on podwójny border-spacingmiędzy nimi w Chrome (ale jeden w Firefox).
Camilo Martin
91
To jest rzeczywista odpowiedź, specjalnie ustawiona, border-spacing: 0 1emaby uzyskać odstęp między tylko rzędami.
igneozaur
1
@igneosaur Próbowałem zrobić to, co powiedziałeś, ale nadal dodawało odstępy między wszystkimi rzędami, a nie tylko dwoma pierwszymi. Czy możesz podać działający jsfiddle?
user3281466,
184

Masz tabelę z albumami id z dowolnymi danymi ... Pominąłem trs i tds

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

W css:

table#albums 
{
    border-collapse:separate;
    border-spacing:0 5px;
}
Pradyut Bhattacharya
źródło
15
to działało dla mnie dobrze. pierwszy argument odstępów między krawędziami to poziomy odstęp między komórkami, a drugi to odstępy pionowe.
Nie zawsze musi to być fantazyjne CSS, jeśli stary dobry HTML potrafi to zrobić :)
luator
czy można ubiegać się tylko o tr wewnątrz „tbody”?
Jaison
129

ponieważ mam za sobą obraz tła, fałszowanie go białą wyściółką nie działałoby. Zdecydowałem się umieścić pusty wiersz między każdym wierszem treści:

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

następnie użyj css, aby nadać wierszom dystansowym określoną wysokość i przezroczyste tło.

Coleman
źródło
3
Myślę, że jest to prawdopodobnie bardziej elastyczne. Nie zawsze możesz kontrolować, kiedy z góry potrzebujesz miejsca (strony generowane dynamicznie).
Stefan Kendall,
10
Przypomina mi to lata 90., kiedy obsługa CSS prawie nie istniała, a tabele były używane do większości układów. Nadal jednak daję +1, ponieważ inne „odpowiedzi” nie są lepsze pod względem faktycznego tworzenia odstępu między wierszami tabeli.
labirynt
@labyrinth Niewiele się zmieniło od lat 90. Jeśli chodzi o HTML, wszystko stało się znacznie potężniejsze i bardziej chaotyczne.
maaartinus,
73

Z sieci deweloperów Mozilla :

Właściwość CSS z odstępami między krawędziami określa odległość między granicami sąsiednich komórek (tylko dla modelu oddzielonych granic). Jest to równoważne atrybutowi odstępu między komórkami w prezentacji HTML, ale opcjonalnej drugiej wartości można użyć do ustawienia różnych odstępów poziomych i pionowych.

Ta ostatnia część jest często nadzorowana. Przykład:

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

AKTUALIZACJA

Rozumiem teraz, że OP chce, aby określone, oddzielne rzędy miały większy odstęp. Dodałem konfigurację z tbodyelementami, które to osiągają bez rujnowania semantyki. Nie jestem jednak pewien, czy jest obsługiwany we wszystkich przeglądarkach. Zrobiłem to w Chrome.

Poniższy przykład pokazuje, jak możesz wyglądać, jakby istniała tabela oddzielnych wierszy z pełną słodyczą css. Dało także więcej odstępów w pierwszym rzędzie dzięki tbodykonfiguracji. Zapraszam do użycia!

Informacja o wsparciu: 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>

Justus Romijn
źródło
Jeśli chciałem trochę pionowej przestrzeni między dwoma konkretnymi rzędami, właśnie dodałem wiersz odstępu <tr> <td colspan = "2" style = "padding-bottom: 1em;"> </td> </tr>
Paul Taylor
To by działało, ale jest semantycznie niepoprawne (jak w tym przypadku wiersz separatora nie jest rzeczywistym wierszem z danymi takimi jak inne wiersze. Może to być denerwujące dla osób korzystających z czytników ekranu lub innych urządzeń pomocniczych, a także do celów indeksowania i może nie ma to wielkiego znaczenia, ale dobrze jest mieć go z powrotem przy tworzeniu strony internetowej :)
Justus Romijn
To prawda, jeśli faktycznie używa tabeli do reprezentowania tabeli. Jeśli po prostu używa tabeli jako sposobu wyświetlania danych w formie tabelarycznej, to argumentowałbym, że bardziej sensowne jest wstawienie wiersza reprezentującego lukę między dwoma elementami zamiast dodawania odstępów do obu elementów td powyżej lub poniżej linii, ponieważ to, co użytkownik chce zrobić, to dodać spację między dwiema liniami, a nie zwiększać rozmiaru elementów w linii.
Paul Taylor,
53

Możesz spróbować dodać wiersz separatora:

HTML:

<tr class="separator" />

css:

table tr.separator { height: 10px; }
Denis
źródło
7
W przypadku IE tr bez ciała nie byłoby rozpoznawane. dodaj też obojętny tag td.
Drzemka
Problem polega na tym, że w HTML5 walidator W3C wygeneruje błąd z informacją: „Wiersz tabeli miał szerokość 0 kolumn, czyli mniej niż liczba kolumn określona przez pierwszy wiersz”.
David Grayson
Fajnie, dodałem kolejne <tr>, <td> i <p> ​​i ustawiłem widoczność p-tag na ukryty. Działa również. :-)
Jeppe,
47

Nie można zmienić marginesu komórki tabeli. Ale MOŻESZ zmienić wypełnienie. Zmień dopełnienie TD, co spowoduje powiększenie komórki i odepchnij tekst z boku przy zwiększonym dopełnieniu. Jeśli masz linie graniczne, nadal nie będzie to dokładnie to, czego chcesz.

Robert C. Barth
źródło
Tak, wyściółka będzie naciskać w dół graniczną, tak border-bottomi padding-bottomoznacza, że granica będzie poniżej wyściółki.
Dan Dascalescu
21

Spójrz na zwinięcie ramki: oddzielny atrybut (domyślnie) i właściwość odstępu między ramkami.

Najpierw musisz oddzielić je za pomocą zwinięcia obramowania , a następnie możesz zdefiniować przestrzeń między kolumnami i wierszami za pomocą odstępów między ramkami .

Obie te właściwości CSS są właściwie dobrze obsługiwane w każdej przeglądarce, patrz tutaj .

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
źródło
20

Ok, możesz

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

Upewnij się, że kolor tła jest ustawiony na td zamiast na wierszu. Powinno to działać w większości przeglądarek ... (Chrome, tj. Przetestowane pod kątem ff)

Paweł
źródło
Stwarza to dziwne problemy z wyrównaniem pionowym, przynajmniej w Firefoksie
cjohansson
20

Musisz ustawić border-collapse: separate;na stole; większość domyślnych arkuszy stylów przeglądarki zaczyna się od border-collapse: collapse;, która wykopuje odstępy między krawędziami.

Ponadto odstępy między krawędziami: są włączane TD, a nie TR.

Próbować:

<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>
John Haugeland
źródło
1
odstępy między ramami dotyczą także tabeli nie td
silversky
4
Dzięki. Wcześniej podziękowałem ci w poprawce komentarza, ale nadgorliwy redaktor, który chciał zmienić mój styl i złamał kod w procesie, również usunął moje podziękowania. Teraz umieszczam go tutaj, gdzie nie można go edytować.
John Haugeland,
18

Możesz użyć wysokości linii w tabeli:

<table style="width: 400px; line-height:50px;">
alansiqueira27
źródło
Masz rację, ale tekst otrzyma również wysokość linii, co nie jest dobre, myślę, że powinieneś zobaczyć colemana! Ma dobre rozwiązanie
Waqas Tahir
13
tr { 
    display: block;
    margin-bottom: 5px;
}
Moe
źródło
wolałbym wyświetlać: blok wbudowany;
DS_web_developer
11

Zbyt późna odpowiedź :)

Jeśli zastosujesz trelement pływający do elementów, możesz odstępować między dwoma wierszami za pomocą marginatrybutu.

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

tr.classname {
margin-bottom:5px;
}
Oguzhan Ozel
źródło
12
To jest straszne. Tak naprawdę to ustawia displaywłaściwość blockna wiersz. Dzięki temu wiersz ma margines. Margines pionowy „ Dotyczy: wszystkich elementów z wyjątkiem tych z typami wyświetlania tabeli innymi niż podpis tabeli, tabela i tabela wstawiana ”. Ponieważ table-rownie ma żadnego z tych wyjątków, nie liczy się to. Prawdopodobnie mógłbyś osiągnąć ten sam efekt, robiąc tr {display:block;}to. Byłbym jednak ostrożny w stosowaniu jednej z tych metod w skomplikowanej tabeli. Prawdopodobnie nie przyniesie oczekiwanych rezultatów.
sholsinger
To przerażające, ale zadziałało. Nie w ie7, ale odstępy między komórkami bezpośrednio w tabeli działają w ie7.
Liko,
pływające wiersze nie jest dobrym rozwiązaniem. zwłaszcza jeśli Twoja strona jest większa niż 2x szerokość wiersza. dodaj atrybut width do obu tagów
AndreaCi
11

Aby stworzyć iluzję odstępów między rzędami, zastosuj kolor tła do rzędu, a następnie utwórz grubą ramkę z białym kolorem, aby utworzyć „przestrzeń” :)

tr 
{
   background-color: #FFD700;
   border: 10px solid white;
}
Varun Natraaj
źródło
9

Prawidłowym sposobem na podanie odstępów dla tabel jest użycie podkładki i odstępów między komórkami np

<table cellpadding="4">
Usman Zaheer
źródło
5
Możesz to zrobić za pomocą CSS, który powiedziałbym, że jest bardziej „poprawny” (poza tym, że jest bardziej elegancki, zmiana stylu ze znaczników na CSS oszczędza przepustowość).
Camilo Martin
2
Nie oszczędza przepustowości. Właściwie zużywa więcej. Zakładając, że nie dodajesz arkusza stylów tylko w tym celu, musisz dodać selektor i ewentualnie identyfikator lub nazwę do tej tabeli. To więcej bajtów, nie mniej.
majinnaibu
9

Natknąłem się na to, walcząc z podobnym problemem. Uważam, że odpowiedź Varuna Natryaja jest dość pomocna, ale zamiast tego użyłbym przezroczystej ramki.

td { border: 1em solid transparent; }

Przezroczyste obramowania nadal mają szerokość.

Thoronwen
źródło
6

Działa z większością najnowszych przeglądarek w 2015 roku. Proste rozwiązanie. Nie działa dla przezroczystości, ale w przeciwieństwie do odpowiedzi Thoronwen, nie mogę uzyskać przezroczystości do renderowania przy dowolnym rozmiarze.

    tr {
      border-bottom:5em solid white;
    }
FlavorScape
źródło
3

Po prostu włóż divdo tdi ustaw następujące style div:

margin-bottom: 20px;
height: 40px;
float: left;
width: 100%;
Nad
źródło
2

Zdaję sobie sprawę, że jest to odpowiedź na stary wątek i może nie być to żądane rozwiązanie, ale chociaż wszystkie sugerowane rozwiązania nie spełniły moich oczekiwań, to rozwiązanie dla mnie zadziałało.

Miałem 2 komórki tabeli, jedną z kolorem tła, drugą z kolorem obramowania. Powyższe rozwiązania usuwają ramkę, więc komórka po prawej stronie wydaje się unosić w powietrzu. Rozwiązanie, które wystarczyły było zastąpić table, tra tdz div i odpowiednich klas: stół byłoby div id="table_replacer", tr byłoby div class="tr_replacer"i td byłoby div class="td_replacer"(zmiana zamykania znaczniki div, a także oczywiście)

Aby uzyskać rozwiązanie mojego problemu, css to:

#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;}

Mam nadzieję, że to komuś pomoże.

bolvo
źródło
Imho, to rozwiązanie jest równoważne z użyciem zwykłej tabeli, wzoru tr, td i stylu tr {display: block;}, które próbowałem. Problem: tabela wygląda inaczej, ponieważ elementy td nie są renderowane do szerokości tabeli, ale unoszą się w lewo w tr. Oznacza to, że elementy td wszystkich rzędów nie są już wyrównane w pionie.
Andreas Stankewitz
0

Możesz wypełnić elementy <td /> elementami <div /> i zastosować dowolny margines do tych div, które lubisz. Aby uzyskać wizualną przestrzeń między rzędami, możesz użyć powtarzającego się obrazu tła na elemencie <tr />. (To było rozwiązanie, którego właśnie użyłem dzisiaj i wydaje się, że działa zarówno w IE6, jak i FireFox 3, chociaż nie testowałem go dalej.)

Ponadto, jeśli nie chcesz modyfikować kodu serwera, aby umieścić <div /> s wewnątrz <td /> s, możesz użyć jQuery (lub czegoś podobnego), aby dynamicznie zawinąć zawartość <td /> w <div / >, umożliwiając stosowanie CSS według potrzeb.

John Fisher
źródło
0

Lub po prostu dodaj puste miejsce z wysokością marginesu między wierszami, które chcesz dodać odstępy

John Magnolia
źródło
0

Oto proste i eleganckie rozwiązanie z kilkoma zastrzeżeniami:

  • Nie można tak naprawdę zrobić przezroczystości, musisz nadać im określony kolor.
  • Nie można zaokrąglać rogów granic powyżej i poniżej luk
  • Musisz znać wypełnienie i obramowanie komórek tabeli

Mając to na uwadze, spróbuj tego:

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 */
}

W rzeczywistości robisz naklejanie prostokąta ::before bloku na górę wszystkich komórek w rzędzie, który chcesz poprzedzić przerwą. Bloki te wystają nieco z komórek, aby pokryć istniejące granice, ukrywając je. Te bloki są tylko górną i dolną ramką połączonymi ze sobą: górna ramka tworzy szczelinę, a dolna ramka ponownie tworzy wygląd oryginalnej górnej ramki komórek.

Zauważ, że jeśli masz obramowanie wokół samej tabeli, a także komórek, musisz dodatkowo zwiększyć poziomo-margines „bloków”. Tak więc dla obramowania tabeli 4px zamiast tego użyjesz:

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

A jeśli border-collapse:separatezamiast tego używana jest tabela border-collapse:collapse, musisz (a) użyć pełnej szerokości obramowania tabeli:

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

... a także (b) zastąp podwójną szerokość obramowania, która teraz musi pojawić się poniżej odstępu:

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

Technikę można łatwo dostosować do wersji .gapafter, jeśli wolisz, lub do tworzenia szczelin pionowych (kolumnowych) zamiast szczelin rzędów.

Oto codepen, w którym można go zobaczyć w akcji: https://codepen.io/anon/pen/agqPpW

Doin
źródło
-1

Tutaj działa to płynnie:

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

Przypuszczam, że możesz wypracować bardziej szczegółowy układ, określając, które td w razie potrzeby.

Brice Coustillas
źródło
-5

robienie tego pokazanego powyżej ...

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

usuwa pionowe wyrównanie kolumn, więc należy zachować ostrożność podczas jego używania

richardh
źródło
-17

Czy próbowałeś:

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

Alternatywnie, każdy td może być również regulowany:

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

lub

 td.classname { padding-bottom:5em; }
sierpień
źródło
Czy to naprawdę działa? Mam div.el { display: table-row; margin: 10px; }i margines nic nie robi. Wiem, że to trochę inne niż rzeczywisty stół, ale nie powinno być ...
bradlis7
20
Wiersze / komórki tabeli nie mają marginesów.
Espen,