Tamaño de entrada vs ancho

231
<input name="txtId" type="text" size="20" />

o

<input name="txtId" type="text" style="width: 150px;" />

¿Cuál es el código óptimo del navegador cruzado?

Por supuesto, depende de los requisitos, pero tengo curiosidad por saber cómo deciden las personas y sobre qué base.

rajakvk
fuente
17
Por lo general, es una mala idea usar "px" en la web. Puede considerar usar unidades relativas en su lugar ("em", "%", etc.).
kangax
37
@kangax Es solo una opinión; no hay consenso sobre el uso de px
Kos
77
@Kos Fue como un consenso. Ya no desaparece (con IE y otros navegadores antiguos).
kangax
99
@kangax Nunca recibí ese memo ... Uso px todo el tiempo y siempre lo he hecho.
Andrew

Respuestas:

180

Puedes usar ambos. El estilo css anulará el sizeatributo en los navegadores que admiten CSS y harán que el campo tenga el ancho correcto, y para aquellos que no lo hagan, recurrirá al número especificado de caracteres.

Editar: debería haber mencionado que el sizeatributo no es un método preciso de dimensionamiento: de acuerdo con la especificación HTML , debe referirse al número de caracteres de la fuente actual que la entrada podrá mostrar a la vez.

Sin embargo, a menos que la fuente especificada sea una fuente de ancho fijo / monoespacio, esto no garantiza que el número especificado de caracteres sea realmente visible; en la mayoría de las fuentes, los diferentes caracteres serán de diferentes anchos. Esta pregunta tiene algunas buenas respuestas relacionadas con este tema.

El fragmento a continuación muestra ambos enfoques.

@font-face {
    font-family: 'Diplomata';
    font-style: normal;
    font-weight: 400;
    src: local('Diplomata'), local('Diplomata-Regular'), url(https://fonts.gstatic.com/s/diplomata/v8/8UgOK_RUxkBbV-q561I6kFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
@font-face {
    font-family: 'Open Sans Condensed';
    font-style: normal;
    font-weight: 300;
    src: local('Open Sans Condensed Light'), local('OpenSansCondensed-Light'), url(https://fonts.gstatic.com/s/opensanscondensed/v11/gk5FxslNkTTHtojXrkp-xBEur64QvLD-0IbiAdTUNXE.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
p {
  margin: 0 0 10px 0;
}
input {
  font-size: 20px;
}
.narrow-font {
  font-family: 'Open Sans Condensed', sans-serif;
}
.wide-font {
  font-family: 'Diplomata', cursive;
}
.set-width {
  width: 220px;
}
<p>
  <input type="text" size="10" class="narrow-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="narrow-font set-width" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font set-width" value="0123456789" />
</p>

Mark Bell
fuente
2
@ Mark B. Gracias por su respuesta. Utilicé el estilo en línea para hacer preguntas aquí.
rajakvk
No se preocupe, pensé que podría tenerlo, pero lo señalé por si acaso.
Mark Bell
La mayoría de las fuentes no son mono ancho. Con respecto a "la cantidad de caracteres que el campo podrá mostrar a la vez" .... ¿A qué carácter se refiere?
Pacerier
@Pacerier El número de caracteres en cualquier fuente que use la entrada: jsbin.com/zimako/1
Mark Bell
1
@jbyrd Sí, ese es el caso, pero la respuesta es correcta de acuerdo con la especificación HTML. Edité la respuesta ahora para aclarar un poco las cosas.
Mark Bell
50

Sugiero, probablemente la mejor manera es establecer el ancho del estilo en la unidad em :) Entonces, para el tamaño de entrada de 20 caracteres, simplemente configure style='width:20em':)

Pensador
fuente
44
Punto interesante, sin embargo, en el ancho de mis pruebas: 20em hace que la entrada sea mucho más grande que 20 caracteres.
Christophe
32
"em" es una medida de la altura del carácter 'M', por eso el cuadro se hace demasiado grande.
humbads
99
En CSS, em es relativo al tamaño de fuente de su padre directo o más cercano. Un ejemplo: si el tamaño de fuente heredado de un elemento es 16px, y establece el tamaño de fuente en 2em, el tamaño resultante será 32px (16px * 2em). La unidad "em" no es la cantidad de caracteres. Más: w3.org/TR/css3-values/#font-relative-lengths and kyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vs y j.eremy.net/confused -about-rem-and-em
delroh
1
@humbads, ¿no te refieres a una medida del ancho del carácter 'M'?
Jess
55
@Jess, buena pregunta. En tipografía , 'em' solía significar el ancho del carácter 'M'. Durante mucho tiempo, creí lo mismo. Sin embargo, en CSS y tipografía digital, el 'em' es igual a la altura de la fuente en puntos. Esto es para acomodar juegos de caracteres que no tienen el carácter 'M', o donde la 'M' no es el alto o ancho completo de la fuente.
humbads
21

size es inconsistente en diferentes navegadores y sus posibles configuraciones de fuente.

El widthestilo establecido en px será al menos consistente, problemas de tamaño de caja de módulo . También es posible que desee establecer el estilo en 'em' si desea cambiar su tamaño en relación con la fuente (aunque de nuevo, esto será inconsistente a menos que configure fontexplícitamente la familia y el tamaño de la entrada ), o '%' si está haciendo un forma de diseño líquido. De cualquier manera, una hoja de estilo es probablemente preferible al styleatributo en línea .

Todavía es necesario sizepara <select multiple>conseguir la altura para alinearse con las opciones correctamente. Pero no lo usaría en un <input>.

bobince
fuente
13

Quiero decir que esto va en contra de la "sabiduría convencional", pero generalmente prefiero usar el tamaño. La razón de esto es precisamente la razón por la que muchas personas dicen que no: el ancho del campo variará de un navegador a otro, dependiendo del tamaño de la fuente. Específicamente, siempre será lo suficientemente grande como para mostrar el número especificado de caracteres, independientemente de la configuración del navegador.

Por ejemplo, si tengo un campo de fecha, normalmente quiero que el campo sea lo suficientemente ancho como para mostrar 8 o 10 caracteres (mes y día de dos dígitos y año de dos o cuatro dígitos, con separadores). Establecer el atributo de tamaño esencialmente me garantiza que la fecha completa será visible, con un mínimo espacio desperdiciado. De manera similar para la mayoría de los números: conozco el rango de valores esperado, por lo que estableceré el atributo de tamaño en el número adecuado de dígitos, más el punto decimal si corresponde.

Por lo que puedo decir, ningún atributo CSS hace esto. Establecer un ancho en em, por ejemplo, se basa en la altura, no en el ancho, y por lo tanto no es muy preciso si desea mostrar un número conocido de caracteres.

Por supuesto, esta lógica no siempre se aplica: un campo de entrada de nombre, por ejemplo, podría contener cualquier número de caracteres. En esos casos, recurriré a las propiedades de ancho de CSS, generalmente en px. Sin embargo, diría que la mayoría de los campos que hago tienen algún tipo de contenido conocido, y al especificar el atributo de tamaño puedo asegurarme de que la mayor parte del contenido, en la mayoría de los casos, se muestre sin recortar.

ibrewster
fuente
También puede usar la exunidad para esto, aunque el uso del tamaño todavía simplifica la mayoría de los casos al no tener docenas de identificadores / clases en su CSS para el ancho.
Cuarenta
@Forty En realidad, no puedes. exes la altura de un personaje (específicamente, la "X"), no el ancho, al igual que em. Dado que no existe una relación fija entre la altura y el ancho de un carácter (xo de otro modo), no hay razón para creer que usar la altura de un carácter para establecer el ancho de un campo hará que el campo sea el ancho adecuado para mostrar cualquier Número dado de caracteres. Podría ser más ancho o más angosto, dependiendo de la fuente. Ahora la chunidad parece prometedora, pero no es compatible con IE menos de 9, lo que habría sido un problema cuando escribí esto.
ibrewster
Sí, pero la altura de x generalmente nunca es menor que el ancho, la mayoría de las veces en realidad es un poco más alta o casi la misma, por lo que se acerca bastante. chdesafortunadamente podría haber sido mejor, algunos ceros son delgados y es posible que no mida el espacio completo de caracteres ...
Cuarenta
@Forty True, lo que refuerza mi punto original de que no hay un buen atributo CSS para establecer el ancho de un campo de entrada en un número específico de caracteres, mientras que el sizeatributo se esfuerza por hacer exactamente eso. Puede tener razón, exes una alternativa razonable, pero el hecho es que es un atributo de altura, no un atributo de ancho. sizees un atributo de ancho, simplemente no css.
ibrewster
Está lo suficientemente cerca para ser utilizado, pero no es práctico para este caso :)
Cuarenta
4

Acabo de terminar peleando con una mesa que no pude hacer más pequeña, sin importar qué elemento intenté hacer más pequeño, el ancho de la mesa permaneció igual. Busqué usando firebug pero no pude encontrar el elemento que estaba configurando el ancho tan alto.

Finalmente intenté cambiar el atributo de tamaño de los elementos de texto de entrada y eso lo solucionó. Por alguna razón, el atributo de tamaño superó los anchos css. Estaba usando jQuery para agregar filas dinámicamente a una tabla y fueron estas filas las que contenían las entradas. Entonces, tal vez cuando se trata de agregar entradas dinámicamente usando la función appendTo (), tal vez sea mejor establecer el atributo de tamaño junto con el ancho.

marca
fuente
1

Obtendrá más consistencia si usa ancho (su segundo ejemplo).

Matt Howell
fuente
1

Puede cambiar el tamaño usando estilo y ancho para cambiar el tamaño del cuadro de texto. Aquí está el código para ello.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

</head>
<body>
<div align="center">

    <form method="post">
          <div class="w3-row w3-section">
            <div class="w3-rest" align = "center">
                <input name="lastName" type="text" id="myInput" style="width: 50%">
            </div>
        </div>
    </form>
</div>
</body>
</html>

Use alinear para centrar el cuadro de texto.

cha
fuente
1

Tanto el sizeatributo en HTML como la widthpropiedad en CSS establecerán el ancho de un <input>. Si desea establecer el ancho en algo más cercano al ancho de cada carácter, use la **ch**unidad como en:

input {
    width: 10ch;
}
chrisbowman22
fuente
0

HTML controla el significado semántico de los elementos. CSS controla el diseño / estilo de la página. Use CSS cuando controle su diseño.

En resumen, nunca use size = ""

Chris Sobolewski
fuente
El tamaño puede ser inherente al significado del elemento; Por ejemplo, una inicial del segundo nombre tiene un solo carácter. Un primer nombre, OTOH, no tiene un límite de tamaño inherente, a menos que tenga uno en su base de datos.
derobert
44
@derobert: Podría estar equivocado, pero normalmente expresa que usa el atributo maxlength para la entrada [tipo = texto | contraseña] y no con el atributo de tamaño.
Horst Gutmann
2
@Horst: Bueno, expresaría la inicial del medio con ambos (ya que ese límite tiene sentido para el usuario), y el límite de la base de datos solo con la longitud máxima.
derobert