Taille d'entrée vs largeur

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

ou

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

Lequel est le code cross-browser optimal?

Bien sûr, cela dépend des exigences, mais je suis curieux de savoir comment les gens décident et sur quelle base.

rajakvk
la source
17
C'est généralement une mauvaise idée d'utiliser "px" sur le Web. Vous pourriez envisager d'utiliser des unités relatives à la place ("em", "%", etc.).
kangax
37
@kangax Ce n'est qu'une opinion; il n'y a pas de consensus concernant l'utilisation de px
Kos
7
@Kos C'était en quelque sorte un consensus. Pas plus (avec IE et d'autres anciens navigateurs) ne décède.
kangax
9
@kangax Je n'ai jamais reçu ce mémo ... J'utilise px tout le temps et je l'ai toujours fait.
Andrew

Réponses:

180

Vous pouvez utiliser les deux. Le style css remplacera l' sizeattribut dans les navigateurs qui prennent en charge CSS et rendra le champ de la bonne largeur, et pour ceux qui ne le feront pas, il retombera au nombre de caractères spécifié.

Edit: j'aurais dû mentionner que l' sizeattribut n'est pas une méthode précise de dimensionnement: selon la spécification HTML , il devrait se référer au nombre de caractères de la police actuelle que l'entrée pourra afficher à la fois.

Cependant, à moins que la police spécifiée soit une police à largeur fixe / monospace, cela ne garantit pas que le nombre de caractères spécifié sera réellement visible; dans la plupart des polices, différents caractères auront des largeurs différentes. Cette question a quelques bonnes réponses relatives à ce problème.

L'extrait ci-dessous illustre les deux approches.

@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
la source
2
@Mark B. Merci pour votre réponse. J'ai utilisé le style en ligne pour poser la question ici.
rajakvk
Pas de soucis - je pensais que vous auriez pu, mais je l'ai juste souligné au cas où.
Mark Bell
La plupart des polices ne sont pas mono-largeur. Concernant "le nombre de caractères que le champ pourra afficher en même temps" .... De quel caractère parlez-vous?
Pacerier
@Pacerier Le nombre de caractères dans la police utilisée par l'entrée: jsbin.com/zimako/1
Mark Bell
1
@jbyrd Oui, c'est le cas, mais la réponse est correcte selon la spécification HTML. J'ai édité la réponse maintenant pour clarifier un peu les choses.
Mark Bell
50

Je suggère, le meilleur moyen est probablement de définir la largeur du style dans l'unité em style='width:20em':)

Penseur
la source
4
Point intéressant, cependant dans mes tests largeur: 20em rend l'entrée beaucoup plus grande que 20 caractères.
Christophe
32
"em" est une mesure de la hauteur du caractère "M", c'est pourquoi la boîte devient trop grande.
humbads
9
En CSS, em est relatif à la taille de police de son parent direct ou le plus proche. Un exemple: si la taille de police héritée d'un élément est 16px et que vous définissez la taille de police sur 2em, la taille résultante sera 32px (16px * 2em). L'unité "em" n'est pas une quantité de caractères. Plus: w3.org/TR/css3-values/#font-relative-lengths et kyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vs et j.eremy.net/confused -about-rem-and-em
delroh
1
@humbads ne voulez-vous pas dire une mesure de la largeur du caractère «M»?
Jess
5
@Jess, bonne question. En typographie , «em» signifiait la largeur du caractère «M». Pendant longtemps, j'ai cru la même chose. Cependant, en CSS et en typographie numérique, le «em» est égal à la hauteur de la police en points. Il s'agit de prendre en charge les jeux de caractères qui n'ont pas le caractère «M» ou où le «M» n'est pas la pleine hauteur ou largeur de la police.
humbads
21

size est incohérent entre les différents navigateurs et leurs paramètres de police possibles.

Le widthstyle défini en px sera au moins un problème de taille de boîte modulo cohérent . Vous pouvez également définir le style dans 'em' si vous souhaitez le dimensionner par rapport à la police (mais là encore, cela ne sera pas cohérent sauf si vous définissez fontexplicitement la famille et la taille de l'entrée ), ou '%' si vous faites un forme de mise en page liquide. Dans les deux cas, une feuille de style est probablement préférable à l' styleattribut inline .

Vous avez encore besoin sizepour <select multiple>obtenir la hauteur pour aligner correctement avec les options. Mais je ne l'utiliserais pas sur un <input>.

bobince
la source
13

Je veux dire que cela va à l'encontre de la "sagesse conventionnelle", mais je préfère généralement utiliser la taille. La raison en est précisément la raison pour laquelle beaucoup de gens disent de ne pas le faire: la largeur du champ variera d'un navigateur à l'autre, selon la taille de la police. Plus précisément, il sera toujours suffisamment grand pour afficher le nombre de caractères spécifié, quels que soient les paramètres du navigateur.

Par exemple, si j'ai un champ de date, je veux généralement que le champ soit suffisamment large pour afficher 8 ou 10 caractères (mois et jour à deux chiffres et année à deux ou quatre chiffres, avec séparateurs). La définition de l'attribut size me garantit essentiellement que la date entière sera visible, avec un minimum d'espace perdu. De même pour la plupart des nombres - je connais la plage de valeurs attendues, je vais donc définir l'attribut size sur le bon nombre de chiffres, plus le point décimal le cas échéant.

Pour autant que je sache, aucun attribut CSS ne fait cela. La définition d'une largeur en em, par exemple, est basée sur la hauteur et non sur la largeur et n'est donc pas très précise si vous souhaitez afficher un nombre connu de caractères.

Bien sûr, cette logique ne s'applique pas toujours - un champ de saisie de nom, par exemple, peut contenir n'importe quel nombre de caractères. Dans ces cas, je reviens aux propriétés de largeur CSS, généralement en px. Cependant, je dirais que la majorité des champs que je crée ont une sorte de contenu connu, et en spécifiant l'attribut size, je peux m'assurer que la plupart du contenu, dans la plupart des cas, est affiché sans écrêtage.

ibrewster
la source
Vous pouvez également utiliser l' exunité pour cela, bien que l'utilisation de la taille simplifie toujours la plupart des cas en n'ayant pas des dizaines d'ID / classes dans votre CSS pour la largeur.
Quarante
@Forty En fait, vous ne pouvez pas. exest la hauteur d'un caractère (en particulier, le "X"), pas la largeur - tout comme em. Puisqu'il n'y a pas de relation fixe entre la hauteur et la largeur d'un caractère (x ou autre), il n'y a aucune raison de croire que l'utilisation de la hauteur d'un caractère pour définir la largeur d'un champ fera du champ la largeur appropriée pour afficher tout nombre de caractères donné. Elle peut être plus large ou plus étroite, selon la police. Maintenant, l' chunité semble prometteuse, mais n'est pas prise en charge dans IE moins de 9, ce qui aurait été un problème lorsque j'ai écrit cela.
ibrewster
Oui, mais la hauteur de x n'est généralement jamais inférieure à la largeur, la plupart du temps en fait un peu plus élevée ou presque la même, donc elle se rapproche assez. chaurait pu être mieux malheureusement, certains zéros sont minces et cela peut ne pas mesurer l'espace complet du personnage ...
Quarante
@Forty True, renforçant ainsi mon point de départ selon lequel il n'y a pas de bon attribut CSS pour définir la largeur d'un champ de saisie sur un nombre spécifique de caractères, tandis que l' sizeattribut s'efforce de faire exactement cela. Vous avez peut-être raison, c'est exune alternative raisonnable, mais il n'en reste pas moins que c'est un attribut de hauteur, pas un attribut de largeur.sizeest un attribut width, mais pas css.
ibrewster
Il est assez proche pour être utilisé, mais pas pratique pour ce cas :)
Quarante
4

Je viens de me battre avec une table que je ne pouvais pas faire plus petite, peu importe l'élément que j'essayais de faire plus petit, la largeur de la table est restée la même. J'ai cherché à l'aide de Firebug mais je n'ai pas trouvé l'élément qui définissait la largeur si haut.

Enfin, j'ai essayé de changer l' attribut de taille des éléments de texte d'entrée et cela l'a corrigé. Pour une raison quelconque, l' attribut size a dépassé les largeurs css. J'utilisais jQuery pour ajouter dynamiquement des lignes à une table et ce sont ces lignes qui contenaient les entrées. Alors peut-être quand il s'agit d'ajouter dynamiquement des entrées à l'aide de la fonction appendTo (), il est peut-être préférable de définir l' attribut size avec la largeur.

marque
la source
1

Vous obtiendrez plus de cohérence si vous utilisez la largeur (votre deuxième exemple).

Matt Howell
la source
1

Vous pouvez redimensionner en utilisant le style et la largeur pour redimensionner la zone de texte. Voici le code pour cela.

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

Utilisez aligner pour centrer la zone de texte.

shah
la source
1

L' sizeattribut en HTML et la widthpropriété en CSS définiront la largeur d'un <input>. Si vous souhaitez définir la largeur à quelque chose de plus proche de la largeur de chaque caractère, utilisez l' **ch**unité comme dans:

input {
    width: 10ch;
}
chrisbowman22
la source
0

HTML contrôle la signification sémantique des éléments. CSS contrôle la mise en page / le style de la page. Utilisez CSS lorsque vous contrôlez votre mise en page.

En bref, n'utilisez jamais size = ""

Chris Sobolewski
la source
La taille peut être inhérente à la signification de l'élément; par exemple, une initiale du milieu a un seul caractère. Un prénom, OTOH, n'a pas de limite de taille inhérente - sauf si vous en avez un dans votre base de données.
derobert
4
@derobert: Je peux me tromper, mais normalement vous exprimez cela en utilisant l'attribut maxlength pour l'entrée [type = texte | mot de passe] et non avec l'attribut size.
Horst Gutmann
2
@Horst: Eh bien, j'exprimerais l'initiale du milieu avec les deux (car cette limite a du sens pour l'utilisateur), et la limite de la base de données uniquement avec maxlength.
derobert