HTML colspan en CSS

251

Estoy tratando de construir un diseño similar al siguiente:

+---+---+---+
|   |   |   |
+---+---+---+
|           |
+-----------+

donde la parte inferior está llenando el espacio de la fila superior.

Si se tratara de una tabla real, podría lograrlo fácilmente <td colspan="3">, pero como simplemente estoy creando un diseño similar a una tabla , no puedo usar <table>etiquetas. ¿Es esto posible usando CSS?

Torre
fuente
8
La mejor solución realmente depende de lo que esté pasando en la mesa. Si se trata de datos (algo que pertenece a una tabla), use una tabla. Si está utilizando una tabla para controlar el diseño de la página, entonces una de las soluciones HTML + CSS a continuación es mejor.
mwcz
Agregue marcado para ambos casos, luego muestre solo uno a la vez usando una clase CSS de consulta de medios.
DigitalDesignDj
2
Olvídate de CSS. Si muestra datos tabulares, seguramente sabrá cuántas columnas abarcaría. Utilice el colspanatributo
Tihomir Mitkov
Lo haría mediante bootstrap o cuadrícula personalizada desde bootstrap
Arun Prasad ES
Si usa CSS3, puede usar columnSpan. A diferencia de <td colspan = "#">, no tiene la opción de establecer el número de columnas, pero puede abarcar todas las columnas. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

Respuestas:

407

No hay un análogo CSS simple y elegante para colspan .

Las búsquedas sobre este mismo tema arrojarán una variedad de soluciones que incluyen un conjunto de alternativas, que incluyen posicionamiento absoluto, dimensionamiento, junto con una variedad similar de advertencias específicas del navegador y las circunstancias. Lea y tome la mejor decisión informada que pueda según lo que encuentre.

David
fuente
10
Las tablas son elementos estructurales y solo porque el uso de colspan cambie su apariencia no significa que no lo sea. CSS se usa para diseñar elementos y no cambiar la estructura. El W3C analiza la estructura de la tabla aquí: w3.org/TR/html401/struct/tables.html#h-11.2
Rob el
88
Rob, comprende tu posición, pero mira las recomendaciones del W3C, específicamente relacionadas con el paradigma de la tabla completa, y encontrarás que parte de su consideración fue, sin duda, la presentación de las tablas. Esta idea de que las tablas fueron concebidas puramente como estructura es una ficción contemporánea, creo que sería mejor que todos dejáramos de difundirnos. El punto es que debemos dejar de ser dogmáticos sobre las tablas. Sería un error para mí decir que siempre son presentaciones, y es tan incorrecto para ti decir que siempre son estructuradas. La realidad simplemente no es tan corta y seca.
David
44
Parece que tu respuesta es la respuesta popular. :) Estoy feliz de saber que el dogma anti-mesa (que he comprado) es demasiado estricto. Respaldo mi respuesta solo en la medida en que sigo pensando que colspanes la herramienta adecuada para el trabajo. Mi respuesta fue 75% correcta, y la suya es 100% correcta. Deberías volver a SO.
mwcz
71
Después de 2 años, busqué en Google esto y quería votar al autor, pero decía "no puedo votar por tu propia publicación" y me di cuenta de que era yo, jajaja. Decidí cambiar la solución aceptada a esta ya que siento que tiene mejor información.
Torre
14
Este es un mini ensayo sobre alguna otra respuesta (no especificada), no una respuesta a la pregunta formulada.
Jukka K. Korpela
56

Hasta donde yo sé, no hay colspan en css, pero habrá un column-spandiseño de varias columnas en un futuro próximo, pero dado que es solo un borrador en CSS3, puede verificarlo aquí . De todos modos, puede hacer una solución usando divyspan con una pantalla similar a una tabla como esta.

Este sería el HTML:

<div class="table">
  <div class="row">
    <span class="cell red first"></span>
    <span class="cell blue fill"></span>
    <span class="cell green last"></span>
  </div>
</div>
<div class="table">
  <div class="row">
    <span class="cell black"></span>
  </div>
</div>

Y este sería el css:

  /* this is to reproduce table-like structure
     for the sake of table-less layout. */
  .table { display:table; table-layout:fixed; width:100px; }
  .row { display:table-row; height:10px; }
  .cell { display:table-cell; }

  /* this is where the colspan tricks works. */
  span { width:100%; }

  /* below is for visual recognition test purposes only. */
  .red { background:red; }
  .blue { background:blue; }
  .green { background:green; }
  .black { background:black; }

  /* this is the benefit of using table display, it is able 
     to set the width of it's child object to fill the rest of 
     the parent width as in table */
  .first { width: 20px; }
  .last { width: 30px; }
  .fill { width: 100%; }

La única razón para usar este truco es obtener el beneficio de table-layout comportamiento, lo uso mucho si solo establecer div y ancho de tramo en cierto porcentaje no cumplió con nuestros requisitos de diseño.

Pero si no necesita beneficiarse del table-layoutcomportamiento, entonces la respuesta de durilai sería suficiente para usted.

Hendra Uzia
fuente
44
Sí, pero una pequeña solución: en lugar de .span { ...eso debería ser span { ....
Slavik Meltser
2
Usar divetiquetas para mostrar datos tabulares es tan malo como usar tables para controlar el diseño de página
Tihomir Mitkov
1
@TichomirMitkov depende de si está utilizando o no un diseño receptivo para cambiar el diseño, en cuyo caso a veces esto puede funcionar bastante bien.
Simon_Weaver
44
Esto realmente no responde la pregunta, ya que esencialmente tiene dos tablas una tras otra en el ejemplo que dio. (Ietwo divs con la clase "table")
Invierno
21

Otra sugerencia es usar flexbox en lugar de tablas por completo. Esto es algo del "navegador moderno", por supuesto, pero vamos, es 2016;)

Al menos, esta podría ser una solución alternativa para aquellos que buscan una respuesta a esto hoy en día, ya que la publicación original era de 2010.

Aquí hay una gran guía: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

.table {
  border: 1px solid red;
  padding: 2px;
  max-width: 300px;
  display: flex;
  flex-flow: row wrap;
}
.table-cell {
  border: 1px solid blue;
  flex: 1 30%;
}
.colspan-3 {
  border: 1px solid green;
  flex: 1 100%;
}
<div class="table">
  <div class="table-cell">
    row 1 - cell 1
  </div>
  <div class="table-cell">
    row 1 - cell 2
  </div>
  <div class="table-cell">
    row 1 - cell 3
  </div>
  <div class="table-cell colspan-3">
    row 2 - cell 1 (spans 3 columns)
  </div>
</div>

Invierno
fuente
8
<div style="width: 100%;">
    <div style="float: left; width: 33%;">Row 1 - Cell 1</div>
    <div style="float: left; width: 34%;">Row 1 - Cell 2</div>
    <div style="float: left; width: 33%;">Row 1 - Cell 3</div>
</div>
<div style="clear: left; width: 100%;">
Row 2 - Cell 1
</div>
Dustin Laine
fuente
No puedo saber el ancho de las celdas.
Torre
1
Entonces no pongas un ancho. No debería importar Pero si quieres que abarquen el mismo ancho, entonces los dos divs principales deben tener el mismo ancho.
Dustin Laine
1
Puede usar ancho: calc (100% / 3), que será un poco mejor que darle al medio 1% más
ii iml0sto1
5

Eso no es parte del alcance de CSS. colspandescribe la estructura del contenido de la página o da algún significado a los datos de la tabla, que es el trabajo de HTML.

mwcz
fuente
OP menciona explícitamente "crear un diseño tipo tabla ", sin significado estructural. ¿No es el propósito de las tablas CSS? No hay ninguna razón objetiva para el tratamiento de la propiedad colspan diferente que toda la tabla, si hay un elemento de la tabla CSS-único diseño, ¿por qué no una propiedad única de diseño en CSS colspan ...
Skippy le Grand Gourou
2
Mira la respuesta más votada a esta pregunta. Su sentimiento ya se discutió allí y me inclino a estar de acuerdo con él. Mi opinión sobre el tema definitivamente ha cambiado en los cinco años desde que escribí esta respuesta.
mwcz
4

Para proporcionar una respuesta actualizada: La mejor manera de hacer esto hoy es usar un diseño de cuadrícula CSS como este:

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: auto;
  grid-template-areas: 
    "top-left top-middle top-right"
    "bottom bottom bottom"
}

.item-a {
  grid-area: top-left;
}
.item-b {
  grid-area: top-middle;
}
.item-c {
  grid-area: top-right;
}
.item-d {
  grid-area: bottom;
}

y el HTML

<div class="item-a">1</div>
<div class="item-b">2</div>
<div class="item-c">3</div>
<div class="item-d">123</div>
Toby 1 Kenobi
fuente
3

Podría intentar usar un sistema de cuadrícula como http://960.gs/

Su código sería algo como esto, suponiendo que esté utilizando un diseño de "12 columnas":

<div class="container_12">
<div class="grid_4">1</div><div class="grid_4">2</div><div class="grid_4">3</div>
<div class="clear"></div>
<div class="grid_12">123</div>
</div>
Jeff
fuente
3

Intente agregar display: table-cell; width: 1%;a su elemento de celda de tabla.

Ismail Farooq
fuente
¿Cómo va a ayudar eso? El concepto fundamental de una tabla es que cada fila tiene celdas idénticas. Si una de las filas tiene una celda que implementa con éxito "ancho: 1%", entonces todas las filas tendrán esa columna como "ancho: 1%". El punto de "colspan" es tomar 2 (o más) de las columnas de ancho fijo y combinarlas para obtener un ancho combinado.
IAM_AL_X
3

He tenido cierto éxito, aunque depende de algunas propiedades para funcionar:

table-layout: fixed border-collapse: separate

y 'anchos' de celda que se dividen / abarcan fácilmente, es decir, 4 x celdas de 25% de ancho:

.div-table-cell,
* {
  box-sizing: border-box;
}

.div-table {
  display: table;
  border: solid 1px #ccc;
  border-left: none;
  border-bottom: none;
  table-layout: fixed;
  margin: 10px auto;
  width: 50%;
  border-collapse: separate;
  background: #eee;
}

.div-table-row {
  display: table-row;
}

.div-table-cell {
  display: table-cell;
  padding: 15px;
  border-left: solid 1px #ccc;
  border-bottom: solid 1px #ccc;
  text-align: center;
  background: #ddd;
}

.colspan-3 {
  width: 300%;
  display: table;
  background: #eee;
}

.row-1 .div-table-cell:before {
  content: "row 1: ";
}

.row-2 .div-table-cell:before {
  content: "row 2: ";
}

.row-3 .div-table-cell:before {
  content: "row 3: ";
  font-weight: bold;
}

.div-table-row-at-the-top {
  display: table-header-group;
}
<div class="div-table">

  <div class="div-table-row row-1">

    <div class="div-table-cell">Cell 1</div>
    <div class="div-table-cell">Cell 2</div>
    <div class="div-table-cell">Cell 3</div>

  </div>

  <div class="div-table-row row-2">

    <div class="div-table-cell colspan-3">
      Cor blimey he's only gone and done it.
    </div>

  </div>

  <div class="div-table-row row-3">

    <div class="div-table-cell">Cell 1</div>
    <div class="div-table-cell">Cell 2</div>
    <div class="div-table-cell">Cell 3</div>

  </div>

</div>

https://jsfiddle.net/sfjw26rb/2/

Además, aplicar display: table-header-group o table-footer-group es una forma práctica de saltar elementos de 'fila' a la parte superior / inferior de la 'tabla'.

usuario3464561
fuente
0

si usa div y span ocupará más tamaño de código cuando la fila de la tabla de cuadrícula de datos tenga más volumen. El siguiente código está marcado en todos los navegadores

HTML:

<div id="gridheading">
<h4>Sl.No</h4><h4 class="big">Name</h4><h4>Location</h4><h4>column</h4><h4>column</h4><h4>column</h4><h4>Amount(Rs)</h4><h4>View</h4><h4>Edit</h4><h4>Delete</h4> 
</div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>

CSS:

#gridheading {
    background: #ccc;
    border-bottom: 1px dotted #BBBBBB;
    font-size: 12px;
    line-height: 30px;
    text-transform: capitalize;
}
.data {
    border-bottom: 1px dotted #BBBBBB;
    display: block;
    font-weight: normal;
    line-height: 20px;
    text-align: left;
    word-wrap: break-word;
}
 h4 {
    border-right: thin dotted #000000;
    display: table-cell;
    margin-right: 100px;
    text-align: center;
    width: 100px;
    word-wrap: break-word;
}
.data .big {
    margin-right: 150px;
    width: 200px;
}
Diseñador web cum Promotor
fuente
0
column-span: all; /* W3C */
-webkit-column-span: all; /* Safari & Chrome */
-moz-column-span: all; /* Firefox */
-ms-column-span: all; /* Internet Explorer */
-o-column-span: all; /* Opera */

http://www.quackit.com/css/css3/properties/css_column-span.cfm

Adam Hunter Peck
fuente
no hay suficiente soporte ... IE8 sigue siendo un problema persistente para la evolución
beauXjames
99
OP quiere tener una table-cellextensión de varias columnas de la tabla. column-spanes para controlar un diseño de columna. Lo que le permite pasar el texto por varias columnas, como lo hacen los periódicos.
Chris Wesseling
1
De hecho, si bien esto sería realmente bueno para usar en la pantalla: table-cell; elementos, solo se aplica a columnas css: jsfiddle.net/mk0rrLc3/1
Mark
@ Mark-- column-span se usa con la propiedad de conteo de columnas definida en el padre. No es necesario cambiar el tipo de visualización. Además, column-span solo puede aceptar 1 o todo como valor, no permite el fraccionamiento, por lo tanto, "column-span: 2", como se ve en su violín, no es un uso válido de la propiedad.
MistyDawn
0

Si vienes aquí porque tienes que activar o desactivar el colspanatributo (por ejemplo, para un diseño móvil):

Duplique los <td>s y solo muestre los que tengan el deseado colspan:

table.colspan--on td.single {
  display: none;
}

table.colspan--off td.both {
  display: none;
}
<!-- simple table -->
<table class="colspan--on">
  <thead>
    <th>col 1</th>
    <th>col 2</th>
  </thead>
  <tbody>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
    <tr>
      <!-- the <td> spanning both columns -->
      <td class="both" colspan="2">both</td>

      <!-- the two single-column <td>s -->
      <td class="single">A</td>
      <td class="single">B</td>
    </tr>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
  </tbody>
</table>
<!--
that's all
-->

 

<!--
stuff only needed for making this interactive example looking good:
-->
<br><br>
<button onclick="toggle()">Toggle colspan</button>
<script>/*toggle classes*/var tableClasses = document.querySelector('table').classList;
function toggle() {
  tableClasses.toggle('colspan--on');
  tableClasses.toggle('colspan--off');
}
</script>
<style>/* some not-needed styles to make this example more appealing */
td {text-align: center;}
table, td, th {border-collapse: collapse; border: 1px solid black;}</style>

luckydonald
fuente
0

Las propiedades CSS "column-count", "column-gap" y "column-span" pueden hacer esto de una manera que mantenga todas las columnas de la pseudo-tabla dentro del mismo contenedor (HTML se mantiene agradable y ordenado).

Las únicas advertencias son que solo puede definir 1 columna o todas las columnas, y el intervalo de columnas aún no funciona en Firefox, por lo que es necesario un poco de CSS adicional para garantizar que se muestre correctamente. https://www.w3schools.com/css/css3_multiple_columns.asp

.split-me {
  -webkit-column-count: 3;
  -webkit-column-gap: 0;
  -moz-column-count: 3;
  -moz-column-gap: 0;
  column-count: 3;
  column-gap: 0;
}

.cols {
  /* column-span is 1 by default */
  column-span: 1;
}

div.three-span {
  column-span: all !important;
}

/* alternate style for column-span in Firefox */
@-moz-document url-prefix(){
  .three-span {
    position: absolute;
    left: 8px;
    right: 8px;
    top: auto;
    width: auto;
  }
}


    
<p>The column width stays fully dynamic, just like flex-box, evenly scaling on resize.</p>

<div class='split-me'>
  <div class='col-1 cols'>Text inside Column 1 div.</div>
  <div class='col-2 cols'>Text inside Column 2 div.</div>
  <div class='col-3 cols'>Text inside Column 3 div.</div>
  <div class='three-span'>Text div spanning 3 columns.</div>
</div>



  <style>
/* Non-Essential Visual Styles */

html * { font-size: 12pt; font-family: Arial; text-align: center; }
.split-me>* { padding: 5px; } 
.cols { border: 2px dashed black; border-left: none; }
.col-1 { background-color: #ddffff; border-left: 2px dashed black; }
.col-2 { background-color: #ffddff; }
.col-3 { background-color: #ffffdd; }
.three-span {
  border: 2px dashed black; border-top: none;
  text-align: center; background-color: #ddffdd;
}
  </style>

MistyDawn
fuente
0

Vine aquí porque actualmente el bloque de tabla de WordPress no admite el parámetro colspan y pensé que lo reemplazaría usando CSS. Esta fue mi solución, suponiendo que las columnas son del mismo ancho:

table {
  width: 100%;
}

table td {
  width: 50%;
  background: #dbdbdb;
  text-align: center;
}

table tr:nth-child(2n+1) {
  position:relative;
  display:block;
  height:20px;
  background:green;
}

table tr:nth-child(2n+1) td {
  position:absolute;
  left:0;
  right:-100%;
  width: auto;
  top:0;
  bottom:0;
  background:red;
  text-align:center;
}
<table>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
</table>

passatgt
fuente
-1

Siempre podías position:absolute;cosas y especificar anchos. No es una forma muy fluida de hacerlo, pero funcionaría.

doubleJ
fuente
Hay muchas más formas de lograr esto que usar un marcado incorrecto. El posicionamiento absoluto para forzar un diseño siempre se ha considerado una mala práctica.
MistyDawn
-1

He creado este violín:

ingrese la descripción de la imagen aquí

http://jsfiddle.net/wo40ev18/3/

HTML

<div id="table">
<div class="caption">
    Center Caption
</div>
<div class="group">
      <div class="row">
            <div class="cell">Link 1t</div>
            <div class="cell"></div>
          <div class="cell"></div>
          <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell ">Link 2</div>
      </div>
</div>

CSS

   #table {
    display:table;
}

.group {display: table-row-group; }

.row {
    display:table-row;
    height: 80px;
    line-height: 80px;
}

.cell {
    display:table-cell;
    width:1%;
    text-align: center;
    border:1px solid grey;
    height: 80px
        line-height: 80px;
}

.caption {
    border:1px solid red; caption-side: top; display: table-caption; text-align: center; 
    position: relative;
    top: 80px;
    height: 80px;
      height: 80px;
    line-height: 80px;

}
Layke
fuente
1
Pero creo que la cuadrícula de arranque puede hacerlo muy fácilmente
Arun Prasad ES
Esto no proporciona la solución que estaba buscando el autor de la pregunta. Simplemente crea una fila de celdas en línea.
MistyDawn
-1

Las clases de Media Query se pueden usar para lograr algo aceptable con marcado duplicado. Aquí está mi enfoque con bootstrap:

  <tr class="total">
    <td colspan="1" class="visible-xs"></td>
    <td colspan="5" class="hidden-xs"></td>
    <td class="focus">Total</td>
    <td class="focus" colspan="2"><%= number_to_currency @cart.total %></td>
  </tr>

colspan 1 para dispositivos móviles, colspan 5 para otros con CSS haciendo el trabajo.

DigitalDesignDj
fuente
El autor de la pregunta declaró específicamente que no podía usar elementos HTML <table>. Si pudiera, este sería un problema fácil de resolver.
MistyDawn