Eu preciso exibir o texto digitado pelo usuário em uma div de tamanho fixo. O que eu quero é que o tamanho da fonte seja ajustado automaticamente para que o texto preencha a caixa o máximo possível.
Então - se a div for 400px x 300px. Se alguém entra no ABC, é uma fonte realmente grande. Se eles digitarem um parágrafo, seria uma fonte minúscula.
Eu provavelmente gostaria de começar com um tamanho máximo de fonte - talvez 32px e, enquanto o texto é muito grande para caber no contêiner, reduza o tamanho da fonte até que caiba.
Respostas:
Obrigado Attack . Eu queria usar o jQuery.
Você me apontou na direção certa, e foi assim que acabei:
Aqui está um link para o plugin: https://plugins.jquery.com/textfill/
E um link para a fonte: http://jquery-textfill.github.io/
e meu html é assim
Este é o meu primeiro plugin jquery, portanto, provavelmente não é tão bom quanto deveria ser. Ponteiros são certamente bem-vindos.
fonte
404
.Eu não achei nenhuma das soluções anteriores adequadas o suficiente devido ao desempenho ruim, então criei a minha própria que usa matemática simples em vez de loop. Também deve funcionar bem em todos os navegadores.
De acordo com este caso de teste de desempenho , é muito mais rápido que as outras soluções encontradas aqui.
Se você quiser contribuir, adicionei isso ao Gist .
fonte
.css("font-size")
em um loop. Onde você conseguiu aquilo? Minha solução é provavelmente mais rápida, pois não possui nenhuma das coisas sofisticadas que você adicionou ao seu plugin. Você é bem-vindo para adicionar seu plugin para o JSPerf e vamos ver qual deles é o mais rápido;)Por mais que eu goste das votações ocasionais que recebo por esta resposta (obrigado!), Essa não é realmente a melhor abordagem para esse problema. Confira algumas das outras respostas maravilhosas aqui, especialmente as que encontraram soluções sem loop.
Ainda assim, por uma questão de referência, aqui está a minha resposta original :
E aqui está uma versão com classes :
fonte
offsetWidth
, eu também tive que criar uma variável para o tamanho e, em seguida, acrescentar o pxtextSpan.style.fontSize = size+"px";
A maioria das outras respostas usa um loop para reduzir o tamanho da fonte até que ela caiba na div, isso é MUITO lento, pois a página precisa renderizar novamente o elemento cada vez que a fonte muda de tamanho. Acabei precisando escrever meu próprio algoritmo para que ele funcionasse de uma maneira que me permitisse atualizar seu conteúdo periodicamente sem congelar o navegador do usuário. Adicionei algumas outras funcionalidades (rotação de texto, adição de preenchimento) e o empacotei como um plugin jQuery, você pode obtê-lo em:
https://github.com/DanielHoffmann/jquery-bigtext
simplesmente chame
e caberá bem no seu contêiner.
Veja em ação aqui:
http://danielhoffmann.github.io/jquery-bigtext/
Por enquanto, ele tem algumas limitações, a div deve ter altura e largura fixas e não suporta quebra de texto em várias linhas.
Vou trabalhar para obter uma opção para definir o tamanho máximo da fonte.
Edit: Eu encontrei mais alguns problemas com o plugin, ele não lida com outro modelo de caixa além do padrão e o div não pode ter margens ou bordas. Vou trabalhar nisso.
Edit2: Eu já corrigi esses problemas e limitações e adicionei mais opções. Você pode definir o tamanho máximo da fonte e também pode limitar o tamanho da fonte usando largura, altura ou ambas. Vou trabalhar para aceitar valores de largura e altura máx. No elemento wrapper.
Edit3: Eu atualizei o plugin para a versão 1.2.0. Limpeza principal no código e novas opções (verticalAlign, horizontalAlign, textAlign) e suporte para elementos internos dentro da tag span (como quebras de linha ou ícones impressionantes de fontes).
fonte
Isso é baseado no que o GeekyMonkey postou acima, com algumas modificações.
fonte
Aqui está um método de loop aprimorado que usa a pesquisa binária para encontrar o maior tamanho possível que se encaixa no pai nas poucas etapas possíveis (isso é mais rápido e preciso do que o tamanho de uma fonte fixa). O código também é otimizado de várias maneiras para desempenho.
Por padrão, serão executadas 10 etapas de pesquisa binária, que chegarão a 0,1% do tamanho ideal. Em vez disso, você pode definir numIter com algum valor N para obter 1/2 ^ N do tamanho ideal.
Chame-o com um seletor de CSS, por exemplo:
fitToParent('.title-span');
fonte
vAlign
epadding
.vAlign == true
define a altura da linha do elemento selecionado para a altura dos pais. O preenchimento diminui o tamanho final pelo valor passado. O padrão é 5. Eu acho que parece muito bom.Eu criei uma diretiva para o AngularJS - profundamente inspirada na resposta do GeekyMonkey, mas sem a dependência do jQuery.
Demo: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
Marcação
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
Directiva
fonte
resizeText
parece ser chamado antes deng-bind
realmente atribuir o texto ao elemento, resultando em seu dimensionamento com base no texto anterior e não no texto atual. Isso não é tão ruim na demonstração acima, onde é chamado repetidamente à medida que o usuário digita, mas se for chamado uma vez passando de nulo para o valor real (como em uma ligação unidirecional), permanecerá no tamanho máximo.Bifurquei o script acima de Marcus Ekwall: https://gist.github.com/3945316 e o ajustei de acordo com minhas preferências; ele agora é acionado quando a janela é redimensionada, para que a criança sempre se encaixe no seu contêiner. Eu colei o script abaixo para referência.
fonte
Aqui está a minha modificação da resposta do OP.
Em resumo, muitas pessoas que tentaram otimizar isso reclamaram que um loop estava sendo usado. Sim, enquanto os loops podem ser lentos, outras abordagens podem ser imprecisas.
Portanto, minha abordagem usa a Pesquisa binária para encontrar o melhor tamanho da fonte:
Isso também permite que o elemento especifique a fonte mínima e máxima:
Além disso, esse algoritmo é sem unidade. Você pode especificar
em
,rem
,%
, etc. e ele vai usar isso para o seu resultado final.Aqui está o violino: https://jsfiddle.net/fkhqhnqe/1/
fonte
Eu tive exatamente o mesmo problema com o meu site. Eu tenho uma página exibida em um projetor, em paredes, telas grandes.
Como não sei o tamanho máximo da minha fonte, reutilizei o plug-in acima do @GeekMonkey, mas aumentando o tamanho da fonte:
fonte
Aqui está uma versão da resposta aceita, que também pode receber um parâmetro minFontSize.
fonte
Você pode usar o FitText.js ( página do github ) para resolver esse problema. É realmente pequeno e eficiente em comparação com o TextFill. O TextFill usa um loop while caro e o FitText não.
O FitText também é mais flexível (eu o uso em um projeto com requisitos muito especiais e funciona como um campeão!).
HTML:
Você também pode definir opções para ele:
CSS:
E se você precisar, o FitText também possui uma versão sem jQuery .
fonte
EDIT: este código foi usado para mostrar notas em cima de um vídeo HTML5. Ele muda o tamanho da fonte rapidamente quando o vídeo é redimensionado (quando a janela do navegador é redimensionada.) As notas foram conectadas ao vídeo (assim como as notas do YouTube), e é por isso que o código usa instâncias em vez de um identificador DOM diretamente.
Conforme a solicitação, lançarei algum código que usei para conseguir isso. (Caixas de texto em um vídeo HTML5.) O código foi escrito há muito tempo e, francamente, acho bastante bagunçado. Como a pergunta já foi respondida e uma resposta já foi aceita há muito tempo, não me importo em reescrever isso. Mas se alguém quiser simplificar um pouco, você é bem-vindo!
Você provavelmente precisará ajustar esses números de família de fontes para família de fontes. Uma boa maneira de fazer isso é baixar um visualizador gráfico gratuito chamado GeoGebra. Altere o comprimento do texto e o tamanho da caixa. Então você define manualmente o tamanho. Plote os resultados manuais no sistema de coordenadas. Em seguida, você insere as duas equações que eu publiquei aqui e ajusta os números até que o gráfico "meu" se ajuste aos seus próprios pontos plotados manualmente.
fonte
As soluções iterativas propostas podem ser aceleradas dramaticamente em duas frentes:
1) Multiplique o tamanho da fonte por alguma constante, em vez de adicionar ou subtrair 1.
2) Primeiro, use zero uma constante de curso, por exemplo, o dobro do tamanho de cada loop. Então, com uma idéia aproximada de onde começar, faça o mesmo com um ajuste mais preciso, digamos, multiplique por 1,1. Enquanto o perfeccionista pode querer o tamanho exato de pixel inteiro da fonte ideal, a maioria dos observadores não percebe a diferença entre 100 e 110 pixels. Se você é um perfeccionista, repita uma terceira vez com um ajuste ainda mais refinado.
Em vez de escrever uma rotina ou plug-in específico que responda à pergunta exata, confio apenas nas idéias básicas e escrevo variações do código para lidar com todos os tipos de problemas de layout, não apenas texto, incluindo divs, extensões, imagens. .. por largura, altura, área, ... dentro de um contêiner, combinando com outro elemento ....
Aqui está um exemplo:
fonte
Esta é a solução mais elegante que eu criei. Ele usa pesquisa binária, fazendo 10 iterações. A maneira ingênua era fazer um loop while e aumentar o tamanho da fonte em 1 até o elemento começar a transbordar. Você pode determinar quando um elemento começa a exceder usando element.offsetHeight e element.scrollHeight . Se scrollHeight for maior que offsetHeight, você terá um tamanho de fonte muito grande.
A pesquisa binária é um algoritmo muito melhor para isso. Também é limitado pelo número de iterações que você deseja executar. Basta ligar para flexFont e insira o id div e ajusta o tamanho da fonte entre 8px e 96px .
Passei algum tempo pesquisando esse tópico e tentando diferentes bibliotecas, mas, no final das contas, acho que essa é a solução mais fácil e direta que realmente funcionará.
Observe que, se você quiser, pode mudar para usar
offsetWidth
escrollWidth
ou adicionar ambos a esta função.fonte
ReferenceError: lastSizeTooSmall is not defined
. Talvez isso precise ser definido em algum lugar?Eu tenho o mesmo problema e a solução é basicamente usar javascript para controlar o tamanho da fonte. Veja este exemplo no codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Este exemplo é apenas para altura, talvez você precise colocar alguns if's sobre a largura.
fonte
eu gostei
fonte
Só queria adicionar minha versão para contenteditables.
fonte
Eu encontrei uma maneira de impedir o uso de loops para reduzir o texto. Ele ajusta o tamanho da fonte multiplicando-o pela taxa entre a largura do contêiner e a largura do conteúdo. Portanto, se a largura do contêiner for 1/3 do conteúdo, o tamanho da fonte será reduzido em 1/3 e a largura do contêiner. Para aumentar, usei um loop while, até que o conteúdo seja maior que o contêiner.
Este código é parte de um teste que eu carreguei no Github https://github.com/ricardobrg/fitText/
fonte
Fui com a solução geekMonkey, mas é muito lento. O que ele faz é ajustar o tamanho da fonte ao máximo (maxFontPixels) e depois verificar se ele se encaixa dentro do contêiner. caso contrário, reduz o tamanho da fonte em 1px e verifica novamente. Por que não simplesmente verificar a altura do contêiner anterior e enviar esse valor? (sim, eu sei o porquê, mas agora criei uma solução, que só funciona na altura e também possui uma opção min / max)
Aqui está uma solução muito mais rápida:
e este seria o HTML:
Novamente: esta solução verifica apenas a altura do contêiner. É por isso que essa função não precisa verificar se o elemento se encaixa dentro. Mas também implementei um valor min / max (40min, 150max), portanto, para mim, isso funciona perfeitamente bem (e também redimensiona janelas).
fonte
Aqui está outra versão desta solução:
fonte