Foros del Web » Creando para Internet » HTML »

Tabla HTML con cabecera fija y scroll vertical y horizontal

Estas en el tema de Tabla HTML con cabecera fija y scroll vertical y horizontal en el foro de HTML en Foros del Web. Que tal!!! Hoy aprendí a fijar las cabeceras de una tabla de HTML. En el siguiente link encontrarán la solución: http://c-sharp-corner.blogspot.mx/2011/11/scrollable-html-table-with-fixed-header.html Lo interesante de este ...
  #1 (permalink)  
Antiguo 01/06/2012, 18:00
Avatar de khristian_696  
Fecha de Ingreso: agosto-2008
Mensajes: 27
Antigüedad: 15 años, 8 meses
Puntos: 4
Tabla HTML con cabecera fija y scroll vertical y horizontal

Que tal!!!
Hoy aprendí a fijar las cabeceras de una tabla de HTML.

En el siguiente link encontrarán la solución:
http://c-sharp-corner.blogspot.mx/2011/11/scrollable-html-table-with-fixed-header.html

Lo interesante de este código es que no interviene en tablas que ya tienen un estilo predefinido, y es muy útil cuando sólo nos falta agregar los scrolls.

Cabe mencionar que es necesario agregar los 3 divs que menciona el artículo para que funcione correctamente y en el 2° div es en donde irá la tabla.

Cualquier duda envíenme mensaje y con gusto responderé.
  #2 (permalink)  
Antiguo 01/06/2012, 20:14
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Tabla HTML con cabecera fija y scroll vertical y horizontal

Cita:
Iniciado por khristian_696
Hoy aprendí a fijar las cabeceras de una tabla de HTML.
¡Qué bien, khristian_696, te felicito!

De cualquier forma, ésa es una de las decenas de formas de mostrar alguna barra asociada a una tabla. En este Foro ya pusimos algunas más.

Por supuesto, la scrollbar no está en la tabla, ésta simplemente está metida en una caja que tiene las barras, pero la gracia está en la cabecera simulada que se mueve con un escript.

Lo que no llego a entender es lo de enviarte mensajes. ¿Qué vas a responder, si ya dejaste el enlace que encontraste? ¿O eres el autor y por eso te ofreces a explicar algo más del asunto?

En todo caso, no será "enviarte un mensaje para responder con gusto", sino postear en el tema actual para debatir sobre ese código.

Que me parece que tiene algún bug, o algo no del todo pulido. No entiendo qué son esos 16px. Espero que no presupongas (si eres el autor) que todas las barras de desplazamiento tienen 16px. Deben ser para otra cosa.

Saludos
furoya
  #3 (permalink)  
Antiguo 03/06/2012, 13:49
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Tabla HTML con cabecera fija y scroll vertical y horizontal

hace poco se preguntó como fijar la fila superior de una tabla, recuerdas furoya??

el código sobre el que hablamos me pareció algo engorroso así que me plateé como simular la posición fija. y la solución resultó mucho mas sencilla de lo que pensaba. se trata de posicionar los bloques relativamente y con javascript modificar su top o left. lo que implica 2 simples líneas de código javscript
Cita:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
#table-scroll {
width: 500px;
height: 100px;
overflow: auto;
}

table, td, th {
border: rgba(193, 193, 193, 0.48) 1px solid;
}


#fixedY{
position: relative;
top: 0;
z-index: 99;
background-color: red;
}


#fixedY table{
border-collapse: collapse;
width: 900px;
}


#fixedY table th, #fixedY table td {
width: 25%;
}


#fixedY table th {
background-color: red;
font: bold 15px Tahoma, Geneva, sans-serif;
color: rgb(255, 255, 255);
}


#cuerpoDatos {
width: 900px;
}

#cuerpoDatos > div{
float: left;
}


#cuerpoDatos > div#fixedX{
width: 25%;
position: relative;
left: 0;
z-index: 98;
background-color: yellow;
}

#cuerpoDatos > div#fixedX table{
border-collapse: collapse;
width: 100%;
}


#cuerpoDatos > div#nofixedX{
width: 75%;
}

#cuerpoDatos > div#nofixedX table{
border-collapse: collapse;
width: 100%;
}

#cuerpoDatos > div#nofixedX table td {
width: 33%;
}
</style>
<script type="text/javascript">
function fnc() {
document.getElementById('table-scroll').onscroll = function() {

document.getElementById('fixedY').style.top = document.getElementById('table-scroll').scrollTop + 'px';
document.getElementById('fixedX').style.left = document.getElementById('table-scroll').scrollLeft + 'px';

};
}

window.onload = fnc;
</script>
</head>
<body>

<div id="table-scroll">

<div id="fixedY">
<table>
<thead>
<tr>
<th>Lote</th><th>Producto 1</th><th>Producto 2</th><th>Producto 3</th>
</tr>
</thead>
</table>
</div>

<div id="cuerpoDatos">

<div id="fixedX">
<table>
<tbody>
<tr>
<td>Viaje 1</td>
</tr>
<tr>
<td>Viaje 2</td>
</tr>
<tr>
<td>Viaje 3</td>
</tr>
<tr>
<td>Viaje 4</td>
</tr>
<tr>
<td>Viaje 5</td>
</tr>
<tr>
<td>Viaje 6</td>
</tr>
<tr>
<td>Viaje 7</td>
</tr>
<tr>
<td>Viaje 8</td>
</tr>
<tr>
<td>Viaje 9</td>
</tr>
</tbody>
</table>
</div>

<div id="nofixedX">
<table>
<tbody>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
</tbody>
</table>
</div>

</div>

</div>

</body>
</html>
ahora el contra. en todos los navegadores, excepto ff, cuando se hace scroll arrastrando la barra, es un poco brusco. cuando se hace desde los "botones" no hay brusquedad
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #4 (permalink)  
Antiguo 03/06/2012, 16:55
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Tabla HTML con cabecera fija y scroll vertical y horizontal

Hola IsaBelM.

Qué mala costumbre tienes de resucitar ejemplos viejos para corregirlos.
Iba a hacer un paralelismo con el Dr. Victor Frankenstein, pero ahora que nos llevamos un poco mejor, no lo quiero arruinar y me lo guardo.

Vi el desplazamiento espasmódico que mencionaste. Y vi algún otro detalle, también.

No quiero volver a estudiar esos códigos porque me asusto. Que hayan sido muy populares en la web no significa que no fuesen un engendro para salir del apuro. Si aún circulan es porque asumieron la categoría de "código zombie", y los siguen usando a pesar de su obsolescencia. En aquellos años no teníamos los recursos de diseño que existen ahora.

Es cierto que el fijado de cabeceras se puede hacer medianamente fácil (y no te estoy quitando mérito para nada, al contrario, amo cuando le dan vueltas y más vueltas a un escript hasta exprimirle la última gota de sangre), pero si la memoria no me falla, en aquel tiempo la idea era simular el comportamiento de las tablas de planilla de cálculo. Y allí es donde aparecían los problemas.

Uno era fijar la celda superior izquierda, con el alto de su fila y el ancho de su columna.

Pongo una versión de tu código para que se entienda mejor.

Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
#table-scroll {
width: 500px;
height: 100px;
overflow: auto;
}

table, td, th {
border: rgba(193, 193, 193, 0.48) 1px solid;
}


#fixedY{
position: relative;
top: 0;
z-index: 99;
background-color: red;
}


#fixedY table{
border-collapse: collapse;
width: 900px;
}


#fixedY table th, #fixedY table td {
width: 25%;
}


#fixedY table th {
background-color: red;
font: bold 15px Tahoma, Geneva, sans-serif;
color: rgb(255, 255, 255);
}


#cuerpoDatos {
width: 900px;
overflow: hidden; 
}

#cuerpoDatos > div{
float: left;
}


#cuerpoDatos > div#fixedX{
width: 25%;
position: relative;
left: 0;
z-index: 98;
background-color: yellow;
}

#cuerpoDatos > div#fixedX table{
border-collapse: collapse;
width: 100%;
}


#cuerpoDatos > div#nofixedX{
width: 75%;
}

#cuerpoDatos > div#nofixedX table{
border-collapse: collapse;
width: 100%;
}

#cuerpoDatos > div#nofixedX table td {
width: 33%;
}

	#corner{
	font: bold 15px/120% Tahoma, Geneva, sans-serif;
	text-align: center; 
	border: orange 2px solid;
	background-color: orange; 
	position: fixed; 
	top: default; 
	margin-top: -1.5em; 
	z-index: 2147483647; 
	}

</style>
<script type="text/javascript">
function fnc() {
document.getElementById('table-scroll').onscroll = function() {

document.getElementById('fixedY').style.top = document.getElementById('table-scroll').scrollTop + 'px';
document.getElementById('fixedX').style.left = document.getElementById('table-scroll').scrollLeft + 'px';

};
	document.getElementById('corner').style.width = document.getElementById('fixedX').offsetWidth -4 + "px";
}

window.onload = fnc;
</script>
</head>
<body>

<div id="table-scroll">

<div id="fixedY">
<table>
<thead>
<tr>
<th>Lote</th><th>Producto 1</th><th>Producto 2</th><th>Producto 3</th>
</tr>
</thead>
</table>
</div>

<div id="cuerpoDatos">
	<div id="corner"> ☺ </div>

<div id="fixedX">
<table>
<tbody>
<tr>
<td>Viaje 1</td>
</tr>
<tr>
<td>Viaje 2</td>
</tr>
<tr>
<td>Viaje 3</td>
</tr>
<tr>
<td>Viaje 4</td>
</tr>
<tr>
<td>Viaje 5</td>
</tr>
<tr>
<td>Viaje 6</td>
</tr>
<tr>
<td>Viaje 7</td>
</tr>
<tr>
<td>Viaje 8</td>
</tr>
<tr>
<td>Viaje 9</td>
</tr>
</tbody>
</table>
</div>

<div id="nofixedX">
<table>
<tbody>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
<tr>
<td>moto</td><td>avión</td><td>barco</td>
</tr>
</tbody>
</table>
</div>

</div>

</div>

</body>
</html>
Aquí es fácil anclar la celda, porque está tiesa para cualquier movimiento.
Si se fijan como cabecera de filas o columnas, tampoco es tan difícil, pero clavar las cabezas de filas y también de columnas, ya se complica. Usando fixed una de las dos va a terminar decapitada por el scroll.

Otro inconveniente que estamos disimulando es el ajuste de tamaño de cada celda. En una tabla real es automático, y tiene que ver con el tamaño del contenido.
Si usamos clones de los anchos de cada celda de la fila para la cabecera superior, y de las alturas de cada celda de la columna para la cabecera izquierda, ya hay que darles una medida fija para todas; o encadenarlas con JS, cada una con su "hermana".
Si por culpa de los contenidos una columna tiene un ancho, y su cabecera falsa termina con otro, la continuidad del tamaño deja de ser un clon y pasa a ser el gemelo maldito.

Claro que eso de darles un tamaño fijo obliga a ser generosos con las medidas, para que el contenido no quede apretado o mutilado. Si no usamos javascript, quedamos entre la Espada y la Pared, o entre la Cruz y el Agua Bendita, o entre la Dama de Clavos y el Lecho de Procusto.

Si bien el escript de desplazamiento se puede optimizar para que los bloques se deslicen suave como una navaja bien afilada, esa sería la menor de las complicaciones. El resto de los ajustes requieren algo más de 2 líneas de JS.



Y no estás haciendo más que tirarme cadáveres que ya dejé en el sótano hace mucho tiempo. Si los señalo en algún post, es sólo para que los novatos los diseccionen y vean cómo se resolvió un problema en algún momento. Tampoco para que copien y peguen. Porque reconozcamos que en la mayoría de los casos más que una disección es una autopsia.

Tampoco quiero que pienses que me molesta que revuelvas mi pasado. Al contrario, es un honor si destripas y reconstruyes mis códigos a tu gusto. Pero diviértete sola; a mí no me persigas con estos viejos fantasmas que ya no sé cómo manejar. Tú tendrás un don natural para interpretarlos, pero yo tengo que ponerme con mi única neurona operativa a desanudar la construcción de algo que hice cuando mi mente estaba (aunque sea un poco) más fresca.

Cada vez que me veo obligado por las circunstancias a repasar o recontruir uno de esos códigos, termino desnudo aullándole a la Lu...






¡No! ¡Ahí me fui al c*****o! ¡A partir de mañana me dedico a escribir el horóscopo de las revistas de adolescentes y le dejo el macabrismo a los que saben!

¡Qué tanto...!





P.D. : "2 simples líneas" ... cómo te quiero. ¦-\
  #5 (permalink)  
Antiguo 06/06/2012, 16:21
Avatar de khristian_696  
Fecha de Ingreso: agosto-2008
Mensajes: 27
Antigüedad: 15 años, 8 meses
Puntos: 4
Respuesta: Tabla HTML con cabecera fija y scroll vertical y horizontal

Cita:
Iniciado por furoya Ver Mensaje
¡Qué bien, khristian_696, te felicito!

De cualquier forma, ésa es una de las decenas de formas de mostrar alguna barra asociada a una tabla. En este Foro ya pusimos algunas más.
Gracias por tus comentarios furoya... te comento que yo no soy el autor de este artículo, sin embargo a mi me parece una buena solución ya que me rompí la cabeza intentando una y otra solución, ya que en algunas como lo comentas más abajo, el cabecero queda de un ancho y el cuerpo de otro lo que hace que se vea horrible.. en otras, los estilos que debia utilizar para hacer el efecto del cabecero fijo afectaban al estilo que ya había dado a mi tabla y otras no hacían absolutamente nada!!, por lo que se me hizo una excelente manera de solucionar este problema, y como lo comento, sobre todo cuando ya tenemos la tabla definida con un estilo en particular. En cuanto a los mensajes es porque esto ya lo he implementado, aunque tuve que entender bien cual era el funcionamiento ya que no soy un experto en estos temas, por lo mismo me ofrecí para dar información si alguien leía este artículo y no lograba implementarlo.

Última edición por khristian_696; 06/06/2012 a las 16:29
  #6 (permalink)  
Antiguo 06/06/2012, 16:48
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Tabla HTML con cabecera fija y scroll vertical y horizontal

De nada, khristian_696, aprovecho el mensaje para agradecerte a tí la valoración. Como verás, en este Foro tenemos algo de sentido del humor (OK, el mío es muy malo), y hay gente que no se adapta a que le "arruinen" el tema. Me alegra que tú lo hayas entendido. (IsaBelM seguro se ofendió, y por eso no me contesta)

Recién preguntaron sobre el mismo asunto. Creo que es un tema recurrente. Si tienes un momento, date una vuelta por

scrollbar en tabla html

Algo más vas a sacarle.

Saludos
furoya.

Etiquetas: fija, horizontal, link, scroll, tabla, vertical, cabeceras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:36.