¿Alguien sabe por qué los elementos de entrada con un ancho del 100% pasan por encima del borde de las celdas de la tabla?
En el ejemplo simple a continuación, el cuadro de entrada pasa sobre el borde de las celdas de la tabla, el resultado es horrible. Esto fue probado y sucede de la misma manera en: Firefox, IE7 y Safari.
¿Tiene sentido para ti? ¿Me estoy perdiendo algo? ¿Conoce una posible solución?
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <!-- don't use closing slash in meta tag, it breaks HTML4.01 transitional -->
<title>Test input text in table</title>
<style type="text/css">
table {border-top: 1px solid #ff0000; border-left: 1px solid #ff0000;}
table td {border-right: 1px solid #00ff00; border-bottom: 1px solid #00ff00;}
input[type="text"] {width: 100%;} /* removing this would make input not to go over cells border, but they would be too short, I want them to fit cells size */
</style>
</head><body>
<table cellpadding="0" cellspacing="0">
<tr>
<td><p>column one hello babe babe babe</p></td>
<td><p>column two hello babe more</p></td>
<td><p>column three hello babe more and more</p></td>
</tr>
<tr>
<td><input type="text" value="test"></td>
<td><input type="text" value="test"></td>
<td><input type="text" value="test"></td>
</tr>
</table>
</body></html>
html
input
html-table
width
Marco Demaio
fuente
fuente
form
conlabel
s yinput
s dentro de aul
ool
. que es, al menos un poco más semántico. Ciertamente, sin embargo, debería usar unform
, incluso si se queda con eltable
.Respuestas:
Puede usar la
box-sizing
propiedad CSS3 para incluir el relleno y el borde externos:fuente
<!--[if lt IE 8]>
yinput[type="text"] {width:95%}
El valor de ancho no tiene en cuenta el borde o el relleno:
http://www.htmldog.com/reference/cssproperties/width/
Obtienes 2 px de relleno en cada lado, más 1 px de borde en cada lado.
100% + 2 * (2px + 1px) = 100% + 6px, que es más que el 100% de contenido infantil que tiene el padre td.
Tienes la opción de:
box-sizing: border-box;
según la respuesta de @ pricco ;fuente
text-indent
para simular el relleno delante del borde de entrada del texto yline-height
para el relleno vertical (aunque conservar el relleno vertical no afectaría el ancho de todos modos).El problema con este tipo de cosas
width:95%;
es que no se ven bien en diseños amplios y flexibles (porque el 5% puede ser como 30 píxeles).Las siguientes soluciones funcionan muy bien para mí (probadas en Firefox, IE 9, Safari):
(agregó los colores para que sea más fácil notar el relleno correcto)
El truco consiste en envolver la entrada con dos divs, el exterior tiene un margen de 3px (lo que lo hace 3px más pequeño que el td), el interior tiene un relleno de 3px. Esto hace que la entrada sea 6px más pequeña que el td, que es con lo que quería comenzar.
No estoy seguro de la mecánica de esto, pero funciona.
En este ejemplo simple, también funciona con un solo div con margen derecho 6. Sin embargo, en el caso de mi aplicación web, solo funciona la solución anterior.
fuente
El problema se ha explicado anteriormente, así que solo reiteraré: el ancho no tiene en cuenta el borde y el relleno. Una posible respuesta a esto que no se discutió, pero que descubrí que me ayudó mucho, es envolver sus entradas. Aquí está el código y explicaré cómo esto ayuda en un segundo:
El DIV que envuelve la ENTRADA no tiene relleno ni tiene borde. Esta es la solucion. Un DIV se expandirá al tamaño de su contenedor, pero también respetará el borde y el relleno. Ahora, INPUT no tendrá problemas para expandirse al tamaño de su contenedor, ya que no tiene bordes ni almohadilla. También tenga en cuenta que el DIV tiene su desbordamiento configurado como oculto. Parece que, de forma predeterminada, los elementos pueden caer fuera de su contenedor con el desbordamiento predeterminado de visible. Esto solo asegura que la entrada permanezca dentro de su contenedor y no intente penetrar.
Probé esto en Chrome y en Fire Fox. Ambos parecen respetar bien esta solución.
ACTUALIZACIÓN : Ya que acabo de recibir un voto negativo al azar, me gustaría decir que una mejor manera de lidiar con el desbordamiento es con el atributo de tamaño de caja CSS3 como lo describe pricco:
Esto parece estar bastante bien soportado por los principales navegadores y no es "hacky" como el truco de desbordamiento. Sin embargo, existen algunos problemas menores en los navegadores actuales con este enfoque (consulte http://caniuse.com/#search=box-sizing Problemas conocidos).
fuente
overflow: hidden;
el contenido todavía 'asoma' hacia el exterior de la caja exactamente de la misma manera, pero se trunca en lugar de mostrarse, por lo que no se superpone a otro contenido.Sé que esta pregunta tiene 3 años, pero el problema persiste para los navegadores actuales y la gente sigue viniendo aquí. La solución por ahora es calc () :
Es compatible con la mayoría de los navegadores modernos.
fuente
El problema se debe al modelo de caja de elementos de entrada. Recientemente encontré una buena solución al problema al intentar mantener mi entrada al 100% para dispositivos móviles.
Envuelva su entrada con otro elemento, un div por ejemplo. Luego aplique el estilo que desee para su entrada al envoltorio div. Por ejemplo:
Proporcione .input-wrapper relleno de esquinas redondeadas, etc., lo que desee para su entrada, luego proporcione el ancho de entrada 100%. ¡Tiene su entrada bien acolchada con un borde, etc. pero sin el molesto desbordamiento!
fuente
Solucioné este problema comenzando con la respuesta de @ hallodom. Todas mis entradas estaban contenidas dentro de li, por lo que todo lo que tenía que hacer era configurar el desbordamiento de li: oculto para eliminar ese desbordamiento de entrada en exceso.
fuente
en lugar de esta lucha por el margen, simplemente haz
de esta manera, el borde de la celda es visible y puede controlar el color de fondo de la fila
fuente
Saque "http://www.w3.org/TR/html4/loose.dtd" de la declaración DOCTYPE y solucione su problema.
¡Salud! :)
fuente
http://www.w3.org/TR/html4/strict.dtd
Strict? árbitro. w3.org/QA/2002/04/valid-dtd-list.html De todos modos, esta no es una opción porque cambiar el DOCTYPE ahora probablemente afectaría la representación de muchas otras cosas en las páginas web.Con algunos Javascript puede obtener el ancho exacto del TD que lo contiene y luego asignarlo directamente al elemento de entrada.
Lo siguiente es javascript sin formato, pero jQuery lo haría más limpio ...
Los problemas con esta solución son:
1) Si tiene sus entradas contenidas en otro elemento como un SPAN, entonces necesitará hacer un bucle y encontrar el TD porque elementos como SPAN envolverán la entrada y mostrarán su tamaño en lugar de limitarse al tamaño del TD.
2) Si tiene relleno o márgenes agregados en diferentes niveles, puede que tenga que restarlo explícitamente de [pEl.offsetWidth]. Dependiendo de su estructura HTML que se puede calcular.
3) Si las columnas de la tabla tienen un tamaño dinámico, cambiar el tamaño de un elemento hará que la tabla vuelva a fluir en algunos navegadores y puede obtener un efecto escalonado a medida que "corrige" secuencialmente los tamaños de entrada. La solución es asignar anchos específicos a la columna como porcentajes o píxeles O recopilar los nuevos anchos y establecerlos después. Consulte el código a continuación.
fuente
Resolví el problema aplicando
box-sizing:border-box
; a las propias celdas de la tabla, además de hacer lo mismo con la entrada y el contenedor.fuente
Resolví el problema usando esto
fuente
Por lo general, establezco el ancho de mis entradas al 99% para solucionar esto:
También puede eliminar los estilos predeterminados, pero eso hará que sea menos obvio que es un cuadro de texto. Sin embargo, mostraré el código para eso de todos modos:
Ad @ m
fuente
El problema radica en
border-width
el elemento de entrada. En breve, intente configurar elmargin-left
del elemento de entrada en-2px
.fuente