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:
<input type="text" class="plain-field" placeholder="Full Name">
<span style="display: none;"></span>
jQuery:
function resizeInputs($text) {
var text = $text.val().replace(/\s+/g, ' '),
placeholder = $text.attr('placeholder'),
span = $text.next('span');
span.text(placeholder);
var width = span.width();
if(text !== '') {
span.text(text);
var width = span.width();
}
$text.css('width', width + 5);
};
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.
$('.plain-field').each(function() {
var $text = $(this);
resizeInputs($text);
});
$('.plain-field').on('keyup blur', function() {
var $text = $(this);
resizeInputs($text);
});
$('.plain-field').on('blur', function() {
var $text = $(this).val().replace(/\s+/g, ' ');
$(this).val($text);
});
Si cela pouvait être amélioré, veuillez me le faire savoir car c'est la solution la plus propre que je puisse trouver.