Baseado na resposta de Michael, criei minha própria versão usando o jQuery. Eu acho que é uma versão mais limpa / mais curta da maioria das respostas aqui e parece fazer o trabalho.
Estou fazendo a mesma coisa que a maioria das pessoas aqui, usando um intervalo para escrever o texto de entrada e obtendo a largura. Então, eu estou definindo a largura quando as ações keyup
eblur
são chamadas.
Aqui está um código de trabalho . Este código mostra como isso pode ser usado com vários campos de entrada.
Estrutura 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);
};
A função acima obtém o valor das entradas, apara os espaços extras e define o texto no intervalo para obter a largura. Se não houver texto, ele obtém o espaço reservado e o insere no intervalo. Depois de inserir o texto no intervalo, ele define a largura da entrada. A + 5
largura é porque, sem isso, a entrada é cortada um pouquinho no Navegador de Borda.
$('.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);
});
Se isso puder ser melhorado, informe-me, pois esta é a solução mais limpa que eu poderia encontrar.