CSS-Tabellenlayout: Warum akzeptiert die Tabellenzeile keinen Rand?

98

.container {
  width: 850px;
  padding: 0;
  display: table;
  margin-left: auto;
  margin-right: auto;
}
.row {
  display: table-row;
  margin-bottom: 30px;
  /* HERE */
}
.home_1 {
  width: 64px;
  height: 64px;
  padding-right: 20px;
  margin-right: 10px;
  display: table-cell;
}
.home_2 {
  width: 350px;
  height: 64px;
  padding: 0px;
  vertical-align: middle;
  font-size: 150%;
  display: table-cell;
}
.home_3 {
  width: 64px;
  height: 64px;
  padding-right: 20px;
  margin-right: 10px;
  display: table-cell;
}
.home_4 {
  width: 350px;
  height: 64px;
  padding: 0px;
  vertical-align: middle;
  font-size: 150%;
  display: table-cell;
}
<div class="container">
  <div class="row">
    <div class="home_1"></div>
    <div class="home_2"></div>
    <div class="home_3"></div>
    <div class="home_4"></div>
  </div>

  <div class="row">
    <div class="home_1"></div>
    <div class="home_2"></div>
  </div>
</div>

Meine Frage bezieht sich auf die HEREim CSS markierte Zeile . Ich fand heraus, dass die Zeilen zu nahe beieinander liegen, und versuchte, einen unteren Rand hinzuzufügen, um sie zu trennen. Geht leider nicht. Ich muss die Ränder zu den Tabellenzellen hinzufügen, um die Zeilen zu trennen.

Was ist der Grund für dieses Verhalten?

Ist es auch in Ordnung, diese Strategie zu verwenden, um das Layout wie folgt durchzuführen:

[icon] - text      [icon] - text
[icon] - text      [icon] - text

oder gibt es eine bessere strategie?

Stefano Borini
quelle
Wenn Sie Platz zwischen den Zeilen wünschen, fügen Sie home_4 padding-bottom hinzu.
Satbir Kira

Antworten:

82

Siehe CSS 2.1-Standard, Abschnitt 17.5.3. Bei Verwendung display:table-rowwird die Höhe des DIV ausschließlich durch die Höhe der darin enthaltenen table-cellElemente bestimmt. Daher haben Rand, Polsterung und Höhe dieser Elemente keine Auswirkung.

http://www.w3.org/TR/CSS2/tables.html

richardtallent
quelle
30

Wie ist das für eine Umgehung (unter Verwendung einer tatsächlichen Tabelle)?

table {
    border-collapse: collapse;
}

tr.row {
    border-bottom: solid white 30px; /* change "white" to your background color */
}

Es ist nicht so dynamisch, da Sie die Farbe des Rahmens explizit festlegen müssen (es sei denn, es gibt auch einen Weg, dies zu umgehen), aber damit experimentiere ich in einem eigenen Projekt.

Bearbeiten , um Kommentare zu folgenden Themen aufzunehmen transparent:

tr.row {
    border-bottom: 30px solid transparent;
}
MuffinTheMan
quelle
14
Versuchen Sie 'transparent' anstelle von 'weiß' als Farbe.
Lendrick
Es funktioniert perfekt für mich, auch ohne Tabellenkollaps, nur um Tabellenzellen einen transparenten Rand hinzuzufügen! Vielen Dank !
Igor Laszlo
18

Das nächste, was ich gesehen habe, wäre, border-spacing: 0 30px;auf den Container div zu setzen. Dies lässt mir jedoch nur Platz am oberen Rand des Tisches, was den Zweck zunichte macht, da Sie Rand-unten wollten.

Julian H. Lam
quelle
1
Sie können auch versuchenline-height
Raheel Hasan
1
Sie können Leerzeichen oben und unten mit entfernen margin: -30px 0.
Sanghyun Lee
Von all diesen Problemumgehungen scheint der Randabstand die semantischste Option zu sein. Vielen Dank!
Pikamander2
6

Haben Sie versucht, den unteren Rand auf .row div"Ihre Zellen" einzustellen? Wenn Sie mit tatsächlichen HTML-Tabellen arbeiten, können Sie auch keine Zeilen für Zeilen festlegen - nur für Zellen.

Naivisten
quelle
Das hat leider nicht funktioniert. Nur "Auffüllen" kann das div mit beeinflussen display: table. Dies ist jedoch nicht ganz das Gleiche wie Marge ...
Julian H. Lam
3

Hierfür gibt es eine ziemlich einfache Lösung, an der die Attribute border-spacingund border-collapseCSS arbeiten display: table.

Sie können Folgendes verwenden, um Auffüllungen / Ränder in Ihren Zellen zu erhalten.

.container {
  width: 850px;
  padding: 0;
  display: table;
  margin-left: auto;
  margin-right: auto;
  border-collapse: separate;
  border-spacing: 15px;
}

.row {
  display: table-row;
}

.home_1 {
  width: 64px;
  height: 64px;
  padding-right: 20px;
  margin-right: 10px;
  display: table-cell;
}

.home_2 {
  width: 350px;
  height: 64px;
  padding: 0px;
  vertical-align: middle;
  font-size: 150%;
  display: table-cell;
}

.home_3 {
  width: 64px;
  height: 64px;
  padding-right: 20px;
  margin-right: 10px;
  display: table-cell;
}

.home_4 {
  width: 350px;
  height: 64px;
  padding: 0px;
  vertical-align: middle;
  font-size: 150%;
  display: table-cell;
}
<div class="container">
  <div class="row">
    <div class="home_1">Foo</div>
    <div class="home_2">Foo</div>
    <div class="home_3">Foo</div>
    <div class="home_4">Foo</div>
  </div>

  <div class="row">
    <div class="home_1">Foo</div>
    <div class="home_2">Foo</div>
  </div>
</div>

Beachten Sie, dass Sie haben müssen

border-collapse: separate;

Sonst funktioniert es nicht.

Kris Boyd
quelle
Dies funktioniert wie ein Zauber, aber das einzige Problem ist, dass ich, sobald ich randtrennend anwende, den Rand aus der Zeile entferne, den Rand in der Zeile als Rand unten verwendet habe: 1px fest # 000, eine Idee?
Abbas
0

Geige

 .row-seperator{
   border-top: solid transparent 50px;
 }

<table>
   <tr><td>Section 1</td></tr>
   <tr><td>row1 1</td></tr>
   <tr><td>row1 2</td></tr>
   <tr>
      <td class="row-seperator">Section 2</td>
   </tr>
   <tr><td>row2 1</td></tr>
   <tr><td>row2 2</td></tr>
</table>


#Outline
Section 1
row1 1
row1 2


Section 2
row2 1
row2 2

Dies kann eine andere Lösung sein

Mehmet Eren Yener
quelle
0

Fügen Sie eine Abstandsspanne zwischen zwei Elementen hinzu und machen Sie sie dann nicht sichtbar:

<img src="#" />
<span class="spacer">---</span>
<span>Text TEXT</span>

.spacer {
    visibility: hidden
}
funky-nd
quelle
0

Works - Abstand zur Tabelle hinzufügen

#options table {
  border-spacing: 8px;
}
Jason
quelle
-2

Das Hinzufügen eines br-Tags zwischen den Divs hat funktioniert. Fügen Sie ein br-Tag zwischen zwei divs hinzu, die angezeigt werden: table-row in einem übergeordneten Element mit display: table

TeT Psy
quelle