Tamanho da entrada x largura

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

ou

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

Qual é o código ideal entre navegadores?

Claro que depende dos requisitos, mas estou curioso para saber como as pessoas decidem e com que base.

rajakvk
fonte
17
Geralmente, é uma má idéia usar "px" na web. Você pode usar unidades relativas ("em", "%" etc.).
kangax
37
@kangax É apenas uma opinião; não há consenso sobre o uso de px
Kós #
7
@ Kos Isso meio que foi um consenso. Já não (com o IE e outros navegadores antigos) passando.
kangax
9
@ kangax Eu nunca recebi esse memorando ... Eu uso px o tempo todo e sempre o tenho.
Andrew

Respostas:

180

Você pode usar os dois. O estilo css substituirá o sizeatributo nos navegadores que suportam CSS e tornará o campo a largura correta e, para aqueles que não suportam, ele retornará ao número especificado de caracteres.

Editar: eu deveria ter mencionado que o sizeatributo não é um método preciso de dimensionamento: de acordo com a especificação HTML , ele deve se referir ao número de caracteres da fonte atual que a entrada poderá exibir de uma só vez.

No entanto, a menos que a fonte especificada seja uma fonte de largura fixa / monoespaçada, isso não garante que o número especificado de caracteres seja realmente visível; na maioria das fontes, caracteres diferentes terão larguras diferentes. Esta pergunta tem algumas boas respostas relacionadas a esse problema.

O trecho abaixo demonstra as duas abordagens.

@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
fonte
2
@ Mark B. Obrigado pela sua resposta. Eu usei o estilo embutido para fazer perguntas aqui.
rajakvk 27/09/09
Não se preocupe - eu pensei que você poderia ter, mas eu apenas indiquei o caso.
27410 Mark Bell
A maioria das fontes não tem largura mono. Quanto ao "número de caracteres que o campo poderá exibir de uma só vez" ... Qual personagem você quer dizer?
Pacerier
@Pacerier O número de caracteres em qualquer fonte que a entrada esteja usando: jsbin.com/zimako/1
Mark Bell
1
@jbyrd Sim, é esse o caso - mas a resposta está correta de acordo com a especificação HTML. Editei a resposta agora para esclarecer um pouco as coisas.
Mark Bell
49

Sugiro, provavelmente a melhor maneira é definir a largura do estilo na unidade em :) Então, para o tamanho de entrada de 20 caracteres, apenas defina style='width:20em':)

Pensador
fonte
4
Ponto interessante, no entanto, nos meus testes width: 20em torna a entrada muito maior que 20 caracteres.
Christophe
32
"em" é uma medida da altura do caractere 'M', é por isso que a caixa fica muito grande.
Humbads
9
Em CSS, em é relativo ao tamanho da fonte de seu pai direto ou mais próximo. Um exemplo: se o tamanho da fonte herdada de um elemento for 16px e você definir o tamanho da fonte como 2em, o tamanho resultante será 32px (16px * 2em). A unidade "em" não é uma quantidade de caracteres. Mais: w3.org/TR/css3-values/#font-relative-lengths e kyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vs e j.eremy.net/confused -about-rem-and-em
delroh
1
@ humumbads, você não quer dizer uma medida da largura do caractere 'M'?
Jess
5
@ Jess, boa pergunta. Na tipografia , 'em' costumava significar a largura do caractere 'M'. Durante muito tempo, acreditei na mesma coisa. No entanto, em CSS e tipografia digital, o 'em' é igual à altura da fonte em pontos. Isso serve para acomodar conjuntos de caracteres que não possuem o caractere 'M' ou onde o 'M' não é a altura ou a largura total da fonte.
Humbads
21

size é inconsistente em diferentes navegadores e em suas possíveis configurações de fonte.

O widthestilo definido em px será, pelo menos, consistente, com o tamanho do módulo . Você também pode definir o estilo em 'se' para dimensioná-lo em relação à fonte (embora, novamente, isso seja inconsistente, a menos que você defina fontexplicitamente a família e o tamanho da entrada ) ou '%' se estiver criando um formulário de layout líquido. De qualquer maneira, uma folha de estilo provavelmente é preferível ao styleatributo embutido .

Você ainda precisa sizepara <select multiple>obter a altura de alinhar com as opções corretamente. Mas eu não o usaria em um <input>.

bobince
fonte
13

Quero dizer que isso vai contra a "sabedoria convencional", mas geralmente prefiro usar tamanho. A razão para isso é precisamente a razão pela qual muitas pessoas dizem que não: a largura do campo varia de navegador para navegador, dependendo do tamanho da fonte. Especificamente, sempre será grande o suficiente para exibir o número especificado de caracteres, independentemente das configurações do navegador.

Por exemplo, se eu tiver um campo de data, normalmente desejo que o campo seja amplo o suficiente para exibir 8 ou 10 caracteres (mês e dia com dois dígitos e ano com dois ou quatro dígitos, com separadores). Definir o atributo size essencialmente me garante que toda a data estará visível, com o mínimo de espaço desperdiçado. Da mesma forma, para a maioria dos números - eu sei o intervalo de valores esperado, portanto, definirei o atributo size como o número adequado de dígitos, mais o ponto decimal, se aplicável.

Até onde eu sei, nenhum atributo CSS faz isso. Definir uma largura em em, por exemplo, baseia-se na altura, não na largura e, portanto, não é muito preciso se você deseja exibir um número conhecido de caracteres.

Obviamente, essa lógica nem sempre se aplica - um campo de entrada de nome, por exemplo, pode conter qualquer número de caracteres. Nesses casos, voltarei às propriedades de largura do CSS, normalmente em px. No entanto, eu diria que a maioria dos campos que eu faço tem algum tipo de conteúdo conhecido e, especificando o atributo size, posso garantir que a maior parte do conteúdo, na maioria dos casos, seja exibida sem recorte.

ibrewster
fonte
Você também pode usar a exunidade para isso, embora o uso do tamanho ainda simplifique a maioria dos casos por não ter dezenas de IDs / classes em seu CSS para largura.
Quarenta
@ Forty Na verdade, você não pode. exé a altura de um personagem (especificamente, o "X"), não a largura - assim como em. Como não há relação fixa entre a altura e a largura de um caractere (x ou não), não há razão para acreditar que o uso da altura de um caractere para definir a largura de um campo fará com que o campo tenha a largura adequada para mostrar qualquer determinado número de caracteres. Pode ser mais amplo ou mais estreito, dependendo da fonte. Agora, a chunidade parece promissora, mas não tem suporte no IE inferior a 9, o que seria um problema quando eu escrevi isso.
Ibrewster #
Sim, mas a altura de x geralmente nunca é menor que a largura, na maioria das vezes, na verdade, é um pouco maior ou quase a mesma, então fica bem próxima. chInfelizmente, poderia ter sido melhor, alguns zeros são finos e isso pode não medir o espaço total de caracteres ... #
40
@Forty True, reforçando assim o meu argumento original de que não há um bom atributo CSS para definir a largura de um campo de entrada com um número específico de caracteres, enquanto o sizeatributo se esforça para fazer exatamente isso. Você pode estar certo de que exé uma alternativa razoável, mas o fato é que é um atributo de altura, não um atributo de largura. sizeé um atributo de largura, apenas não css.
Ibrewster # 30/17
É perto o suficiente para ser usado, mas não é prático para este caso :) #
40-
4

Acabei de lutar com uma mesa que não podia diminuir, não importa qual elemento tentasse diminuir, a largura da mesa permaneceu a mesma. Pesquisei usando o firebug, mas não consegui encontrar o elemento que estava definindo a largura tão alta.

Finalmente, tentei alterar o atributo size dos elementos de entrada de texto e isso foi corrigido. Por alguma razão, o atributo size substituiu as larguras de css. Eu estava usando o jQuery para adicionar linhas dinamicamente a uma tabela e foram essas linhas que continham as entradas. Portanto, talvez quando se trata de adicionar entradas dinamicamente usando a função appendTo (), talvez seja melhor definir o atributo size juntamente com a largura.

marca
fonte
1

Você obterá mais consistência se usar a largura (seu segundo exemplo).

Matt Howell
fonte
1

Você pode redimensionar usando estilo e largura para redimensionar a caixa de texto. Aqui está o código para isso.

<!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 alinhar para centralizar a caixa de texto.


fonte
1

O sizeatributo em HTML e a widthpropriedade em CSS definirão a largura de um <input>. Se você deseja definir a largura para algo mais próximo da largura de cada caractere, use a **ch**unidade como em:

input {
    width: 10ch;
}
chrisbowman22
fonte
0

HTML controla o significado semântico dos elementos. CSS controla o layout / estilo da página. Use CSS ao controlar seu layout.

Em resumo, nunca use size = ""

Chris Sobolewski
fonte
O tamanho pode ser inerente ao significado do elemento; por exemplo, uma inicial do meio tem um único caractere. Um primeiro nome, OTOH, não tem limite de tamanho inerente - a menos que você tenha um no seu banco de dados.
derobert
4
@derobert: Eu poderia estar enganado, mas normalmente você expressa isso usando o atributo maxlength para a entrada [type = text | password] e não com o atributo size.
Horst Gutmann
2
@ Horst: Bem, eu expressaria a inicial do meio com ambas (como esse limite faz sentido para o usuário), e o banco de dados limita apenas um com comprimento máximo.
derobert