Colspan / Rowspan für Elemente, deren Anzeige auf Tabellenzelle eingestellt ist

108

Ich habe folgenden Code:

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan2 {
        /* What to do here? */
    }
</style>

Ziemlich einfach. Wie füge ich einen Colspan (oder das Äquivalent von Colspan) für Elemente mit hinzu display: table-cell?

Madaras Geist
quelle
5
Kannst du nicht einfach einen Tisch benutzen? Es wäre viel einfacher. Wenn dies tabellarische Daten sind, wären sie auch semantischer.
Punkrockbuddyholly
@ dreißigdot kann es wahrscheinlich, es wäre nur ein Schmerz und unnötig. Grid-Systeme wie 960 erreichen dies grundsätzlich, jedoch für ein gesamtes Seitenlayout.
Punkrockbuddyholly
@ MrMisterMan: Ich bin nicht sicher, was Sie sagen. 960.gs wird nicht verwendet display: table-cell.
dreißig Punkte
@dreißigdot Entschuldigung, ich habe die spezifische Frage vergessen, die das OP gestellt hatte. Sie haben Recht, Sie können keinen Colspan über CSS hinzufügen. Ich habe darauf hingewiesen, dass Sie divs dazu bringen können , sich wie Zeilen und Spalten zu verhalten, und dass dies Zellen umfasst, die sich über mehrere Spalten erstrecken.
Punkrockbuddyholly
Verwenden Sie eine simulierte Tabelle wie für Ihre erste Organisationsebene, mit der Sie beispielsweise eine klebrige Fußzeile erstellen können. Für Ihre Colspan-Emulation können Sie eine verschachtelte Tabelle in Ihrer eindeutigen Zelle erstellen, die eine einzelne Zeile und so viele Zellen enthält, wie Sie benötigen, oder ein einfaches schwebendes Div verwenden.
Bernard Dusablon

Antworten:

27

Da OP nicht ausdrücklich vorschreibt, dass die Lösung reines CSS sein muss, werde ich hartnäckig sein und meine Problemumgehung einsetzen, die ich heute herausgefunden habe, zumal sie viel eleganter ist als eine Tabelle in einer Tabelle.

Beispiel entspricht <Tabelle> mit zwei Zellen pro Zeile und zwei Zeilen, wobei die Zelle in der zweiten Zeile ein td mit ist colspan="2".

Ich habe dies mit Iceweasel 20, Firefox 23 und IE 10 getestet.

div.table {
  display: table;
  width: 100px;
  background-color: lightblue;
  border-collapse: collapse;
  border: 1px solid red;
}

div.row {
  display: table-row;
}

div.cell {
  display: table-cell;
  border: 1px solid red;
}

div.colspan,
div.colspan+div.cell {
  border: 0;
}

div.colspan>div {
  width: 1px;
}

div.colspan>div>div {
  position: relative;
  width: 99px;
  overflow: hidden;
}
<div class="table">
    <div class="row">
        <div class="cell">cell 1</div>
        <div class="cell">cell 2</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div><div>
                cell 3
            </div></div>
        </div>
        <div class="cell"></div>
    </div>
</div>

Live-Action (Demo) hier .

BEARBEITEN: Ich habe den Code feiner eingestellt, um druckerfreundlicher zu sein, da Hintergrundfarben standardmäßig weggelassen werden. Ich habe auch eine Rowspan-Demo erstellt , inspiriert von der späten Antwort hier.

F-3000
quelle
Ich suche nach einer ähnlichen Lösung. Aber stattdessen habe ich 5 Zellen in der obersten Reihe. In der unteren Reihe benötige ich 1 Zelle in der Größe der oberen Reihe. Dann ist eine Zelle mit Colspan = 2 und eine andere Zelle mit Colspan = 2, was insgesamt 5 Zellen in der unteren Reihe ergibt. Hier ist das jsfiddle-Problem, das auf Ihrer Lösung basiert. Irgendwelche Gedanken? jsfiddle.net/7wdza4ye/1
Varun Verma
1
@VarunVerma, Sie müssen eine leere Zelle zwischen den Zellen 7 und 8 hinzufügen. Nur das Hinzufügen <div class="cell"></div>funktioniert (zumindest mit Firefox). Bei diesem Design müssen Sie mit leeren Zellen auffüllen. Wenn Sie es beispielsweise so hätten, dass Zelle 7 colspan = 3 und Zelle 8 normal wäre, würden Sie zwei leere Zellen zwischen den Zellen 7 und 8 benötigen, es sei denn, Sie würden etwas anderes entwerfen (Ränder? Single customized div?) . Auch die Breite von 100px und 5 Zellen macht die Sache schwierig, da Wörter CSS-Zellen dehnen und Überlaufeinstellungen keinen Unterschied zu machen scheinen. Sie müssen auch neu zu berechnen widthfür div.colspan>div>div.
F-3000
es funktionierte. Vielen Dank. Tatsächlich habe ich nach Zelle 8 eine leere Zelle hinzugefügt, da der untere Rand nicht angezeigt wurde. Hier ist das Neueste: jsfiddle.net/7wdza4ye/3 . War sicher, wie man die Grenze zwischen Zelle 7 und 8 bekommt. Irgendwelche Vorschläge? Danke für Ihre Hilfe.
Varun Verma
1
@VarunVerma, bei Chrome war der äußere Rand nach 8 ohne leere Zelle unvollständig, daher ist er in der Tat erforderlich. Der einfache Weg, die Grenze zwischen den Zellen 7 und 8 hinzuzufügen, könnte folgender sein : div.colspan{border-left:1px solid red}. Es muss irgendwo unterhalb der Regel platziert werden, die div.colspan grenzenlos setzt, sonst wird es außer Kraft gesetzt.
F-3000
Danke @ F-3000. Das war hilfreich. Im Übrigen ist hier der neueste Link, der auf der Lösung von F-3000 basiert: jsfiddle.net/7wdza4ye/4
Varun Verma
16

Eine einfachere Lösung, die für mich in Chrome 30 funktioniert:

Colspan kann emuliert werden, indem display: tableanstelle von display: table-rowfür die Zeilen Folgendes verwendet wird :

.table {
    display: block;
}
.row {
    display: table;
    width: 100%;
}
.cell {
    display: table-cell;
}
.row.colspan2 {/* You'll have to add the 'colspan2' class to the row, and remove the unused <div class=cell> inside it */
    display: block;
}

Die einzige Gefahr besteht darin, dass die Zellen gestapelter Zeilen nicht vertikal ausgerichtet werden, da sie aus verschiedenen Tabellen stammen.

Philippe97
quelle
7

Wenn Sie nach einer direkten CSS-Methode suchen, um einen Colspan zu simulieren, können Sie diese verwenden display: table-caption.

.table {
  display: table;
}
.row {
  display: table-row;
}
.cell {
  display: table-cell;
  border: 1px solid #000;
}
.colspan2 {
  /* What to do here? */
  display: table-caption;
}
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>

stacigh
quelle
Das ist erstaunlich, dass du rockst!
Raj Kamal
1
Verwenden von display: table-caption erstreckt sich über alle Spalten und platziert die Zeile oben in der Tabelle, genau wie ein Beschriftungselement in einer HTML-Tabelle. Dies funktioniert also nicht wirklich. Nur wenn Sie alle Spalten in der ersten oder letzten Zeile überspannen möchten.
Michiel
6

Verwenden Sie einfach eine table.

Tabellen werden nur verpönt, wenn sie für Layoutzwecke verwendet werden.

Dies scheint tabellarische Daten (Datenzeilen / -spalten) zu sein. Daher würde ich die Verwendung eines empfehlen table.

Weitere Informationen finden Sie in meiner Antwort auf diese Frage :

Mit divs als Tabellen dasselbe erstellen

Curt
quelle
11
Die Sache ist, es ist nicht für tabellarische Daten, also möchte ich keine Tabelle verwenden :)
Madaras Geist
13
Ich verstehe nicht, warum es irgendwie besser ist, alles so zu gestalten, dass es sich genau wie eine Tabelle verhält, als nur eine Tabelle zu verwenden. Zugegeben, tr/ tdSpam ist nicht das schönste HTML, aber ist das der einzige Grund? Alle sagen, Tabellen seien nicht für die Formatierung "gedacht", aber HTML selbst sei nicht "gedacht", um die Hälfte der Dinge zu tun, die wir nach heutigen Standards für akzeptabel halten, einschließlich Webanwendungen.
Leichte
4
Fast ein Jahr später, aber - Leicht, ich teile Ihre Verärgerung mit Leuten, die Tische aus keinem anderen Grund als "Tische sind aus der Mode gekommen" meiden. Ich stoße jedoch auf einige reaktionsschnelle Designs, bei denen es nützlich ist, dass eine Tabelle keine Tabelle ist, sodass sie bei niedrigeren Breiten neu angeordnet werden kann. Zu lernen, dass ich keinen Colspan für Divs habe, ist etwas enttäuschend.
Spinn
4

Hier ist eine Möglichkeit, Spalten in CSS zu überspannen, die ich für meine eigene Situation verwendet habe.

https://jsfiddle.net/mb8npttu/

<div class='table'>
    <div class='row'>
        <div class='cell colspan'>
            spanning
        </div>
        <div class='cell'></div>
        <div class='cell'></div>
    </div>

    <div class='row'>
        <div class='cell'>1</div>
        <div class='cell'>2</div>
        <div class='cell'>3</div>
    </div>
</div>

<style>
    .table { display:table; }
    .row { display:table-row; }
    .cell { display:table-cell; }
    .colspan { max-width:1px; overflow:visible; }
</style>
Tim
quelle
2
Ich hatte zu erweitern .colspanmit white-space: nowrap;dem Ergebnis zu erhalten ich wollte, aber es funktionierte großartig.
kshetline
2

Es gibt eine Lösung, um den Colspan zur Breite der gesamten Tabelle zu machen. Sie können diese Technik nicht verwenden, um einen Teil der Tabelle zu überspannen.

Code:

    *{
      box-sizing: border-box;
    }
    .table {
        display: table;
        position: relative;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
        border: 1px solid red;
        padding: 5px;
        text-align: center;
    }
    .colspan {
        position: absolute;
        left: 0;
        width: 100%;
    }
    .dummycell {
        border-color: transparent;
    }
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell dummycell">&nbsp;</div>
        <div class="cell colspan">Cell</div>
    </div>
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
</div>

Erläuterung:

Wir verwenden die absolute Position auf dem Colspan, um die volle Breite der Tabelle zu erreichen. Die Tabelle selbst benötigt eine relative Position. Wir verwenden eine Dummy-Zelle, um die Höhe der Zeilen beizubehalten. Die absolute Position folgt nicht dem Fluss des Dokuments.

Natürlich können Sie heutzutage auch Flexbox und Grid verwenden, um dieses Problem zu lösen.

JT Houtenbos
quelle
1

CSS

.tablewrapper {
  position: relative;
}
.table {
  display: table;
  position: relative
}
.row {
  display: table-row;
}
.cell {
  border: 1px solid red;
  display: table-cell;
}
.cell.empty
{
  border: none;
  width: 100px;
}
.cell.rowspanned {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100px;
}
.cell.colspan {
  position: absolute;
  left: 0;
  right: 0;
}

HTML

<div class="tablewrapper">
  <div class="table">
    <div class="row">
      <div class="cell rowspanned">
        Center
      </div>
      <div class="cell">
        Top right
      </div>
    </div>
    <div class="row">
      <div class="cell empty"></div>
      <div class="cell colspan">
        Bottom right
      </div>
    </div>
  </div>
</div>

Code

bderevyaga
quelle
1

Dies kann nur mit reinem CSS erfolgen und den Text über den "falschen" Colspan zentrieren.

Der Trick besteht darin, die Zeilen auf zu setzen position:relativeund dann "leere Divs" an der Stelle zu platzieren, rowan der Sie die erstellen möchten colspan(sie müssen vorhanden sein height, damit sie funktionieren), die Stelle festzulegen , an der sich cellder Inhalt befindet display:grid, und schließlich position:absoluteauf das Element anzuwenden innerhalb der Zelle (und zentrieren Sie sie, wie Sie jedes andere absolute Element zentrieren können).

 .table {
        display: table;
  }
  .row {
      display: table-row;
      position: relative;
  }
  .cell {
      display: table-cell;
      background-color: blue;
      color: white;
      height: 26px;
      padding: 0 8px;
  } 
  .colspan2 {
      display: grid;
  }
  .colspan2 p {
    position:absolute;
    left: 50%;
    transform:translateX(-50%);
    margin: 0;
  }
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2"><p>Cell</p></div>
        <div class="cell"></div>
    </div>
</div>

Joe82
quelle
0

Durch Verwendung der entsprechenden div-Klassen und CSS-Attribute können Sie die gewünschten Effekte von colspan und rowspan nachahmen.

Hier ist das CSS

.table {
    display:table;
}

.row {
    display:table-row;
}

.cell {
    display:table-cell;
    padding: 5px;
    vertical-align: middle;
}

Hier ist das Beispiel-HTML

<div class="table">
    <div class="row">
        <div class="cell">
            <div class="table">
                <div class="row">
                    <div class="cell">X</div>
                    <div class="cell">Y</div>
                    <div class="cell">Z</div>
                </div>
                <div class="row">
                    <div class="cell">2</div>
                    <div class="cell">4</div>
                    <div class="cell">6</div>
                </div>
            </div>
        </div>
        <div class="cell">
            <div class="table">
                <div class="row">
                    <div class="cell">
                        <div class="table">
                            <div class="row">
                                <div class="cell">A</div>
                            </div>
                            <div class="row">
                                <div class="cell">B</div>
                            </div>
                        </div>
                    </div>
                    <div class="cell">
                        ROW SPAN
                    </div>    
                </div>
            </div>
        </div>
    </div>
</div>    

Was ich sowohl in den Fragen als auch in den meisten Antworten sehe, ist, dass die Leute zu vergessen scheinen, dass Sie in jedem Div, das als "Tabellenzelle" fungiert, ein anderes Div einfügen können, das sich wie eine eingebettete Tabelle verhält, und den Prozess starten können Über.

*** Es ist nicht glamourös, aber es funktioniert für diejenigen, die nach dieser Art der Formatierung suchen und die TABELLEN vermeiden möchten. Wenn es sich um DATA LAYOUT handelt, funktionieren TABLEs weiterhin in HTML5.

Hoffentlich hilft das jemandem.

GFS
quelle
Erstens hat HTML5 volle Unterstützung für <table>- es ist nur so, dass die Leute es vermeiden sollten , es für die visuelle Formatierung zu verwenden . Wenn Sie es zum Anzeigen strukturierter Daten verwenden , sollten Sie es verwenden , es sei denn, etwas anderes (z <ul>. B. als bloßes Beispiel) passt besser für die Aufgabe. Zweitens, Alter, 4 Tische. Sie bringen interessante Fragen auf den Tisch (Zeilenbereich), aber Ihre Antwort schreit nach Verwendung <table>. Ich muss sehen, wie meine Lösung hier funktioniert ...
F-3000
Ich würde meinen früheren Kommentar bearbeiten, aber das Zeitlimit schlägt ein. Wie bei meiner Antwort zu Colspan kann Rowspan mit VIEL weniger Aufwand erreicht werden als mit Ihrem ... ursprünglichen Ansatz. Überzeugen Sie sich selbst .
F-3000
Vielen Dank für Ihr Feedback. Ich habe nie gesagt, dass HTML5 keine Tabellen unterstützt. Viele Menschen versuchen es einfach zu vermeiden. Manchmal benötigen Sie beim Schreiben einer Web-App (im Gegensatz zu einer Seite vom Typ "Werbung") eher ein festes Layout für die Platzierung von Schaltflächen und / oder Steuerelementen.
GFS
0

Sie können die Position des Colspan-Inhalts wie folgt als "relativ" und die Zeile als "absolut" festlegen:

.table {
    display: table;
}
.row {
    display: table-row;
    position: relative;
}
.cell {
    display: table-cell;
}
.colspan2 {
    position: absolute;
    width: 100%;
}
Justo
quelle
0

Das können Sie derzeit nicht erreichen.

AFAIK würde dies durch CSS-Tabellen abgedeckt , eine Spezifikation, die sich derzeit im Status "in Arbeit" zu befinden scheint.

naXa
quelle
0

Sie können diese Lösung ausprobieren, in der Sie mithilfe von div https://codepen.io/pkachhia/pen/JyWMxY erfahren, wie Sie Colspan anwenden

HTML:

<div class="div_format">
            <div class="divTable">
                <div class="divTableBody">
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Project Name</div>
                        <div class="divTableCell cell_value">: Testing Project</div>
                        <div class="divTableCell cell_lable">Project Type</div>
                        <div class="divTableCell cell_value">: Web application</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Version</div>
                        <div class="divTableCell cell_value">: 1.0.0</div>
                        <div class="divTableCell cell_lable">Start Time</div>
                        <div class="divTableCell cell_value">: 2016-07-10 11:00:21</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Document Version</div>
                        <div class="divTableCell cell_value">: 2.0.0</div>
                        <div class="divTableCell cell_lable">End Time</div>
                        <div class="divTableCell cell_value">: 2017-07-10 11:00:23</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Document Revision</div>
                        <div class="divTableCell cell_value">: 3</div>
                        <div class="divTableCell cell_lable">Overall Result</div>
                        <div class="divTableCell cell_value txt_bold txt_success">: Passed</div>
                    </div>                          
                </div>
                <div class="divCaptionRow">
                    <div class="divCaptionlabel">Description</div>
                    <div class="divCaptionValue">: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore</div>
                </div>
            </div>
        </div>

CSS:

body {
                font-family: arial
            }
            * {
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box
            }
            .div_format {
                width: 100%;
                display: inline-block;
                position: relative
            }           
            .divTable {
                display: table;
                width: 100%;            
            }
            .divTableRow {
                display: table-row
            }
            .divTableHeading {
                background-color: #EEE;
                display: table-header-group
            }
            .divTableCell,
            .divTableHead {
                display: table-cell;
                padding: 10px
            }
            .divTableHeading {
                background-color: #EEE;
                display: table-header-group;
                font-weight: bold
            }
            .divTableFoot {
                background-color: #EEE;
                display: table-footer-group;
                font-weight: bold
            }
            .divTableBody {
                display: table-row-group
            }
            .divCaptionRow{
                display: table-caption;
                caption-side: bottom;
                width: 100%;
            }
            .divCaptionlabel{
                caption-side: bottom;
                display: inline-block;
                background: #ccc;
                padding: 10px;
                width: 15.6%;
                margin-left: 10px;
                color: #727272;
            }
            .divCaptionValue{
                float: right;
                width: 83%;
                padding: 10px 1px;
                border-bottom: 1px solid #dddddd;
                border-right: 10px solid #fff;
                color: #5f5f5f;
                text-align: left;
            }

            .cell_lable {
                background: #d0d0d0;
                border-bottom: 1px solid #ffffff;
                border-left: 10px solid #ffffff;
                border-right: 10px solid #fff;
                width: 15%;
                color: #727272;
            }
            .cell_value {
                border-bottom: 1px solid #dddddd;
                width: 30%;
                border-right: 10px solid #fff;   
                color: #5f5f5f;
            }
pkachhia
quelle
-1

Auch wenn dies eine alte Frage ist, möchte ich meine Lösung für dieses Problem mitteilen.

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div class="spanned-content">Cell</div>
        </div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan:after {
        /* What to do here? */
        content: "c";
        display: inline;
        visibility: hidden;
    }
    .spanned-content {
        position: absolute;
    }
</style>

Hier ist eine Geige . Es ist nicht wirklich eine Zeitspanne, und die Lösung ist ein bisschen hacky, aber es ist in einigen Situationen nützlich. Getestet auf Chrome 46, Firefox 31 und IE 11.

In meinem Fall musste ich einige nicht tabellarische Daten tabellarisch darstellen, wobei die Breite der Spalten beibehalten und Unterabschnitte der Daten mit einem Titel versehen wurden.

Gabriel
quelle
Natürlich können Sie sich immer auf eine Grid-Lösung wie die von Bootstrap verlassen. In diesem speziellen Fall brauchte ich wirklich die automatische Breite, die display: table bietet.
Gabriel
Wenn Sie dem überspannten Inhalt eine Hintergrundfarbe geben möchten, müssen Sie Ihre tr mit der vollen Anzahl von tds füllen :(
Gabriel
Am Ende habe ich eine Tabelle erstellt und mein Konzept der "tabellarischen Daten" neu definiert ^^
Gabriel
-2

Verwenden Sie verschachtelte Tabellen, um Spaltenbereiche zu verschachteln ...

<div class="table">
  <div class="row">
    <div class="cell">
      <div class="table">
        <div class="row">
          <div class="cell">Cell</div>
          <div class="cell">Cell</div>
        </div>
      </div>
    </div>
  </div>

  <div class="row">
    <div class="cell">Cell</div>
  </div>
</div>

Oder verwenden Sie 2 Tabellen, in denen die Spaltenspanne die gesamte Zeile abdeckt ...

<div class="table">
  <div class="row">
    <div class="cell">Cell</div>
    <div class="cell">Cell</div>
  </div>
</div>

<div class="table">
  <div class="row">
    <div class="cell">Cell</div>
  </div>
</div>
Henry George
quelle
2
Die Frage war, wie es mit CSS geht.
Enno Gröper
4
Es tut mir leid, aber das klingt nach einer wirklich schlechten Idee.
Madaras Geist