¿Por qué display:block;width:auto;
en mi entrada de texto no se comporta como un div y llena el ancho del contenedor?
Tenía la impresión de que un div es simplemente un elemento de bloque con ancho automático. En el siguiente código, ¿no deberían el div y la entrada tener dimensiones idénticas?
¿Cómo obtengo la entrada para llenar el ancho? El 100% de ancho no funcionará porque la entrada tiene relleno y un borde (lo que causa un ancho final de 1 píxel + 5 píxeles + 100% + 5 píxeles + 1 píxeles). Los anchos fijos no son una opción, y estoy buscando algo más flexible.
Prefiero una respuesta directa a una solución alternativa. Esto parece una peculiaridad de CSS y comprenderlo puede ser útil más adelante.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>width:auto</title>
<style>
div, input {
border: 1px solid red;
height: 5px;
padding: 5px;
}
input, form {
display: block;
width: auto;
}
</style>
</head>
<body>
<div></div>
<form>
<input type="text" name="foo" />
</form>
</body>
</html>
Debo señalar que ya puedo hacer esto con soluciones de envoltura. Además de este problema con la semántica de la página y las relaciones del selector CSS, estoy tratando de comprender la naturaleza del problema y si se puede superar cambiando la naturaleza de la ENTRADA.
Ok, esto es realmente extraño! He descubierto que la solución es simplemente agregar max-width:100%
a una entrada con width:100%;padding:5px;
. Sin embargo, esto plantea aún más preguntas (que haré en una pregunta separada), pero parece que el ancho usa el modelo de cuadro CSS normal y el ancho máximo usa el modelo de cuadro de borde de Internet Explorer. Que raro.
Ok, ese último parece ser un error en Firefox 3. Internet Explorer 8 y Safari 4 limitan el ancho máximo al 100% + relleno + borde, que es lo que dice hacer la especificación. Finalmente, Internet Explorer hizo algo bien.
¡Dios mío, esto es asombroso! En el proceso de jugar con esto, y con mucha ayuda de los venerables gurús Dean Edwards y Erik Arvidsson , logré juntar tres soluciones separadas para hacer un verdadero navegador cruzado de 100% de ancho en elementos con relleno y bordes arbitrarios. Ver la respuesta a continuación. Esta solución no requiere ningún marcado HTML adicional, solo una clase (o selector) y un comportamiento opcional para Internet Explorer heredado.
input
elementos que aparentemente no cumplen con la especificación CSS 2.1, mientras que la pregunta a la que se vinculó pregunta cómo evitar el desbordamiento de cuadros que ocurre perfectamente dentro de los límites de la especificación CSS 2.1 por cierto. Tanto las preguntas como sus soluciones se superponen, pero llamarlas duplicados exactos es simplemente incorrecto.Respuestas:
Echa un vistazo a lo que se me ocurrió, una solución que utiliza el
box-sizing:border-box
estilo relativamente desconocido de CSS 3. Esto permite un ancho "verdadero" del 100% en cualquier elemento, independientemente del relleno y / o bordes de esos elementos.Esta solución es compatible con Internet Explorer 6 e Internet Explorer 7 a través de un comportamiento escrito por Erik Arvidsson con algunos ajustes de Dean Edwards para admitir porcentajes y otros anchos sin píxeles.
Ejemplo de trabajo
Comportamiento (boxsizing.htc)
fuente
width:100%
pero no lo hace si lo usawidth:auto
, consulte aquí: jsfiddle.net/hGuzELa razón por la que esto sucede es que el tamaño de una entrada de texto está determinado por su atributo de tamaño. agregue size = "50" dentro de la etiqueta <input>. Luego cámbielo a size = "100". ¿Ve a qué me refiero?
Sospecho que hay una mejor solución, pero la única que me viene a la mente es algo que encontré en la pregunta "Características ocultas de HTML" en SO: utilice un div editable por contenido, en lugar de una entrada. Pasar la entrada del usuario al formulario adjunto (si eso es lo que necesita) puede ser un poco complicado.
Características ocultas de HTML
fuente
button
lo mismo que no tiene unsize
atributo?input
es un elemento reemplazado.Su mejor opción es envolver la entrada en un div con su borde, márgenes, etc., y tener la entrada dentro con un ancho del 100% y sin borde, sin márgenes, etc.
Por ejemplo,
fuente
Podrías fingirlo así:
fuente
Prueba esto:
fuente
También podrías fingirlo así:
fuente
Agregue esto a su estilo:
fuente