<html>
<head>
</head>
<body>
<input type="text" value="1" style="min-width:1px;" />
</body>
</html>
Ceci est mon code et cela ne fonctionne pas. Existe-t-il un autre moyen en HTML, JavaScript, PHP ou CSS de définir une largeur minimale?
Je veux un champ de saisie de texte avec une largeur qui change dynamiquement, de sorte que le champ de saisie fluide autour de son contenu. Chaque entrée a un remplissage intégré de 2em
, c'est le problème et le deuxième problème est que cela min-width
ne fonctionne pas du tout sur l'entrée.
Si je règle la largeur plus que nécessaire que tout le programme est désordonné, j'ai besoin de la largeur de 1px, plus seulement si c'est nécessaire.
javascript
html
css
Kerc
la source
la source
Réponses:
Il semble que vous vous attendiez à ce que le style soit appliqué dynamiquement à la largeur de la zone de texte en fonction du contenu de la zone de texte. Si c'est le cas, vous aurez besoin de quelques js pour fonctionner sur le contenu de la zone de texte changeant, quelque chose comme ceci :
Remarque: cette solution ne fonctionne que lorsque chaque caractère est exactement
8px
large.la source
onInput
Dans les versions de navigateur modernes, l'unité CSS
ch
est également disponible. À ma compréhension, il s'agit d'une unité indépendante de la police, où1ch
est égale à la largeur du caractère0
(zéro) dans une police donnée.Ainsi, quelque chose d'aussi simple que suivant pourrait être utilisé comme fonction de redimensionnement:
Cet exemple redimensionnerait "elem" à la longueur de la valeur + 2 caractères supplémentaires.
la source
input
élément, tels quefont-style
,letter-spacing
etc. J'ai édité la réponse avec une démo en direct..
est rencontré.Pour calculer la largeur de l'entrée actuelle, vous devrez l'intégrer dans un
span
élément temporaire , attacher cette chose au DOM, obtenir la largeur calculée (en pixels) à l'aide de lascrollWidth
propriété et supprimer àspan
nouveau. Bien sûr, vous devrez vous assurer que la même famille de police, la même taille de police, etc., est utilisée dansinput
ainsi que dans l'span
élément. C'est pourquoi je leur ai assigné la même classe.J'ai attaché la fonction à l'
keyup
événement, car lekeypress
caractère d'entrée n'est pas encore ajouté à l'entréevalue
, ce qui entraînera une largeur incorrecte. Malheureusement, je ne sais pas comment me débarrasser du défilement du champ de saisie (lors de l'ajout de caractères à la fin du champ); il défile, car le caractère est ajouté et affiché avant d'adjustWidthOfInput()
être appelé. Et, comme dit, je ne peux pas faire cela dans l'autre sens car vous aurez alors la valeur du champ de saisie avant que le caractère pressé soit inséré. J'essaierai de résoudre ce problème plus tard.BTW, je n'ai testé cela que dans Firefox (3.6.8), mais vous comprendrez, j'espère.
la source
white-space: pre;
en css cette façon:.tmp-element{ visibility: hidden; white-space: pre;}
. Sinon, les espaces blancs sont combinés et le calcul de la largeur échoue.<input>
et<span>
se comporte différemment en ce qui concerne la gestion<input>
des espaces blancs , conserve les espaces blancs et<span>
combine les espaces blancs séquentiels en un seul s'ilwhite-space: pre;
n'est pas ajouté.tmp.getBoundingClientRect().width
est mieux quetmp.scrollWidth
, car cela renvoie parfois 0.replace(/ /g, " ")
Voici une modification de la réponse de Lyth qui prend en compte:
Il permet également un nombre illimité de champs de saisie! Pour le voir en action: http://jsfiddle.net/4Qsa8/
Scénario:
Style:
HTML:
Afficher l'extrait de code
la source
change
ouinput
suffiraitVoici une solution sans police monospace nécessaire, avec seulement de très petits morceaux de code de javascript , pas besoin de calculer les styles calculés , et, même supporte ime , supporte les textes rtl .
Utilisez le
span.text
pour ajuster la largeur du texte et laissez l'entrée avoir la même taille queposition: absolute
le conteneur. Copiez la valeur de l'entrée àspan
chaque fois qu'elle a changé (vous pouvez facilement changer ce morceau de code en vanilla js). Ainsi, l'entrée "s'adaptera" simplement à la taille de son contenu.la source
POUR UN MEILLEUR LOOK & FEEL
Vous devez utiliser l'événement jQuery keypress () en combinaison avec String.fromCharCode (e.which) pour obtenir le caractère pressé. Par conséquent, vous pouvez calculer quelle sera votre largeur . Pourquoi? Parce que ça aura l'air beaucoup plus sexy :)Voici un jsfiddle qui se traduit par un comportement agréable par rapport aux solutions utilisant l'événement keyup: http://jsfiddle.net/G4FKW/3/
Vous trouverez ci-dessous un JS vanille qui écoute l'
input
événement d'un<input>
élément et définit unspan
frère pour avoir la même valeur de texte afin de le mesurer.la source
span
et css pour elle.C'est une réponse spécifique à Angular, mais cela a fonctionné pour moi et a été très satisfaisant en termes de simplicité et de facilité d'utilisation:
Il se met automatiquement à jour via les unités de caractères dans la réponse de Jani .
la source
Voici une autre façon de résoudre ce problème en utilisant un DIV et la propriété 'contenteditable':
HTML:
CSS: (pour donner des dimensions à la DIV et la rendre plus facile à voir)
Remarque: Si vous prévoyez d'utiliser ceci à l'intérieur d'un élément FORM que vous prévoyez de soumettre, vous devrez utiliser Javascript / jQuery pour attraper l'événement de soumission afin que vous puissiez analyser la «valeur» (
.innerHTML
ou.html()
respectivement) du DIV.la source
Vous pouvez définir la largeur d'une entrée en utilisant la taille attribut . La taille d'une entrée détermine sa largeur en caractères.
Une entrée peut ajuster dynamiquement sa taille en écoutant les événements clés.
Par exemple
JsFiddle ici
la source
Tu pourrais faire quelque chose comme ça
la source
Il suffit d'ajouter d'autres réponses.
J'ai remarqué que de nos jours, dans certains navigateurs, le champ de saisie a un scrollWidth. Ce qui signifie:
devrait bien fonctionner. testé dans chrome, firefox et safari.
Pour la prise en charge de la suppression, vous pouvez d'abord ajouter «= 0», puis réajuster.
la source
Voici un JS simple et un plugin jQuery que j'ai écrit qui gérera le redimensionnement d'un élément d'entrée à l'aide d'un canevas et de la taille / famille de police pour déterminer la longueur réelle de la chaîne lors du rendu. (ne fonctionne que dans> IE9, chrome, safari, firefox, opera et la plupart des autres principaux navigateurs qui ont implémenté l'élément canvas).
PlainJS:
Plugin jQuery:
Remarque: cela ne gérera pas les transformations de texte, l'interligne et l'espacement des lettres, et probablement d'autres propriétés de modification de la taille du texte. Pour gérer le jeu de propriétés de transformation de texte et ajuster la valeur du texte pour correspondre à cette propriété. Les autres sont probablement assez simples. Je mettrai en œuvre si cela commence à gagner du terrain ...
la source
Il convient de noter qu'un redimensionnement agréable peut être effectué lorsque la police est monospace, afin que nous puissions parfaitement redimensionner l'
input
élément à l'aide de l'ch
unité.Également dans cette approche, nous pouvons mettre à jour la largeur du champ en mettant simplement à jour une variable CSS ( propriété personnalisée ) sur l'
input
événement et nous devrions également prendre en charge les entrées déjà pré-remplies sur l'DOMContentLoaded
événementBalisage
CSS
En tant que variable racine, nous définissons
--size: 0
: cette variable contiendra la longueur de l'entrée et elle sera multipliée par1ch
à l'intérieur de l'calc()
expression. Par défaut, nous pourrions également définir une largeur minimale, par exemple10ch
La partie Javascript lit la longueur de la valeur insérée et met à jour la variable
--size
:JS
Bien sûr, cela fonctionne toujours même si vous n'utilisez pas de police à espacement fixe, mais dans ce cas, vous devrez changer la
calc()
formule en multipliant la--size
variable par une autre valeur (dont elle dépend strictement defont-family
etfont-size
) différente de1ch
.la source
Cette réponse fournit l'une des méthodes les plus précises de récupération de la largeur du texte disponible dans le navigateur et est plus précise que la réponse acceptée. Il utilise l'élément canvas html5 et, contrairement à d'autres réponses, n'ajoute pas l'élément dans le DOM et évite ainsi tout problème de redistribution causé par l'ajout excessif d'éléments au DOM.
En savoir plus sur l'élément Canvas ici en ce qui concerne la largeur du texte.
la source
Vous pouvez le faire encore plus simplement dans angularjs en utilisant le style ng intégré directive .
Dans votre html:
Dans votre contrôleur:
Dans votre css:
Ajustez le charWidth pour correspondre à la largeur de votre police. Il semble être 7 avec une taille de police de 12 px;
la source
Si vous utilisez Bootstrap, cela pourrait être fait très facilement:
<div contenteditable="true" class="form-control" style="display: inline"></div>
Vous aurez juste besoin de récupérer le contenu de div et de le mettre dans une entrée masquée avant de soumettre le formulaire.
la source
Je pense que vous interprétez mal la propriété CSS min-width . min-width est généralement utilisé pour définir une largeur minimale du DOM dans une mise en page fluide, comme:
Cela définirait l'élément d'entrée sur une largeur minimale de 200 pixels. Dans ce contexte, "px" signifie "pixels".
Maintenant, si vous essayez de vérifier que ce champ de saisie contient au moins un caractère lorsqu'un utilisateur le soumet, vous devrez faire une validation de formulaire avec JavaScript et PHP. Si c'est effectivement ce que vous essayez de faire, je modifierai cette réponse et ferai de mon mieux pour vous aider.
la source
<input type="text" value="1" style="width:1px;" />
J'ai vraiment aimé la réponse de Lyth , mais je voulais aussi qu'elle:
J'ai adapté son JSFiddle et j'ai trouvé ça . Une amélioration non présente dans ce violon serait d'utiliser quelque chose comme l' analyseur CSS jQuery pour lire réellement la largeur initiale à partir de la règle input.textbox-autosize, et l'utiliser comme minWidth. Bon, j'utilise simplement un attribut sur le, ce qui en fait une démo compacte mais n'est pas idéale. car il nécessite un attribut supplémentaire sur chaque entrée. Vous pouvez également simplement mettre le minWidth à 100 directement dans le JavaScript.
HTML:
CSS:
JavaScript:
la source
Mieux vaut
onvalue
:Cela implique également le collage, le glisser-déposer, etc.
la source
Voici mes 2 cents. Créez un div invisible vide. Remplissez-le avec le contenu d'entrée et renvoyez la largeur au champ d'entrée. Faites correspondre les styles de texte entre chaque boîte.
la source
Assez facile:
Où N est un nombre (2 dans l'exemple, 17 sur quelque chose que je développe) qui est déterminé expérimentalement.
La soustraction de N empêche cet étrange espace exténuant de s'accumuler bien avant que le texte n'atteigne la fin de la zone de texte.
Comparer. Faites très attention à la façon dont la taille change après le premier caractère.
la source
oninput='this.style.width = (this.scrollWidth-2) + "px";'
paroninput='this.style.width = 0; this.style.width = this.scrollWidth + "px";'
se débarrasser de l'espace accumulantJe passe juste un peu de temps à trouver comment le faire.
En fait, le moyen le plus simple que j'ai trouvé est de déplacer la valeur d'entrée pour s'étendre juste avant l'entrée, en conservant la largeur du symbole d'entrée 1. Bien que je ne puisse pas être sûr qu'il correspond à votre besoin initial.
Peut-être que c'est un code supplémentaire, mais dans une application basée sur react + flux, c'est une solution tout à fait naturelle.
la source
Sur la base de la réponse de Michael, j'ai créé ma propre version de ceci en utilisant jQuery. Je pense que c'est une version plus propre / plus courte de la plupart des réponses ici et il semble que le travail soit fait.
Je fais la même chose que la plupart des gens ici en utilisant une étendue pour écrire le texte d'entrée puis en obtenant la largeur. Ensuite, je règle la largeur lorsque les actions
keyup
etblur
sont appelées.Voici un codepen fonctionnel . Ce codepen montre comment cela peut être utilisé avec plusieurs champs d'entrée.
Structure HTML:
jQuery:
La fonction ci-dessus obtient la valeur des entrées, coupe les espaces supplémentaires et définit le texte dans la plage pour obtenir la largeur. S'il n'y a pas de texte, il obtient à la place l'espace réservé et l'insère à la place dans la plage. Une fois qu'il entre le texte dans la plage, il définit la largeur de l'entrée. Le
+ 5
sur la largeur est parce que sans cela, l'entrée est coupée un tout petit peu dans le navigateur Edge.Si cela pouvait être amélioré, veuillez me le faire savoir car c'est la solution la plus propre que je puisse trouver.
la source
Pourquoi ne pas utiliser uniquement le CSS?
ce code a été introduit par @Iain Todd et j'ai pensé que je devrais le partager
la source
Un moyen générique à toute épreuve doit:
input
élément mesuréDémo Codepen
la source
Vous pouvez simplement définir l'
size
attribut. Si vous utilisez l'un des frameworks réactifs, ce qui suit sera suffisant:mais si vous utilisez pur js, vous devez définir des gestionnaires d'événements, comme:
la source