Atualmente, estou trabalhando em um aplicativo de vendas interno para a empresa em que trabalho e tenho um formulário que permite ao usuário alterar o endereço de entrega.
Agora, acho que ficaria muito melhor, se a área de texto que estou usando para os detalhes do endereço principal ocupasse apenas a área do texto e redimensionasse automaticamente se o texto fosse alterado.
Aqui está uma captura de tela dele atualmente.
Alguma ideia?
@Chris
Um bom ponto, mas há razões pelas quais quero que seja redimensionado. Quero que a área ocupada seja a área das informações nele contidas. Como você pode ver na captura de tela, se eu tiver uma área de texto fixa, ela ocupa bastante espaço vertical.
Posso reduzir a fonte, mas preciso que o endereço seja grande e legível. Agora posso reduzir o tamanho da área de texto, mas tenho problemas com pessoas que têm uma linha de endereço que usa 3 ou 4 (uma usa 5) linhas. É necessário que o usuário use uma barra de rolagem.
Acho que devo ser um pouco mais específico. Estou procurando o redimensionamento vertical e a largura não importa tanto. O único problema que acontece com isso é o número ISO (o grande "1") é empurrado para o endereço quando a largura da janela é muito pequena (como você pode ver na captura de tela).
Não se trata de ter um truque; trata-se de ter um campo de texto que o usuário pode editar que não ocupará espaço desnecessário, mas mostrará todo o texto nele.
Embora, se alguém criar outra maneira de abordar o problema, eu também esteja aberto a isso.
Eu modifiquei o código um pouco porque estava agindo um pouco estranho. Mudei para ativar no keyup, porque não levaria em consideração o caractere que acabou de ser digitado.
resizeIt = function() {
var str = $('iso_address').value;
var cols = $('iso_address').cols;
var linecount = 0;
$A(str.split("\n")).each(function(l) {
linecount += 1 + Math.floor(l.length / cols); // Take into account long lines
})
$('iso_address').rows = linecount;
};
Respostas:
O Facebook faz isso quando você escreve nas paredes das pessoas, mas apenas redimensiona verticalmente.
O redimensionamento horizontal me parece uma bagunça, devido a quebra de linha, linhas longas e assim por diante, mas o redimensionamento vertical parece ser bastante seguro e agradável.
Nenhum dos novatos que usam o Facebook que conheço já mencionou algo sobre isso ou ficou confuso. Eu usaria isso como evidência anedótica para dizer 'vá em frente, implemente'.
Algum código JavaScript para fazer isso, usando Prototype (porque é com isso que estou familiarizado):
PS: Obviamente, esse código JavaScript é muito ingênuo e não é bem testado, e você provavelmente não deseja usá-lo em caixas de texto com romances, mas você entende a ideia geral.
fonte
<textarea cols='5'>0 12345 12345 0</textarea>
. (Eu escrevi uma implementação quase idêntica e não peguei isso até depois de um mês de uso.) Também falha nas linhas em branco.Um refinamento para algumas dessas respostas é permitir que o CSS faça mais do trabalho.
A rota básica parece ser:
textarea
oculto e ocultodiv
textarea
'conteúdos s sincronizados com asdiv
' sdiv
, evitamos definir explicitamente atextarea
altura do.fonte
var text = $("#textArea").val().replace(/\n/g, '<br/>') + ' ';
garante que você não tenha um comportamento irregular ao passar de uma nova linha vazia no final da área de texto para uma não-vazia, pois a div oculta assegura a quebra do nbsp.Aqui está outra técnica para dimensionar automaticamente uma área de texto.
Código: (JavaScript simples baunilha)
Demonstração: (usa jQuery, destinos na área de texto em que estou digitando agora - se você possui o Firebug instalado, cole as duas amostras no console e teste nesta página)
fonte
clientHeight
escrollHeight
é igual, então você não pode usar esse método se quiser que a área de texto diminua e cresça.if (text.clientHeight == text.scrollHeight) text.style.height = "20px";
Provavelmente a solução mais curta:
Dessa forma, você não precisa de nenhum divs oculto ou algo assim.
Nota: talvez você precise brincar,
this.style.height = (this.scrollHeight) + "px";
dependendo de como estilizar a área de texto (altura da linha, preenchimento e esse tipo de coisa).fonte
keyup
pode ser o suficiente, mas não tenho certeza. Fiquei tão feliz que descobri que parei de tentar outra coisa.Aqui está uma versão Prototype de redimensionar uma área de texto que não depende do número de colunas na área de texto. Essa é uma técnica superior, pois permite controlar a área de texto via CSS, além de ter uma área de texto de largura variável. Além disso, esta versão exibe o número de caracteres restantes. Embora não seja solicitado, é um recurso bastante útil e é facilmente removido se não for desejado.
Crie o widget chamando
new Widget.Textarea('element_id')
. As opções padrão podem ser substituídas passando-as como um objeto, por exemplonew Widget.Textarea('element_id', { max_length: 600, min_height: 50})
. Se você deseja criá-lo para todas as áreas de texto da página, faça algo como:fonte
Aqui está uma solução com
JQuery
:abc
é umteaxtarea
.fonte
Verifique o link abaixo: http://james.padolsey.com/javascript/jquery-plugin-autoresize/
fonte
Apenas revisitando isso, eu o deixei um pouco mais arrumado (embora alguém que esteja cheio de protótipo / JavaScript possa sugerir melhorias?).
Basta ligar com:
fonte
Eu fiz algo bastante fácil. Primeiro, coloquei a TextArea em um DIV. Segundo, chamei a
ready
função para este script.Simples. É a altura máxima da div depois que ela é renderizada, dividida pela altura de uma TextArea de uma linha.
fonte
Eu precisava dessa função para mim, mas nenhum deles daqui funcionou como eu precisava deles.
Então eu usei o código do Orion e mudei.
Eu adicionei em uma altura mínima, para que na destruição não fique muito pequena.
fonte
Como a resposta de @memical.
No entanto, eu encontrei algumas melhorias. Você pode usar a
height()
função jQuery . Mas lembre-se dos pixels no topo e no fundo do preenchimento. Caso contrário, sua área de texto aumentará muito rápido.fonte
Minha solução não usando jQuery (porque às vezes eles não precisam ser a mesma coisa) está abaixo. Embora tenha sido testado apenas no Internet Explorer 7 , a comunidade pode apontar todos os motivos pelos quais isso está errado:
Até agora, eu realmente gosto de como está funcionando e não me preocupo com outros navegadores, então provavelmente o aplicarei a todas as minhas áreas de texto:
fonte
Aqui está uma extensão do widget Prototype que Jeremy postou em 4 de junho:
Ele impede que o usuário digite mais caracteres se você estiver usando limites nas áreas de texto. Ele verifica se há caracteres restantes. Se o usuário copiar texto na área de texto, o texto será cortado no máximo. comprimento:
fonte
O @memical tinha uma solução incrível para definir a altura da área de texto no carregamento de página com jQuery, mas para o meu aplicativo eu queria poder aumentar a altura da área de texto à medida que o usuário adicionava mais conteúdo. Criei a solução da memical com o seguinte:
Não é muito suave, mas também não é um aplicativo voltado para o cliente; portanto, suavidade não importa. (Se isso estivesse voltado para o cliente, eu provavelmente teria usado apenas um plugin jQuery de redimensionamento automático.)
fonte
Para aqueles que estão codificando para o IE e encontram esse problema. O IE tem um pequeno truque que o torna 100% CSS.
Você pode até fornecer um valor para linhas = "n" que o IE ignorará, mas outros navegadores usarão. Eu realmente odeio codificação que implementa hackers do IE, mas este é muito útil. É possível que ele funcione apenas no modo Quirks.
fonte
Os usuários do Internet Explorer, Safari, Chrome e Opera precisam se lembrar de definir explicitamente o valor da altura da linha em CSS. Eu faço uma folha de estilo que define as propriedades iniciais para todas as caixas de texto da seguinte maneira.
fonte
Aqui está uma função que acabei de escrever no jQuery para fazê-lo - você pode portá-lo para o Prototype , mas eles não suportam a "vitalidade" do jQuery, para que os elementos adicionados pelas solicitações do Ajax não respondam.
Essa versão não apenas se expande, mas também se contrai quando a tecla Delete ou Backspace é pressionada.
Esta versão depende do jQuery 1.4.2.
Aproveitar ;)
http://pastebin.com/SUKeBtnx
Uso:
ou (qualquer seletor jQuery, por exemplo)
Foi testado no Internet Explorer 7 / Internet Explorer 8 , Firefox 3.5 e Chrome. Tudo funciona bem.
fonte
Usando o ASP.NET, basta fazer o seguinte:
fonte