Est-il possible d'obtenir la largeur de la valeur d'entrée et de redimensionner celle-ci de manière dynamique afin que la valeur tienne?
Voici un exemple:
Voici le code jQuery:
$('input').each(function(){
var value = $(this).val();
var size = value.length;
// playing with the size attribute
//$(this).attr('size',size);
// playing css width
size = size*2; // average width of a char
$(this).css('width',size*3);
});
J'ai un plugin jQuery sur GitHub: https://github.com/MartinF/jQuery.Autosize.Input
Il reflète la valeur de l'entrée afin qu'il puisse calculer la longueur réelle au lieu de deviner ou d'autres approches mentionnées.
Vous pouvez voir un exemple en direct ici: http://jsfiddle.net/jw9oqz0e/
Exemple:
<input type="text" value="" placeholder="Autosize" data-autosize-input='{ "space": 40 }' />
input[type="data-autosize-input"] {
width: 90px;
min-width: 90px;
max-width: 300px;
transition: width 0.25s;
}
Vous utilisez simplement css pour définir min/max-width et utilisez une transition sur la largeur si vous voulez un effet Nice.
Vous pouvez spécifier l'espace/la distance jusqu'à la fin en tant que valeur en notation json pour l'attribut data-autosize-input sur l'élément input.
Bien sûr, vous pouvez aussi simplement l'initialiser en utilisant jQuery
$("selector").autosizeInput();
Les réponses actuelles étaient trop compliquées. Heres un rapide
$('#myinput').width($('#myinput').prop('scrollWidth'))
L'ajout de ce qui précède pour la saisie d'événements Keydown/Up/Press est trivial. Testé en chrome
Comme mentionné par @ManseUK. Cette ligne a fonctionné pour moi. JQuery version 1.8
$ ('# resizeme'). css ({width: newwidth});
Toutes les solutions basées sur le nombre de caractères sont assez faibles, car chaque caractère peut avoir une largeur différente s'il ne s'agit pas d'une police monotype. Je résous ce problème en créant une div contenant une valeur d’entrée de texte avec les mêmes propriétés de police et en obtenant sa largeur.
Quelque chose comme ça:
function resizeInput() {
$('body').append('<div class="new_width">'+$(this).val()+'</div>');
$(this).css('width', $('.new_width').width());
$('.new_width').remove()
}
$('input')
// event handler
.keyup(resizeInput)
// resize on page load
.each(resizeInput);
Donc, j'ai fait un exemple où il essaie de calculer la largeur en insérant des lettres dans une étendue et en calculant la largeur
(function() {
var mDiv = $("<span />").text("M").appendTo("body"),
mSize = mDiv.width();
mDiv.detach();
var letterSize = function(s) {
var sDiv = $("<span />").text("M" + s + "M").appendTo("body"),
sSize = sDiv.width();
sDiv.detach();
return (sSize - (mSize * 2)) * 0.89;
};
$("input[data-resise-me]").each(function() {
var minSize = $(this).width();
var resizeInput = function() {
var calcSize = $.map($(this).val(), letterSize);
var inputSize = 0;
$.each(calcSize, function(i, v) { inputSize += v; });
$(this).width( inputSize < minSize ? minSize : inputSize );
};
$(this).on({ keydown: resizeInput, keyup: resizeInput });
});
} ());
Il y a probablement une bien meilleure façon de le faire.
Quelque chose de simple:
$('#resizeme').keydown(function(){ // listen for keypresses
var contents = $(this).val(); // get value
var charlength = contents.length; // get number of chars
newwidth = charlength*9; // rough guesstimate of width of char
$(this).css({width:newwidth}); // apply new width
});
Vous pouvez changer le multiplicateur de préférence personnelle/taille du texte
Exemple: http://jsfiddle.net/bzBdX/6/
$(function(){
$("input").keyup(function(){
$(this).stop().animate({
width: $(this).val().length*7
},100)
})
})
cet exemple comme cela a été testé sur Chrome 25 et Firefox 19. ( http://jsfiddle.net/9ezyz/ )
function input_update_size()
{
var value = $(this).val();
var size = 12;
// Looking for font-size into the input
if (this.currentStyle)
size = this.currentStyle['font-size'];
else if (window.getComputedStyle)
size = document.defaultView.getComputedStyle(this,null).getPropertyValue('font-size');
$(this).stop().animate({width:(parseInt(size)/2+1)*value.length},500);
//$(this).width((parseInt(size)/2+1)*value.length);
}
$('input')
.each(input_update_size)
.keyup(input_update_size);