Dimensione input vs larghezza


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

o

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

Quale è il codice cross-browser ottimale?

Naturalmente dipende dai requisiti, ma sono curioso di sapere come le persone decidono e su quali basi.


17
Di solito è una cattiva idea usare "px" sul web. Potresti invece considerare di utilizzare le unità relative ("em", "%", ecc.).
Kangax,

37
@kangax È solo un'opinione; non c'è consenso sull'uso di px
Kos il

7
@Kos Era un po 'un consenso. Non più (con IE e altri vecchi browser) che passa.
Kangax,

9
@kangax Non ho mai avuto quel memo ... Uso sempre px e l'ho sempre fatto.
Andrew

Risposte:


180

Puoi usare entrambi. Lo stile CSS sovrascriverà l' sizeattributo nei browser che supportano CSS e renderà la larghezza corretta del campo e, per quelli che non lo fanno, tornerà al numero specificato di caratteri.

Modifica: avrei dovuto menzionare che l' sizeattributo non è un metodo preciso di dimensionamento: secondo la specifica HTML , dovrebbe riferirsi al numero di caratteri del carattere corrente che l'input sarà in grado di visualizzare contemporaneamente.

Tuttavia, a meno che il carattere specificato non sia un carattere a larghezza fissa / monospazio, ciò non garantisce che il numero specificato di caratteri sarà effettivamente visibile; nella maggior parte dei caratteri, caratteri diversi avranno larghezze diverse. Questa domanda ha alcune buone risposte relative a questo problema.

Lo snippet di seguito mostra entrambi gli approcci.

@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>


2
@Mark B. Grazie per la risposta. Ho usato lo stile in linea per porre domande qui.
rajakvk,

Non preoccuparti, pensavo che avresti potuto, ma l'ho appena sottolineato nel caso.
Mark Bell,

La maggior parte dei caratteri non sono mono-larghezza. Per quanto riguarda "il numero di caratteri che il campo sarà in grado di visualizzare contemporaneamente" .... Quale personaggio intendi?
Pacerier,

@Pacerier Il numero di caratteri nel tipo di carattere utilizzato dall'input
Mark Bell

1
@jbyrd Sì, è così, ma la risposta è corretta in base alle specifiche HTML. Ho modificato la risposta ora per chiarire un po 'le cose.
Mark Bell,

49

Suggerisco, probabilmente il modo migliore è impostare la larghezza dello stile nell'unità em :) Quindi, per una dimensione di input di 20 caratteri, basta impostare style='width:20em':)


4
Punto interessante, tuttavia nella larghezza dei miei test: 20em rende l'input molto più grande di 20 caratteri.
Christophe,

32
"em" è una misura dell'altezza del carattere "M", ecco perché la casella diventa troppo grande.
humbads

9
In CSS, em è relativo alla dimensione del carattere del suo genitore diretto o più vicino. Un esempio: se la dimensione del carattere ereditata di un elemento è 16px e si imposta la dimensione del carattere su 2em, la dimensione risultante sarà 32px (16px * 2em). L'unità "em" non è la quantità di caratteri. Altro: w3.org/TR/css3-values/#font-relative-lengths and kyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vs e j.eremy.net/confused -about-rem-and-em
delroh

1
@humbads non intendi una misura della larghezza del carattere "M"?
Jess,

5
@Jess, bella domanda. Nella tipografia , "em" indicava la larghezza del carattere "M". Per molto tempo ho creduto nella stessa cosa. Tuttavia, nei CSS e nella tipografia digitale, "em" è uguale all'altezza del carattere in punti. Questo serve per accogliere set di caratteri che non hanno il carattere "M" o dove "M" non è l'altezza o la larghezza del carattere.
humbads

21

size è incoerente tra i diversi browser e le loro possibili impostazioni dei caratteri.

Lo widthstile impostato in px sarà almeno coerente, problemi di ridimensionamento del modulo . Potresti anche voler impostare lo stile in 'em' se vuoi ridimensionarlo rispetto al carattere (anche se di nuovo, questo sarà incoerente a meno che tu non imposti fontesplicitamente la famiglia e la dimensione dell'input ), o '%' se stai facendo un forma di layout liquido. In entrambi i casi, un foglio di stile è probabilmente preferibile styleall'attributo inline .

Hai ancora bisogno sizeper <select multiple>per ottenere l'altezza per allinearsi con le opzioni correttamente. Ma non lo userei su un <input>.


13

Voglio dire che questo va contro la "saggezza convenzionale", ma generalmente preferisco usare le dimensioni. Il motivo è proprio il motivo per cui molte persone non dicono: la larghezza del campo varia da browser a browser, a seconda della dimensione del carattere. In particolare, sarà sempre abbastanza grande da visualizzare il numero specificato di caratteri, indipendentemente dalle impostazioni del browser.

Ad esempio, se ho un campo data, in genere desidero che il campo sia sufficientemente ampio da visualizzare 8 o 10 caratteri (mese e giorno a due cifre e anno a due o quattro cifre, con separatori). L'impostazione dell'attributo size mi garantisce sostanzialmente che l'intera data sarà visibile, con uno spazio minimo sprecato. Allo stesso modo per la maggior parte dei numeri: conosco l'intervallo di valori previsti, quindi imposterò l'attributo size sul numero corretto di cifre, più il punto decimale, se applicabile.

Per quanto ne so, nessun attributo CSS lo fa. L'impostazione di una larghezza in em, ad esempio, si basa sull'altezza, non sulla larghezza, e quindi non è molto preciso se si desidera visualizzare un numero noto di caratteri.

Naturalmente, questa logica non si applica sempre: un campo di immissione nome, ad esempio, può contenere un numero qualsiasi di caratteri. In quei casi tornerò alle proprietà della larghezza CSS, in genere in px. Tuttavia, direi che la maggior parte dei campi che creo hanno una sorta di contenuto noto e, specificando l'attributo size, posso assicurarmi che la maggior parte del contenuto, nella maggior parte dei casi, venga visualizzato senza ritaglio.


Puoi anche usare l' exunità per questo, sebbene l'uso delle dimensioni semplifichi ancora la maggior parte dei casi non avendo dozzine di ID / classi nel tuo CSS per larghezza.
Quaranta

@Forty In realtà, non puoi. exè l' altezza di un personaggio (in particolare la "X"), non la larghezza, proprio come em. Poiché non esiste una relazione fissa tra l'altezza e la larghezza di un carattere (x o altro), non vi è motivo di ritenere che l'uso dell'altezza di un carattere per impostare la larghezza di un campo renderà il campo la larghezza corretta per mostrare qualsiasi dato il numero di caratteri. Potrebbe essere più largo o più stretto, a seconda del carattere. Ora l' chunità sembra promettente, ma non è supportata in IE meno di 9, il che sarebbe stato un problema quando l'ho scritto.
ibrewster,

Sì, ma l'altezza di x di solito non è mai inferiore alla larghezza, il più delle volte in realtà un po 'più alta o quasi la stessa, quindi si avvicina abbastanza. chpurtroppo avrebbe potuto essere migliore, alcuni zero sono sottili e potrebbe non misurare l'intero spazio del personaggio ...
Quaranta

@Forty True, rafforzando così il mio punto originale che non esiste un buon attributo CSS per impostare la larghezza di un campo di input su un numero specifico di caratteri, mentre l' sizeattributo si sforza di fare esattamente questo. Potresti avere ragione che exsia un'alternativa ragionevole, ma resta il fatto che si tratta di un attributo di altezza, non di un attributo di larghezza. sizeè un attributo di larghezza, non solo css.
ibrewster,

È abbastanza vicino da essere usato, ma non pratico per questo caso :)
Quaranta

4

Ho appena finito di litigare con un tavolo che non potevo rimpicciolire, indipendentemente dall'elemento che ho cercato di ridurre, la larghezza del tavolo è rimasta invariata. Ho cercato usando firebug ma non sono riuscito a trovare l'elemento che stava impostando la larghezza così in alto.

Alla fine ho provato a modificare l' attributo size degli elementi di testo di input e questo è stato risolto. Per qualche motivo l' attributo size ha superato le larghezze CSS. Stavo usando jQuery per aggiungere dinamicamente righe a una tabella ed erano queste righe che contenevano gli input. Quindi forse quando si tratta di aggiungere dinamicamente input usando la funzione appendTo () forse è meglio impostare l' attributo size insieme alla larghezza.


1

Otterrai maggiore coerenza se usi la larghezza (il tuo secondo esempio).


1

Puoi ridimensionare usando stile e larghezza per ridimensionare la casella di testo. Ecco il codice per questo.

<!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>

Usa allinea per centrare la casella di testo.


1

Sia l' sizeattributo in HTML che la widthproprietà in CSS imposteranno la larghezza di un <input>. Se vuoi impostare la larghezza su qualcosa di più vicino alla larghezza di ogni personaggio usa l' **ch**unità come in:

input {
    width: 10ch;
}

0

HTML controlla il significato semantico degli elementi. CSS controlla il layout / stile della pagina. Usa CSS quando controlli il layout.

In breve, non usare mai size = ""


La dimensione può essere inerente al significato dell'elemento; ad esempio, un'iniziale centrale ha un singolo carattere. Un nome, OTOH, non ha limiti di dimensione intrinseci, a meno che tu non ne abbia uno nel tuo database.
derobert,

4
@derobert: potrei sbagliarmi, ma normalmente lo esprimi usando l'attributo maxlength per input [tipo = testo | password] e non con l'attributo size.
Horst Gutmann,

2
@Horst: Beh, esprimerei l'iniziale centrale con entrambi (poiché quel limite ha senso per l'utente), e il database ne limita uno solo con maxlength.
derobert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.