Die Eigenschaft border-radius und border-collapse:collapse passen nicht zusammen. Wie kann ich border-radius verwenden, um eine reduzierte Tabelle mit abgerundeten Ecken zu erstellen?

Lesezeit: 9 Minuten

Ich versuche, mit CSS eine Tabelle mit abgerundeten Ecken zu erstellen border-radius Eigentum. Die Tabellenstile, die ich verwende, sehen in etwa so aus:

table {
    -moz-border-radius:10px;
    -webkit-border-radius:10px;
    border-radius:10px
}

Hier ist das Problem. Ich möchte auch die einstellen border-collapse:collapse Eigentum, und wenn das eingestellt ist border-radius funktioniert nicht mehr. Gibt es eine CSS-basierte Methode, mit der ich denselben Effekt erzielen kann border-collapse:collapse ohne es tatsächlich zu nutzen?

Es scheint, dass ein großer Teil des Problems darin besteht, dass das Einrichten des Tisches mit abgerundeten Ecken die Ecken der Ecke nicht beeinflusst td Elemente. Wenn der Tisch alle eine Farbe hätte, wäre das kein Problem, da ich einfach die Ober- und Unterseite machen könnte td abgerundete Ecken für die erste bzw. letzte Reihe. Allerdings verwende ich unterschiedliche Hintergrundfarben für die Tabelle zur Unterscheidung der Überschriften und für die Umrandung, also das Innere td Elemente würden auch ihre abgerundeten Ecken zeigen.

Den Tisch mit einem anderen Element mit runden Ecken zu umgeben, funktioniert nicht, weil die eckigen Ecken des Tisches “durchbluten”.

Wenn Sie die Rahmenbreite auf 0 festlegen, wird die Tabelle nicht reduziert.

Unterseite td Ecken immer noch quadratisch, nachdem der Zellenabstand auf Null gesetzt wurde.

Die Tabellen werden in PHP generiert, sodass ich einfach eine andere Klasse auf jedes der äußeren th/tds anwenden und jede Ecke separat stylen könnte. Ich würde dies lieber nicht tun, da es nicht sehr elegant und ein bisschen mühsam ist, es auf mehrere Tabellen anzuwenden, also kommen Sie bitte mit Vorschlägen weiter.

Ich möchte dies ohne JavaScript tun.

  • Könnten Sie die Tabelle nicht in ein Div umschließen, den Randradius und “Overflow: Hidden” für das Div festlegen? Ich habe es gerade getestet und das funktioniert gut, es sei denn, Sie müssen in einem Div scrollen/erweitern, das eine feste Breite/Höhe hat, oder in seinen Eltern, die dies tun.

    – Jan

    13. August 2012 um 18:05 Uhr

Ich habe es herausgefunden. Sie müssen nur einige spezielle Selektoren verwenden.

Das Problem beim Abrunden der Ecken des Tisches war, dass die td Elemente wurden auch nicht abgerundet. Sie können das lösen, indem Sie Folgendes tun:

table tr:last-child td:first-child {
    border: 2px solid orange;
    border-bottom-left-radius: 10px;
}
    
table tr:last-child td:last-child {
    border: 2px solid green;
    border-bottom-right-radius: 10px;
}
<table>
  <tbody>
    <tr>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <td>3</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

Jetzt rundet alles einwandfrei, außer dass da noch das Thema ist border-collapse: collapse alles kaputt machen.

Ein Workaround ist zu hinzufügen border-spacing: 0 und belassen Sie die Standardeinstellung border-collapse: separate auf den Tisch.

  • Anstatt mit dem HTML herumzuspielen, warum nicht hinzufügen border-spacing: 0; als Grenzstil?

    – Ramon Tayag

    8. März 2011 um 3:43 Uhr

  • Ich hatte ein Problem beim Festlegen der Hintergrundfarbe des TR-Tags anstelle des TD-Tags. Achten Sie beim Strippen Ihrer Tabelle darauf, dass Sie die Hintergrundfarbe des TD und nicht des TR einstellen.

    – Will Shaver

    22. August 2011 um 21:08 Uhr

  • Nun, was passiert, wenn Sie müssen, zu … haben Hintergrundfarbe auf dem TR verwenden? Ist es überhaupt möglich?

    – Mohoch

    9. Oktober 2011 um 15:21 Uhr

  • Nur hinzufügen border-spacing: 0; wie Ramon es für mich repariert empfehlen. Stellen Sie sicher, dass Sie die hinzufügen border-radius und border-spacing Stile zu <th> oder <td> Elemente, nicht <thead> oder <tbody>.

    – Gawin

    3. Oktober 2013 um 18:36 Uhr


  • Ich verwende Bootstrap und habe die Lösung gefunden, indem ich Ramons Rat befolgt habe: border-spacing: 0; border-collapse: separate;

    – Caner SAYGIN

    13. April 2019 um 15:41 Uhr


Die folgende Methode funktioniert (getestet in Chrome) mit a box-shadow mit einer Verbreitung von 1px statt einer “echten” Grenze.

    table {
        border-collapse: collapse;
        border-radius: 30px;
        border-style: hidden; /* hide standard table (collapsed) border */
        box-shadow: 0 0 0 1px #666; /* this draws the table border  */ 
    }

    td {
        border: 1px solid #ccc;
    }
<table>
  <thead>
    <tr>
      <th>Foo</th>
      <th>Bar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Baz</td>
      <td>Qux</td>
    </tr>
    <tr>
      <td>Life is short</td>
      <td rowspan="3">and</td>
    </tr>
    <tr>
      <td>Love</td>
    </tr>
    <tr>
      <td>is always over</td>
    </tr>
    <tr>
      <td>In the</td>
      <td>Morning</td>
    </tr>
  </tbody>
</table>

  • Dies ist das einzige, was für mich funktioniert hat. Es ist jedoch schwierig, die richtige Farbe auf den Tischrand zu bekommen.

    – Thomas Ahle

    18. März 2011 um 23:40 Uhr

  • Es ist nicht verwendbar wenn Ihr Tisch hat eine andere Hintergrundfarbe als die Umgebung.

    – g.pickardou

    29. Oktober 2013 um 9:49 Uhr

  • @g.pickardou Dieses Problem kann durch Hinzufügen von „overflow: hidden“ zum Tabellenelement behoben werden.

    – Val

    4. August 2016 um 6:56 Uhr

  • Box-Shadow macht den Tisch größer und daher werden die Seiten jetzt abgeschnitten.

    – Strahl

    4. Mai 2020 um 16:20 Uhr

Wenn Sie eine reine CSS-Lösung wünschen (keine Notwendigkeit, cellspacing=0 im HTML), die 1px-Ränder zulässt (was Sie mit der border-spacing: 0 Lösung), bevorzuge ich Folgendes:

  • Stellen Sie ein border-right und border-bottom für Ihre Tabellenzellen (td und th)
  • Geben Sie die Zellen in der erste Reihe a border-top
  • Geben Sie die Zellen in der erste Spalte a border-left
  • Verwendung der first-child und last-child Selektoren, runden Sie die entsprechenden Ecken für die Tabellenzellen in den vier Ecken ab.

Sehen Sie hier eine Demo.

Angesichts des folgenden HTML:

SIEHE Beispiel unten:

   
table {
  border-collapse: separate;
  border-spacing: 0;
  min-width: 350px;
}
table tr th,
table tr td {
  border-right: 1px solid #bbb;
  border-bottom: 1px solid #bbb;
  padding: 5px;
}

table tr th:first-child,
table tr td:first-child {
  border-left: 1px solid #bbb;
}
table tr th:first-child,
table tr td:first-child {
  border-left: 1px solid #bbb;
}
table tr th {
  background: #eee;
  text-align: left;
  border-top: solid 1px #bbb;
}

/* top-left border-radius */
table tr:first-child th:first-child {
  border-top-left-radius: 6px;
}

/* top-right border-radius */
table tr:first-child th:last-child {
  border-top-right-radius: 6px;
}

/* bottom-left border-radius */
table tr:last-child td:first-child {
  border-bottom-left-radius: 6px;
}

/* bottom-right border-radius */
table tr:last-child td:last-child {
  border-bottom-right-radius: 6px;
}
<div>
    <table>
        <tr>
            <th>item1</th>
            <th>item2</th>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
    </table>
</div>

  • Bitte schreiben Sie Antworten, die (permanenten) Code enthalten. Wenn die Antwort viel Code enthält, posten Sie einfach die relevanten Bits und eine Erklärung, warum sie relevant sind.

    – Samuel Harmer

    20. Januar 2012 um 16:12 Uhr

  • Dies ist eine großartige Lösung, aber es war ein bisschen schwer zu lesen. Ich habe einige der Stilregeln umgeschrieben und eine Erklärung des Codes hinzugefügt, also hoffe ich, dass das hilft.

    – Michael Martin-Smucker

    16. Oktober 2012 um 15:13 Uhr

  • Wenden Sie auch einen Radius auf die Tabelle an, sonst sieht es komisch aus, wenn Sie der Tabelle selbst einen Hintergrund zuweisen.

    – Ziege

    19. Juni 2013 um 3:29 Uhr

  • Was bedeutet die table.Info Klasse hat das was zu tun?

    – Pylinux

    22. Dezember 2016 um 6:43 Uhr

Hast du es mal mit versucht table{border-spacing: 0} anstatt table{border-collapse: collapse} ???

Benutzeravatar von user59200
Benutzer59200

Sie müssen wahrscheinlich ein anderes Element um den Tisch legen und dieses mit einem abgerundeten Rand gestalten.

Die Arbeitsentwurf gibt das an border-radius gilt nicht für Tabellenelemente, wenn der Wert von border-collapse ist collapse.

  • Das war etwas, was ich auch in Betracht gezogen habe, aber wenn ich ein Div erstelle, um den Tisch zu umgeben, und es so einstelle, dass es abgerundete Ecken hat, bluten die quadratischen Tischecken immer noch durch. Siehe das neu gepostete Beispiel.

    – vamin

    9. März 2009 um 23:21 Uhr

  • Der beste Kompromiss, den ich finden konnte, war das Hinzufügen eines THEAD-Blocks zur Tabelle und das Anwenden des grauen Hintergrunds darauf (mit #eee auf der Tabelle selbst). Die Header-Zellen liefen hinter den Rand der TABELLE statt davor. Dann habe ich den Tabellenrand auf 3 Pixel erhöht, um den Überlauf zu verbergen.

    – Benutzer59200

    10. März 2009 um 1:25 Uhr

  • @vamin “Durchbluten” – nicht, wenn Sie es verwenden overflow:hidden;

    – Brian McCutchon

    21. Mai 2013 um 0:19 Uhr


  • In dieser Situation kann also jeder meine Lösung von unten auf dieser Seite verwenden b2n.ir/table-radius

    – AmerllicA

    24. Oktober 2017 um 11:48 Uhr

Wie Ian sagte, besteht die Lösung darin, die Tabelle in einem div zu verschachteln und so festzulegen:

.table_wrapper {
  border-radius: 5px;
  overflow: hidden;
}

Mit overflow:hiddendie eckigen Ecken bluten nicht durch das div.

  • Das war etwas, was ich auch in Betracht gezogen habe, aber wenn ich ein Div erstelle, um den Tisch zu umgeben, und es so einstelle, dass es abgerundete Ecken hat, bluten die quadratischen Tischecken immer noch durch. Siehe das neu gepostete Beispiel.

    – vamin

    9. März 2009 um 23:21 Uhr

  • Der beste Kompromiss, den ich finden konnte, war das Hinzufügen eines THEAD-Blocks zur Tabelle und das Anwenden des grauen Hintergrunds darauf (mit #eee auf der Tabelle selbst). Die Header-Zellen liefen hinter den Rand der TABELLE statt davor. Dann habe ich den Tabellenrand auf 3 Pixel erhöht, um den Überlauf zu verbergen.

    – Benutzer59200

    10. März 2009 um 1:25 Uhr

  • @vamin “Durchbluten” – nicht, wenn Sie es verwenden overflow:hidden;

    – Brian McCutchon

    21. Mai 2013 um 0:19 Uhr


  • In dieser Situation kann also jeder meine Lösung von unten auf dieser Seite verwenden b2n.ir/table-radius

    – AmerllicA

    24. Oktober 2017 um 11:48 Uhr

Benutzeravatar von Igor Ivancha
Igor Iwancha

Nach meinem besten Wissen wäre die einzige Möglichkeit, dies zu tun, alle Zellen wie folgt zu ändern:

table td {
  border-right-width: 0px;
  border-bottom-width: 0px;
}

Und dann den Rand unten und rechts hinten zu bekommen

table tr td:last-child {
  border-right-width: 1px;
}
table tr:last-child td {
  border-bottom-width: 1px;
}

:last-child ist in ie6 nicht gültig, aber wenn Sie verwenden border-radius Ich nehme an, es ist dir egal.

BEARBEITEN:

Nachdem Sie sich Ihre Beispielseite angesehen haben, scheint es, dass Sie dies möglicherweise mit Zellabständen und -auffüllungen umgehen können.

Die dicken grauen Ränder, die Sie sehen, sind eigentlich der Hintergrund der Tabelle (Sie können dies deutlich sehen, wenn Sie die Randfarbe in Rot ändern). Wenn Sie den Zellenabstand auf Null setzen (oder gleichwertig: td, th { margin:0; }) verschwinden die grauen “Ränder”.

BEARBEITEN 2:

Ich finde keine Möglichkeit, dies mit nur einer Tabelle zu tun. Wenn Sie Ihre Kopfzeile in eine verschachtelte Tabelle ändern, können Sie möglicherweise den gewünschten Effekt erzielen, aber es ist mehr Arbeit und nicht dynamisch.

  • Ich habe ein Beispiel mit Cellspacing = 0 hinzugefügt, und es ist viel näher. Die unerwünschten Ränder verschwinden, aber die unteren Ecken bluten immer noch aus.

    – vamin

    9. März 2009 um 23:38 Uhr

  • Danke nochmal für deine Hilfe. Die Tabellen werden in PHP generiert, also denke ich, wenn es keine elegante Lösung gibt, werde ich einfach jeder Ecke th/td eine Klasse zuweisen und sie separat gestalten.

    – vamin

    10. März 2009 um 0:07 Uhr

1441450cookie-checkDie Eigenschaft border-radius und border-collapse:collapse passen nicht zusammen. Wie kann ich border-radius verwenden, um eine reduzierte Tabelle mit abgerundeten Ecken zu erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy