2012-07-16 32 views
8

Estoy tratando de crear un calendario personalizado en HTML y Javascript donde pueda arrastrar y soltar tareas de un día para otro. Me gustaría tener la primera columna y las dos últimas columnas como ancho fijo y tener las columnas restantes (de lunes a viernes) fluidas para que la tabla siempre llene el 100% de su matriz.Tabla HTML - tabla de 100% de ancho, combinación de ancho fijo y columnas de fluido UNIFORM

El problema que estoy teniendo es que las TD fluidas se dimensionan automáticamente en función de la cantidad de contenido que contienen, lo que significa que cuando arrastro una tarea de un día a otro el ancho de las columnas cambia de tamaño. Me gustaría tener de lunes a viernes el mismo tamaño independientemente del contenido y sin configurar el desbordamiento de texto: oculto; (como las tareas siempre deben estar visibles)

es decir, quiero que las columnas grises tengan un ancho fijo y las columnas rojas fluidas pero uniformes entre sí, independientemente del contenido que contengan.

Editar: estoy usando jQuery para la funcionalidad de arrastrar y soltar lo que una solución JavaScript también estaría bien (aunque no es preferible).

JSFiddle Live example

HTML:

<table> 
    <tr> 
    <th class="row_header">Row Header</th> 
    <th class="fluid">Mon</th> 
    <th class="fluid">Tue</th> 
    <th class="fluid">Wed</th> 
    <th class="fluid">Thurs</th> 
    <th class="fluid">Fri</th> 
    <th class="weekend">Sat</th> 
    <th class="weekend">Sun</th> 
    </tr> 
    <tr> 
    <td>Before Lunch</td> 
    <td>This col will be wider than the others because it has lots of content...</td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td>But I would really like them to always be the same size!</td> 
    <td></td> 
    <td></td> 
    </tr> 
</table> 

CSS:

table { 
     width: 100%; 
    }  

    td, th { 
     border:1px solid black; 
    } 

    th { 
     font-weight:bold;    
     background:red; 
    } 

    .row_header { 
     width:50px; 
     background:#ccc; 
    } 

    .weekend { 
     width:100px; 
     background:#ccc; 
    } 

    .fluid { 
     ??? 
    } 
+1

Muy buena pregunta. No estoy seguro de que se pueda hacer con CSS puro. Probablemente necesites utilizar JavaScript para calcular el ancho total de la tabla y aplicar estilos en consecuencia. –

Respuesta

2

Usando jQuery (probablemente podría hacerse con JS regulares también, pero yo prefiero que para este tipo de puestos de trabajo):

(Nota: Me di la mesa de una identificación por lo que será más fácil para seleccionar , se puede hacer sin que con un poco de bricolaje)

$(function() { 
     var $my_table = $("#my_table") 
      ,current_width = $my_table.width() 
      ,fluid_columns = $("table .fluid") 
      ,spread_width = (current_width - 150)/fluid_columns.length; 

     fluid_columns.width(spread_width); 

     $(window).on("resize", function() { 
      current_width = $my_table.width(); 
      spread_width = (current_width - 150)/fluid_columns.length; 
      fluid_columns.width(spread_width); 
     }) 
    }); 
+0

Sí, eso nos acerca bastante. Lamentablemente, en resoluciones muy pequeñas, aún se rompe. Quizás deba darme cuenta de que el navegador intenta ayudarme y poner un ancho medio en la sección de la tabla para evitar el ejemplo extremo. – Danny

+0

Sí, un ancho mínimo funcionaría para usted. –

1

Podría usted hacer:

.fluid { 
    width:10%; 
} 
+0

Eso no parece funcionar para mí. El ancho en .row_header y .weekend parece ser ignorado y en resoluciones pequeñas aún no tiene el mismo tamaño que el ancho de las columnas [Sample Here] (http://i.imgur.com/gVZvV.png) – Danny

+0

¿podría hacer consultas sobre medios, y luego cambiar el porcentaje de forma apropiada? – ColWhi

+0

¿Cómo ayudaría eso? ¿Puedes darme un ejemplo? – Danny

10

Danny,

creo que esto es lo que busca.

violín aquí http://jsfiddle.net/T6YNK/22/

A cuadros en Chrome.

Código

   <table> 
     <tr> 
     <th class="row_header">Row Header</th> 
     <th class="fluid">Mon</th> 
     <th class="fluid">Tue</th> 
     <th class="fluid">Wed</th> 
     <th class="fluid">Thurs</th> 
     <th class="fluid">Fri</th> 
     <th class="weekend">Sat</th> 
     <th class="weekend">Sun</th> 
     </tr> 
     <tr> 
     <td>Before Lunch</td> 
     <td>This col will be wider than the others because it has lots of content...</td> 
     <td></td> 
     <td></td> 
     <td></td> 
     <td>But I would really like them to always be the same size!</td> 
     <td>&nbsp;</td> 
     <td>&nbsp;</td> 
     </tr> 
    </table> 

    <style type="text/css"> 

     table { 
      width: 100%; 
     }   

     td, th { 
      border:1px solid black; 
     } 

     th { 
      font-weight:bold;    
      background:red; 
     } 

     .row_header { 
      width:50px; 
      background:#ccc; 
     } 

     .weekend { 
      width:100px; 
      background:#ccc; 
     } 

     td, 
     th  { 
      overflow:hidden; 
     } 
    .fluid { 

} 
.weekend, 
.row_header{ 
width:50px !important; 

} 

table{ 
    border: 1px solid black; 
    table-layout: fixed; 
    width:100%; 

} 
    </style>​ 
+1

La mejor respuesta, usando solo CSS y no jQuery. –

Cuestiones relacionadas