<html>
<head>
</head>
<body>
<input type="text" value="1" style="min-width:1px;" />
</body>
</html>
Este é o meu código e não está funcionando. Existe alguma outra maneira em HTML, JavaScript, PHP ou CSS para definir a largura mínima?
Eu quero um campo de entrada de texto com uma largura que muda dinamicamente, para que o campo de entrada flua em torno de seu conteúdo. Toda entrada possui um preenchimento interno 2em
, esse é o problema e o segundo problema é que min-width
não está trabalhando na entrada.
Se eu definir a largura mais do que o necessário, todo o programa será confuso, precisarei da largura de 1 px, mais apenas se for necessário.
javascript
html
css
Kerc
fonte
fonte
Respostas:
Parece que sua expectativa é que o estilo seja aplicado dinamicamente à largura da caixa de texto com base no conteúdo da caixa de texto. Nesse caso, você precisará de alguns js para executar a alteração do conteúdo da caixa de texto, algo como isto :
Nota: esta solução funciona apenas quando cada caractere é exatamente
8px
largo.fonte
onInput
Nas versões modernas do navegador, a unidade CSS
ch
também está disponível. No meu entender, é uma unidade independente de fonte, onde1ch
é igual à largura do caractere0
(zero) em qualquer fonte.Assim, algo tão simples como o seguinte pode ser usado como função de redimensionamento:
Esse exemplo redimensionaria "elem" para o comprimento do valor + 2 caracteres extras.
fonte
input
elemento, tais comofont-style
,letter-spacing
e assim por diante. Editei a resposta com uma demonstração ao vivo..
é encontrado.Para calcular a largura da entrada atual, você precisará incorporá-la em um arquivo temporário.
span
elemento , anexar essa coisa ao DOM, obter a largura calculada (em pixels) usando ascrollWidth
propriedade e removerspan
novamente. Obviamente, você precisará garantir que a mesma família de fontes, tamanho de fonte etc. seja usadainput
tanto nospan
elemento quanto no elemento. Portanto, eu atribuí a mesma classe a eles.Anexei a função ao
keyup
evento, como emkeypress
o caractere de entrada ainda não foi adicionado à entradavalue
, o que resultará na largura incorreta. Infelizmente, não sei como me livrar da rolagem do campo de entrada (ao adicionar caracteres ao final do campo); rola, porque o caractere é adicionado e mostrado antesadjustWidthOfInput()
é chamado. E, como dito, não posso fazer isso de outra maneira, porque você terá o valor do campo de entrada antes que o caractere pressionado seja inserido. Tentarei resolver esse problema mais tarde.BTW, eu só testei isso no Firefox (3.6.8), mas você entenderá, espero.
fonte
white-space: pre;
em css desta forma:.tmp-element{ visibility: hidden; white-space: pre;}
. Caso contrário, os espaços em branco são combinados e o cálculo da largura falha.<input>
e<span>
se comporta de maneira diferente em relação à manipulação<input>
de espaços em branco , retém espaços em branco e<span>
combina espaços em branco seqüenciais em um, sewhite-space: pre;
não for adicionado.tmp.getBoundingClientRect().width
é melhor quetmp.scrollWidth
, porque isso às vezes retorna 0.replace(/ /g, " ")
Aqui está uma modificação da resposta de Lyth que leva em consideração:
Também permite qualquer número de campos de entrada! Para vê-lo em ação: http://jsfiddle.net/4Qsa8/
Roteiro:
Estilo:
HTML:
Mostrar snippet de código
fonte
change
ouinput
evento seria suficienteAqui está uma solução sem a fonte monoespaçada necessária, com apenas um código de peça muito pequeno de javascript , não precisa calcular estilos computados e, mesmo suportando , suporta textos rtl .
Use o
span.text
para ajustar a largura do texto e deixe a entrada ter o mesmo tamanho com elaposition: absolute
no contêiner. Copie o valor da entrada paraspan
toda vez que ela for alterada (você pode alterar esse trecho de código para vanilla js facilmente). Portanto, a entrada apenas "encaixa" no tamanho do seu conteúdo.fonte
PARA UM OLHAR E SENTIR MAIS AGRADÁVEIS
Você deve usar o evento jQuery keypress () em combinação com String.fromCharCode (e.which) para obter o caractere pressionado. Portanto, você pode calcular qual será sua largura . Por quê? Porque ficará muito mais sexy :)Aqui está um jsfiddle que resulta em um bom comportamento em comparação com soluções usando o evento keyup: http://jsfiddle.net/G4FKW/3/
Abaixo está uma JS baunilha que escuta o
input
evento de um<input>
elemento e define umspan
irmão para ter o mesmo valor de texto para medi-lo.fonte
span
e css para ela.Esta é uma resposta específica da Angular, mas funcionou para mim e tem sido muito satisfatória em termos de simplicidade e facilidade de uso:
Ele é atualizado automaticamente através das unidades de caracteres na resposta de Jani .
fonte
Aqui está uma maneira alternativa de resolver isso usando uma DIV e a propriedade 'contenteditable':
HTML:
CSS: (para dar algumas dimensões ao DIV e facilitar a visualização)
Nota: Se você planeja usá-lo dentro de um elemento FORM que planeja enviar, precisará usar Javascript / jQuery para capturar o evento de envio, para poder analisar o 'valor' (
.innerHTML
ou.html()
respectivamente) do DIV.fonte
Você pode definir a largura de uma entrada usando o atributo size também. O tamanho de uma entrada determina sua largura em caracteres.
Uma entrada pode ajustar dinamicamente seu tamanho, ouvindo os principais eventos.
Por exemplo
JsFiddle aqui
fonte
Você poderia fazer algo como isso
O que outras pessoas estão dizendo
O que outras pessoas estão dizendo
fonte
Apenas adicionando outras respostas.
Notei que hoje em alguns navegadores o campo de entrada tem uma scrollWidth. Que significa:
deve funcionar bem. testado em cromo, firefox e safari.
Para suporte à exclusão, você pode adicionar '= 0' primeiro e depois reajustar.
fonte
Aqui está um JS simples e um plugin jQuery que escrevi que manipularão o redimensionamento de um elemento de entrada usando uma tela e o tamanho / família da fonte para determinar o tamanho real da string quando renderizada. (funciona apenas em> IE9, chrome, safari, firefox, opera e na maioria dos outros principais navegadores que implementaram o elemento canvas).
PlainJS:
Plugin jQuery:
Nota: isso não trata de transformações de texto, espaçamento entre linhas e espaçamento entre letras e provavelmente outras propriedades de alteração de tamanho de texto. Para manipular o conjunto de propriedades de transformação de texto e ajustar o valor do texto para corresponder a essa propriedade. Os outros são provavelmente bastante diretos. Vou implementar se isso começar a ganhar alguma tração ...
fonte
Vale a pena notar que um redimensionamento bonito pode ser feito quando a fonte é monoespaçada, para que possamos redimensionar perfeitamente o
input
elemento usando ach
unidade.Também nesta abordagem, podemos atualizar a largura do campo apenas atualizando uma variável CSS ( propriedade personalizada ) no
input
evento e também devemos cuidar da entrada já preenchida noDOMContentLoaded
eventoMarcação
CSS
Como variável raiz, definimos
--size: 0
: essa variável conterá o comprimento da entrada e será multiplicada por1ch
dentro dacalc()
expressão. Por padrão, também podemos definir uma largura mínima, por exemplo10ch
A parte Javascript lê o comprimento do valor inserido e atualiza a variável
--size
:JS
é claro que isso ainda funciona mesmo se você não usar fonte monoespaçada, mas, nesse caso, você terá que mudar a
calc()
fórmula multiplicando a--size
variável por um outro valor (que é estritamente dependente dafont-family
efont-size
) diferente1ch
.fonte
Esta resposta fornece um dos métodos mais precisos para recuperar a largura do texto disponível no navegador e é mais precisa que a resposta aceita. Ele usa o elemento canvas html5 e, diferentemente de outras respostas, não adiciona o elemento ao DOM e, assim, evita problemas de refluxo causados pela adição excessiva de elementos ao DOM.
Leia mais sobre o elemento Canvas aqui em relação à largura do texto.
fonte
Você pode fazer isso de maneira ainda mais simples em angularjs usando a diretiva de estilo ng incorporada .
No seu html:
No seu controlador:
Em seu css:
Ajuste o charWidth para corresponder à largura da sua fonte. Parece ser 7 em um tamanho de fonte de 12px;
fonte
Se você usa o Bootstrap, isso pode ser feito com muita facilidade:
<div contenteditable="true" class="form-control" style="display: inline"></div>
Você só precisará buscar o conteúdo de div e colocá-lo em uma entrada oculta antes de enviar o formulário.
fonte
Eu acho que você está interpretando mal a propriedade CSS de largura mínima . largura mínima é geralmente usada para definir uma largura DOM mínima em um layout de fluido, como:
Isso definiria o elemento de entrada com uma largura mínima de 200 pixels. Nesse contexto, "px" significa "pixels".
Agora, se você estiver tentando verificar se o campo de entrada contém pelo menos um caractere quando um usuário o envia, será necessário validar o formulário com JavaScript e PHP. Se é isso que você está tentando fazer, editarei esta resposta e farei o possível para ajudá-lo.
fonte
<input type="text" value="1" style="width:1px;" />
Gostei muito da resposta de Lyth , mas também queria:
Eu adaptei o JSFiddle dele e criei isso . Uma melhoria não presente neste violino seria usar algo como o Analisador CSS do jQuery para realmente ler a largura inicial da regra CC0box-autosize e usá-la como minWidth. Certo, estou simplesmente usando um atributo no, o que contribui para uma demonstração compacta, mas não é o ideal. pois requer um atributo extra em cada entrada. Você também pode colocar apenas a minWidth como 100 no JavaScript.
HTML:
CSS:
JavaScript:
fonte
Melhor é
onvalue
:Também envolve colar, arrastar e soltar, etc.
fonte
Aqui estão os meus 2 centavos. Crie uma div invisível vazia. Preencha-o com o conteúdo de entrada e retorne a largura ao campo de entrada. Corresponda os estilos de texto entre cada caixa.
fonte
Bem simples:
Onde N é algum número (2 no exemplo, 17 em algo que estou desenvolvendo) que é determinado experimentalmente.
Subtrair N impede que esse espaço estranho e acumulado se acumule muito antes do texto chegar ao fim da caixa de texto.
Comparar. Preste muita atenção em como o tamanho muda após apenas o primeiro caractere.
fonte
oninput='this.style.width = (this.scrollWidth-2) + "px";'
poroninput='this.style.width = 0; this.style.width = this.scrollWidth + "px";'
se livrar do espaço acumulandoEu passo algum tempo tentando descobrir como fazê-lo.
Na verdade, a maneira mais simples que encontrei é mover o valor de entrada para abranger pouco antes da entrada, mantendo a largura do símbolo da entrada 1. Embora eu não tenha certeza de que se encaixa na sua necessidade inicial.
Talvez seja algum código extra, mas na aplicação baseada em react + flux é uma solução bastante natural.
fonte
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:
jQuery:
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.Se isso puder ser melhorado, informe-me, pois esta é a solução mais limpa que eu poderia encontrar.
fonte
Por que não usar apenas css?
esse código foi introduzido por @Iain Todd e achei que deveria compartilhá-lo
fonte
Uma maneira genérica e à prova de balas deve:
input
elemento medidoCodepen demo
fonte
Você pode apenas definir o
size
atributo. Se você estiver usando uma das estruturas reativas, o seguinte será suficiente:mas se você estiver usando js puros, defina manipuladores de eventos, como:
fonte