Colspan / Rowspan para elementos cuya visualización se establece en celda de tabla

108

Tengo el siguiente código:

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

Muy claro. ¿Cómo agrego un colspan (o el equivalente de colspan) para los elementos con display: table-cell?

Fantasma de Madara
fuente
5
¿No puedes usar una mesa? Sería mucho más fácil. Además, si se trata de datos tabulares, también sería más semántico.
punkrockbuddyholly
@thirtydot probablemente pueda, sería un dolor e innecesario. Los sistemas de cuadrícula como 960 básicamente logran esto, pero para un diseño de página completo.
punkrockbuddyholly
@MrMisterMan: No estoy seguro de lo que está diciendo. 960.gs no usa display: table-cell.
thirtydot
@thirtydot lo siento, olvidé la pregunta específica que había hecho el OP. Tienes razón, no puedes agregar un colspan a través de CSS. Estaba señalando que puede hacer que los div se comporten como filas y columnas y eso incluye celdas que abarcan varias columnas.
punkrockbuddyholly
Use una tabla simulada como lo hace para su primer nivel de organización, lo que le dará la posibilidad de crear un pie de página pegajoso, por ejemplo. para su emulación colspan, puede crear una tabla anidada en su celda única, que tendrá una sola fila y tantas celdas necesite, o use div flotante simple.
Bernard Dusablon

Respuestas:

27

Dado que OP no establece explícitamente que la solución debe ser CSS puro, seré obstinado y ofreceré mi solución que descubrí hoy, especialmente porque es mucho más elegante que tener una mesa dentro de una tabla.

Ejemplo es igual a <tabla> con dos celdas por fila y dos filas, donde la celda de la segunda fila es un td con colspan="2".

He probado esto con Iceweasel 20, Firefox 23 e IE 10.

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>

Acción en vivo (demostración) aquí .

EDITAR: Ajusté el código para que sea más fácil de imprimir, ya que dejan los colores de fondo de forma predeterminada. También creé rowpan-demo , inspirado en la respuesta tardía aquí.

F-3000
fuente
Busco una solución similar. Pero en cambio, tengo 5 celdas en la fila superior. En la fila inferior, necesito 1 celda del mismo tamaño que la fila superior. Luego, una celda que tiene colspan = 2 y otra celda que tiene colspan = 2, lo que hace un total de 5 celdas en la fila inferior también. Aquí está el problema de jsfiddle basado en su solución. ¿Alguna idea? jsfiddle.net/7wdza4ye/1
Varun Verma
1
@VarunVerma, debes agregar una celda vacía entre las celdas 7 y 8. Simplemente agregar <div class="cell"></div>funciona (al menos con Firefox). Con este diseño, debe rellenar con celda (s) vacías. Por ejemplo, si lo tuviera de modo que la celda 7 fuera colspan = 3 y la celda 8 fuera normal, entonces necesitaría dos celdas vacías entre las celdas 7 y 8. A menos que diseñe algo más (¿márgenes? ¿Div personalizado único?) . Además, el ancho de 100px y 5 celdas dificulta las cosas, porque las palabras estiran las celdas css, la configuración de desbordamiento no parece hacer la diferencia. También es necesario volver a calcular widthpara div.colspan>div>div.
F-3000
funcionó. Gracias. De hecho, agregué una celda vacía después de la celda 8 porque el borde inferior no aparecía. Aquí está lo último: jsfiddle.net/7wdza4ye/3 . Estaba seguro de cómo obtener el límite entre las celdas 7 y 8. ¿Alguna sugerencia? Gracias por tu ayuda.
Varun Verma
1
@VarunVerma, con Chrome, el borde exterior estaba incompleto sin una celda vacía después de las 8, por lo que es obligatorio. Una manera sencilla de añadir la frontera entre las células 7 y 8 podría ser la siguiente: div.colspan{border-left:1px solid red}. Debe colocarse en algún lugar debajo de la regla que establece div.colspan sin bordes, o se anulará.
F-3000
Gracias @ F-3000. Eso fue útil. Para el resto, aquí está el último enlace basado en la solución de F-3000: jsfiddle.net/7wdza4ye/4
Varun Verma
16

Una solución más simple que me funciona en Chrome 30:

Colspan se puede emular usando en display: tablelugar de display: table-rowpara las filas:

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

El único inconveniente es que las celdas de las filas apiladas no se alinean verticalmente, ya que son de tablas diferentes.

Philippe97
fuente
7

Si está buscando una forma CSS directa de simular un colspan, podría usar 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
fuente
¡Eso es increíble, rock!
Raj Kamal
1
El uso de display: table-caption abarcará todas las columnas y colocará la fila en la parte superior de la tabla, al igual que un elemento de título en la tabla html, por lo que esto realmente no funciona. Solo si desea abarcar todas las columnas de la primera o la última fila.
Michiel
6

Simplemente use un table.

las tablas solo están mal vistas cuando se utilizan con fines de diseño.

Esto parece datos tabulares (filas / columnas de datos). Por lo tanto, recomendaría usar un archivo table.

Consulte mi respuesta a esta pregunta para obtener más información:

creando lo mismo con divs como tablas

Brusco
fuente
11
La cuestión es que no es para datos tabulares, así que no quiero usar una tabla :)
Madara's Ghost
13
No entiendo por qué usar CSS para que todo se comporte exactamente como una tabla sea preferible de alguna manera a simplemente usar una tabla. Es cierto que tr/ tdspam no es el html más bonito, pero ¿es esa la única razón? Todo el mundo dice que las tablas no estaban "destinadas" a ser utilizadas para formatear, pero el html en sí no estaba "destinado" a hacer la mitad de las cosas que consideramos aceptables según los estándares actuales, incluidas las aplicaciones web.
Ligero
4
Casi un año después, pero ... Un poco, comparto su irritación con la gente que evita las mesas sin otra razón que "las mesas están pasadas de moda". Sin embargo, me encuentro con algunos diseños receptivos en los que es útil que una tabla no sea una tabla, por lo que se puede reorganizar en anchos más bajos. Aprender que no tengo colspan para divs es algo decepcionante.
spinn
4

Aquí hay una forma de abarcar columnas en CSS que usé para mi propia situación.

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
fuente
2
Tuve que aumentar .colspancon white-space: nowrap;para obtener el resultado que quería, pero funcionó muy bien.
kshetline
2

Existe una solución para hacer que el colspan tenga el ancho de toda la mesa. No puede utilizar esta técnica para colspan una parte de la mesa.

Código:

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

Explicación:

Usamos la posición absoluta en el colspan para que sea el ancho completo de la mesa. La mesa en sí necesita una posición relativa. Hacemos uso de una celda ficticia para mantener la altura de las filas, la posición absoluta no sigue el flujo del documento.

Por supuesto, también puede usar flexbox y grid para abordar este problema en estos días.

JT Houtenbos
fuente
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>

Código

bderevyaga
fuente
1

Se puede hacer simplemente con CSS puro y centrando el texto en el colspan "falso".

El truco es establecer las filas en position:relative, luego colocar "divs vacíos" en el lugar rowdonde desea hacer colspan(deben tener heightpara funcionar), establecer celldónde está el contenido como display:grid, y finalmente, aplicar position:absoluteal elemento dentro de la celda (y céntrela como puede centrar cualquier otro elemento absoluto).

 .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
fuente
0

Al usar las clases div y los atributos CSS adecuados, puede imitar los efectos deseados de colspan y rowspan.

Aquí está el CSS

.table {
    display:table;
}

.row {
    display:table-row;
}

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

Aquí está el HTML de muestra

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

Por lo que veo tanto en las preguntas como en la mayoría de las respuestas, la gente parece olvidar que en cualquier div que actúe como una "celda de tabla", puede insertar otro div que actúa como una tabla incrustada y comenzar el proceso. encima.

*** No es glamoroso, pero funciona para aquellos que buscan este tipo de formato y quieren evitar las TABLAS. Si es para DISEÑO DE DATOS, las TABLAS aún funcionan en HTML5.

Espero que esto ayude a alguien.

JRC
fuente
En primer lugar, HTML5 tiene soporte completo para <table>, es solo que la gente debe evitar usarlo para formato visual . Usarlo para mostrar datos estructurados es donde debe usarse , a menos que algo más (como <ul>, como un mero ejemplo) se ajuste mejor a la tarea. En segundo lugar, amigo, 4 mesas. Traes una pregunta interesante a la mesa (rowpan), pero tu respuesta clama por usarla en su <table>lugar. Tengo que ver cómo funciona mi solución aquí ...
F-3000
Editaría mi comentario anterior, pero el límite de tiempo llega. Al igual que con mi respuesta sobre colspan, Rowpan se puede lograr con MUCHO menos problemas que con su ... enfoque original. Véalo usted mismo .
F-3000
Gracias por tus comentarios. Nunca dije que HTML5 no admitiera tablas. Mucha gente simplemente busca evitarlo. A veces, cuando se escribe una aplicación web (a diferencia de una página de tipo publicitario), se necesita un diseño más fijo para la ubicación de los botones y / o controles.
JRC
0

Puede establecer la posición del contenido de colspan como "relativa" y la fila como "absoluta" de esta manera:

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

No puedes lograr esto en este momento.

AFAIK, esto estaría cubierto por CSS Tables , una especificación que parece estar actualmente en estado de "trabajo en progreso".

naXa
fuente
0

Puede probar esta solución, donde puede encontrar cómo aplicar colspan usando div https://codepen.io/pkachhia/pen/JyWMxY

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
fuente
-1

Incluso si esta es una pregunta antigua, me gustaría compartir mi solución a este problema.

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

Aquí hay un violín . No es realmente un lapso, y la solución es un poco complicada, pero es útil en algunas situaciones. Probado en Chrome 46, Firefox 31 e IE 11.

En mi caso, tuve que presentar algunos datos no tabulares de forma tabular, manteniendo el ancho de las columnas y dando título a las subsecciones de los datos.

Gabriel
fuente
Por supuesto, siempre puede confiar en una solución de cuadrícula como la de Bootstrap. En este caso particular, realmente necesitaba el ancho automático que ofrece display: table.
Gabriel
Además, si desea darle al contenido distribuido algo de color de fondo, deberá completar su tr con la cantidad total de tds :(
Gabriel
Terminé haciendo una tabla y redefiniendo mi concepto de "datos tabulares" ^^
Gabriel
-2

Utilice tablas anidadas para anidar los espacios de las columnas ...

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

O use 2 tablas donde el espacio de la columna cubra toda la fila ...

<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
fuente
2
La pregunta era cómo hacerlo usando CSS.
Enno Gröper
4
Lo siento, pero parece una muy mala idea.
Madara's Ghost