Havia outra discussão sobre isso , que eu tentei. Mas há um problema: o textarea
não encolhe se você excluir o conteúdo. Não consigo encontrar nenhuma maneira de reduzi-lo ao tamanho correto - o clientHeight
valor volta como o tamanho total dotextarea
, e não o seu conteúdo.
O código dessa página está abaixo:
function FitToContent(id, maxHeight)
{
var text = id && id.style ? id : document.getElementById(id);
if ( !text )
return;
var adjustedHeight = text.clientHeight;
if ( !maxHeight || maxHeight > adjustedHeight )
{
adjustedHeight = Math.max(text.scrollHeight, adjustedHeight);
if ( maxHeight )
adjustedHeight = Math.min(maxHeight, adjustedHeight);
if ( adjustedHeight > text.clientHeight )
text.style.height = adjustedHeight + "px";
}
}
window.onload = function() {
document.getElementById("ta").onkeyup = function() {
FitToContent( this, 500 )
};
}
Respostas:
Isso funciona para mim (Firefox 3.6 / 4.0 e Chrome 10/11):
Se você quiser experimentá-lo no jsfiddle Começa com uma única linha e cresce apenas a quantidade exata necessária. Não há problema em um single
textarea
, mas eu queria escrever algo em que tivesse muitos e muitostextarea
(aproximadamente o que normalmente teria linhas em um documento de texto grande). Nesse caso, é realmente lento. (No Firefox, é incrivelmente lento.) Então, eu realmente gostaria de uma abordagem que use CSS puro. Isso seria possível comcontenteditable
, mas eu quero que seja apenas texto sem formatação.fonte
style.height='auto'
. Eu suspeito que a solução é adicionar um irmão oculto usado apenas para medição.UMA SOLUÇÃO COMPLETA AINDA SIMPLES
Atualizado 2020-05-14 (Suporte aprimorado ao navegador para celulares e tablets)
O código a seguir funcionará:
OPÇÃO 1 (com jQuery)
Esta opção requer jQuery e foi testada e está funcionando com 1.7.2 - 3.3.1
Simples (adicione esse código jquery ao seu arquivo de script mestre e esqueça-o.)
Test on jsfiddle
OPÇÃO 2 (JavaScript puro)
Simples (adicione este JavaScript ao seu arquivo de script mestre e esqueça-o.)
Test on jsfiddle
OPÇÃO 3 (extensão jQuery)
Útil se você deseja aplicar um encadeamento adicional às áreas de texto que deseja dimensionar automaticamente.
Invocar com
$('textarea').autoHeight()
ATUALIZAÇÃO DA TEXTAREA ATRAVÉS DO JAVASCRIPT
Ao injetar conteúdo em uma área de texto via JavaScript, acrescente o código a seguir para chamar a função na opção 1.
ALTURA DE TEXTAREA PRESET
Para corrigir a altura inicial da área de texto, você precisará adicionar uma condição adicional:
fonte
this.style.height = 'auto';
é a correção do comportamento mágico. Fiquei tão frustrado por que o scrollHeight era tão estranho no comportamento. A altura para auto e, em seguida, igualando o scrollHeight no mesmo ciclo de renderização ainda me impressiona como ele 'corrige' esse problema, embora só deva pintar tecnicamente a segunda altura.this.style.height = 'auto';
corrige o comportamento do scrollHeight? É apenas mágica.A solução jQuery ajusta o css para atender às suas necessidades
css ...
javascript ...
OU alternativa para jQuery 1.7 + ...
Eu criei um violino com o estilo mínimo absoluto como ponto de partida para suas experiências ... http://jsfiddle.net/53eAy/951/
fonte
overflow-y: hidden;
ao css para impedir que a barra de rolagem pisque brevemente quando o redimensionamento ocorrer.$('textarea.auto-resize').on('change cut paste drop keyup', function(){...})
Testado no Firefox 14 e Chromium 18. Os números 24 e 12 são arbitrários, teste para ver o que melhor combina com você.
Você pode ficar sem as tags de estilo e script, mas fica um pouco confuso (isso é HTML + JS no estilo antigo e não é recomendado).
Edit: código modernizado. Atributo onkeyup alterado para addEventListener.
Edit: keydown funciona melhor que keyup
Edit: declare a função antes de usar
Edit: input funciona melhor que keydown (thnx @ WASD42 e @ MA-Maddin)
jsfiddle
fonte
input
evento. Veja stackoverflow.com/a/14029861/1951524textarea
suporte múltiplo como one-liner:document.querySelectorAll('textarea').forEach(function(te){ te.addEventListener("input", function() { this.style.height='24px'; this.style.height=this.scrollHeight+12+'px'; }); });
removeEventListener
e limpar seus ouvintes de eventos. Isso é especialmente importante ao criar ouvintes de eventos em todo o lugar em um loop forEach. Além disso, na minha opinião, a legibilidade é muito mais importante do que concisão.box-sizing: border-box;
propriedade está definida ou a área de texto explora em 4px para cada evento onInput. Passei três horas até descobrir que esse era o problema.A melhor solução (funciona e é curta) para mim é:
Funciona como um encanto, sem piscar com pasta (com o mouse também), corte, entra e diminui para o tamanho certo.
Por favor, dê uma olhada no jsFiddle .
fonte
Você está usando o valor mais alto do clientHeight atual e do conteúdo scrollHeight. Quando você torna o scrollHeight menor removendo o conteúdo, a área calculada não pode ficar menor porque o clientHeight, definido anteriormente por style.height, o mantém aberto. Em vez disso, você pode usar um máximo () de scrollHeight e um valor mínimo de altura predefinido ou calculado a partir de textarea.rows.
Em geral, você provavelmente não deve confiar no scrollHeight nos controles de formulário. Além de o scrollHeight ser tradicionalmente menos amplamente suportado do que algumas das outras extensões do IE, o HTML / CSS não diz nada sobre como os controles de formulário são implementados internamente e você não tem garantia de que o scrollHeight será significativo. (Tradicionalmente, alguns navegadores usavam widgets de SO para a tarefa, impossibilitando a interação CSS e DOM em seus internos.) Pelo menos, fareje a existência de scrollHeight / clientHeight antes de tentar ativar o efeito.
Outra abordagem alternativa possível para evitar o problema, se é importante que ele funcione mais amplamente, pode ser o uso de uma div oculta, dimensionada para a mesma largura que a área de texto, e definida na mesma fonte. Ao digitar, você copia o texto da área de texto para um nó de texto na div oculta (lembre-se de substituir '\ n' por uma quebra de linha e escape '<' / '&' corretamente se estiver usando o innerHTML). Em seguida, basta medir o offsetHeight da div para obter a altura necessária.
fonte
scrollHeight
de texto? Funciona bem com as versões atuais do IE, Firefox e Opera ... #Se você não precisa oferecer suporte ao IE8, pode usar o
input
evento:Agora você só precisa adicionar um pouco de CSS e pronto:
Uso:
Você pode ler mais sobre como isso funciona no meu blog .
fonte
input
evento durante a inicialização no ciclo foreach.tamanho automático
https://github.com/jackmoore/autosize
O Just works, autônomo, é popular (estrelas do GitHub a partir de outubro de 2018), disponível em 3.0k +, disponível no cdnjs ) e leve (~ 3.5k). Demo:
BTW, se você estiver usando o editor ACE, use
maxLines: Infinity
: Ajustar automaticamente a altura ao conteúdo no editor Ace Cloud 9fonte
autosize
plug-in não permite redimensionar manualmente usando o ícone de redimensionamento na área de texto.Encontrei um forro daqui ;
fonte
Alguém já considerou editável? Não se preocupe com a rolagem, e o único JS que eu gosto é se você planeja salvar os dados em desfoque ... e, aparentemente, é compatível com todos os navegadores populares: http://caniuse.com/#feat = contenteditable
Basta estilizá-lo para parecer uma caixa de texto, e ele será redimensionado automaticamente ... Torne sua altura mínima a altura preferida do texto.
O interessante dessa abordagem é que você pode salvar e marcar em alguns navegadores.
http://jsfiddle.net/gbutiri/v31o8xfo/
fonte
contenteditable
é bom, mas se você quer texto simples, ele precisa de várias opções como-webkit-user-modify: read-write-plaintext-only
ewhite-space: pre-wrap
.[dom-element].innerText
. @WebmasterG IMHO, seria bom omitir o jquery (por transparência) e incluir o exemplo nesta página através do Snippet de código executável em vez de no jsfiddle.Eu usei o seguinte código para várias áreas de texto. Funcionando bem no Chrome 12, Firefox 5 e IE 9, mesmo com as ações de excluir, cortar e colar executadas nas áreas de texto.
fonte
Existe uma abordagem ligeiramente diferente.
A idéia é copiar o texto
textarea
para opre
CSS e deixar que ele tenha o mesmo tamanho.O benefício é que as estruturas apresentam ferramentas simples para mover o texto sem tocar em nenhum evento. Ou seja, no AngularJS você adicionaria um
ng-model="foo" ng-trim="false"
aotextarea
eng-bind="foo + '\n'"
aopre
. Veja um violino .Apenas certifique-se de que
pre
tenha o mesmo tamanho de fonte que otextarea
.fonte
pre
tenha o mesmo tamanho de fonte que otextarea
" - Eles precisam do mesmoline-height
e de uma quantidade igualpadding
e / ouborder
também. Esta é a melhor solução para Angular.O seguinte funciona para recortar, colar etc., independentemente de essas ações serem do mouse, de um atalho de teclado, de uma opção na barra de menus ... várias respostas adotam uma abordagem semelhante, mas não levam em consideração dimensionamento, e é por isso que eles aplicam incorretamente o estilo
overflow: hidden
.Eu faço o seguinte, que também funciona bem com
max-height
erows
para altura mínima e máxima.Para uma integridade absoluta, você deve chamar a
adjust
função em mais algumas circunstâncias:textarea
alterações for alterada com redimensionamento de janela ou outros eventos que alterem a largura da área de textotextarea
'sdisplay
mudanças atributo de estilo, por exemplo, quando se vai denone
(escondido) parablock
textarea
é alterado programaticamenteObserve que usar
window.getComputedStyle
ou obtercurrentStyle
pode ser um pouco caro computacionalmente; portanto, você pode querer armazenar em cache o resultado.Funciona para o IE6, então eu realmente espero que seja bom o suficiente.
fonte
Como uma abordagem diferente, você pode usar um
<span>
que ajusta seu tamanho automaticamente. Você precisará torná-lo editável adicionando acontenteditable="true"
propriedade e pronto:O único problema dessa abordagem é que, se você quiser enviar o valor como parte do formulário, precisará fazer isso sozinho em JavaScript. Fazer isso é relativamente fácil. Por exemplo, você pode adicionar um campo oculto e, no
onsubmit
caso do formulário, atribuir o valor despan
ao campo oculto, que será automaticamente enviado com o formulário.fonte
Um pouco de correções. Funciona perfeitamente no Opera
fonte
Eu sei uma maneira curta e correta de implementar isso com jquery.Nenhuma div extra oculta é necessária e funciona na maioria dos navegadores
fonte
.live()
foi descontinuado. api.jquery.com/live Você geralmente prefere usar.on()
.Não sei se alguém mencionou dessa maneira, mas em alguns casos é possível redimensionar a altura com linhas
Demo
fonte
white-space: nowrap;
. Quando uma linha é agrupada em outra linha sem quebra de linha, a área de texto não será mais ajustada corretamente.Aqui está uma diretiva angularjs para a resposta do panzi.
HTML:
fonte
Você pode usar o JQuery para expandir
textarea
enquanto digita:fonte
${textarea.scrollHeight}px
;});Aqueles que querem alcançar o mesmo em novas versões do Angular.
Pegue o elemento textAreaRef.
Também estou adicionando outro caso de uso que pode ser útil para alguns usuários que estão lendo o encadeamento, quando o usuário deseja aumentar a altura da área de texto para determinada altura e depois
overflow:scroll
usá-lo, o método acima pode ser estendido para alcançar o caso de uso mencionado.fonte
Algumas das respostas aqui não são responsáveis pelo preenchimento.
Supondo que você tenha um maxHeight que você não deseja repassar, isso funcionou para mim:
fonte
Uma abordagem ainda mais simples e limpa é a seguinte:
// e o CSS
Tudo o que é necessário é adicionar a
.auto-height
classe à quetextarea
você deseja atingir.Testado em FF, Chrome e Safari. Deixe-me saber se isso não funcionar para você, por qualquer motivo. Mas, essa é a maneira mais limpa e simples de descobrir que isso funciona. E funciona muito bem! : D
fonte
Esse código funciona para colar e selecione excluir também.
Aqui está o JSFiddle
fonte
Eu recomendo a biblioteca javascript em http://javierjulio.github.io/textarea-autosize .
Por comentários, adicione um exemplo de código de bloqueio no uso de plug-ins:
CSS mínimo necessário:
fonte
MakeTextAreaResisable que usa qQuery
fonte
Nenhuma das respostas parece funcionar. Mas este funciona para mim: https://coderwall.com/p/imkqoq/resize-textarea-to-fit-content
fonte
minha implementação é muito simples, conte o número de linhas na entrada (e no mínimo 2 linhas para mostrar que é uma área de texto):
exemplo de trabalho completo com estímulo: https://jsbin.com/kajosolini/1/edit?html,js,output
(e isso funciona com o identificador de redimensionamento manual do navegador, por exemplo)
fonte
A resposta aceita está funcionando bem. Mas isso é muito código para essa funcionalidade simples. O código abaixo fará o truque.
fonte
Aqui está o que eu fiz ao usar o MVC HTML Helper para TextArea. Eu tinha vários elementos da área de texto, então tive que distingui-los usando o ID do modelo.
e no script adicionou isso:
Eu testei no IE10 e Firefox23
fonte
Você pode usar este código:
Coffescript:
Javascript
fonte