Eu gostaria de usar JavaScript para calcular a largura de uma string. Isso é possível sem a necessidade de usar um tipo de letra monoespaçada?
Se não estiver embutido, minha única idéia é criar uma tabela de larguras para cada caractere, mas isso não é razoável, especialmente para suportar Unicode e tamanhos de tipos diferentes (e todos os navegadores).
javascript
textbox
Jacob
fonte
fonte
Respostas:
Crie um DIV com os seguintes estilos. No seu JavaScript, defina o tamanho da fonte e os atributos que você está tentando medir, coloque sua string no DIV e leia a largura e a altura atuais do DIV. Ele se estenderá para caber no conteúdo e o tamanho estará a poucos pixels do tamanho renderizado da sequência.
fonte
+1
serve cada dimensão?No HTML 5 , você pode apenas usar o método Canvas.measureText (mais explicações aqui ).
Experimente este violino :
Esse violão compara esse método do Canvas com uma variação do método baseado em DOM de Bob Monteverde , para que você possa analisar e comparar a precisão dos resultados.
Existem várias vantagens nessa abordagem, incluindo:
textAlign
etextBaseline
.NOTA: Ao adicionar o texto ao seu DOM, lembre-se de levar em consideração o preenchimento, a margem e a borda .
NOTA 2: Em alguns navegadores, esse método gera precisão de sub-pixel (resultado é um número de ponto flutuante); em outros, não (resultado é apenas um int). Você pode querer executar
Math.floor
(ouMath.ceil
) o resultado, para evitar inconsistências. Como o método baseado no DOM nunca é preciso com sub-pixels, esse método tem uma precisão ainda maior do que os outros métodos aqui.De acordo com este jsperf (graças aos colaboradores nos comentários), o método Canvas e o método baseado em DOM são igualmente rápidos, se o cache for adicionado ao método baseado em DOM e você não estiver usando o Firefox. No Firefox, por algum motivo, esse método Canvas é muito mais rápido que o método baseado em DOM (em setembro de 2014).
fonte
strokeText()
oufillText()
. Talvez você quisesse comentar uma resposta diferente?Aqui está um que eu juntei sem exemplo. Parece que estamos todos na mesma página.
Usá-lo é simples:
"a string".width()
** Adicionado
white-space: nowrap
para que strings com largura maior que a largura da janela possam ser calculadas.fonte
String
pois diminui a separação de preocupações do seu programa (código principal separado x código da interface do usuário). Imagine que você deseja portar seu código do núcleo de uma plataforma com um quadro UI muito diferente ...o[0].getBoundingClientRect().width
como sugerido aqui: stackoverflow.com/a/16072668/936397jQuery:
fonte
Isso funciona para mim ...
fonte
A biblioteca javascript ExtJS possui uma excelente classe chamada Ext.util.TextMetrics que "fornece medições precisas de pixel para blocos de texto, para que você possa determinar exatamente quão alto e amplo, em pixels, um determinado bloco de texto será". Você pode usá-lo diretamente ou visualizar sua origem no código para ver como isso é feito.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
fonte
Eu gosto da sua "única idéia" de apenas fazer um mapa estático de largura de caracteres! Na verdade, funciona bem para os meus propósitos. Às vezes, por razões de desempenho ou porque você não tem acesso fácil a um DOM, você pode apenas querer uma calculadora rápida e autônoma, calibrada para uma única fonte. Então aqui está um calibrado para Helvetica; passe uma string e (opcionalmente) um tamanho de fonte:
Essa matriz feia gigante tem larguras de caracteres ASCII indexadas pelo código de caracteres. Portanto, isso apenas suporta ASCII (caso contrário, assume uma largura média de caracteres). Felizmente, a largura é dimensionada basicamente linearmente com o tamanho da fonte, portanto funciona muito bem em qualquer tamanho de fonte. Está visivelmente sem qualquer conhecimento de kerning ou ligaduras ou o que seja.
Para "calibrar", renderizei todos os caracteres até o charCode 126 (o poderoso til) em um svg e peguei a caixa delimitadora e salvei-a nessa matriz; mais código, explicação e demonstração aqui .
fonte
* fontSize
e apenas usá-losEu escrevi uma pequena ferramenta para isso. Talvez seja útil para alguém. Funciona sem jQuery .
https://github.com/schickling/calculate-size
Uso:
Fiddle: http://jsfiddle.net/PEvL8/
fonte
Você pode usar a tela para não precisar lidar muito com as propriedades do css:
fonte
Isso deve funcionar desde que a tag <span> não tenha outros estilos aplicados a ela. offsetWidth incluirá a largura de todas as bordas, preenchimento horizontal, largura da barra de rolagem vertical etc.
fonte
O trecho de código abaixo, "calcula" a largura da tag de extensão, anexa "..." a ela se for muito longo e reduz o comprimento do texto, até que caiba no pai (ou até que tente mais do que isso) mil vezes)
CSS
HTML
JavaScript (com jQuery)
fonte
O melhor é detectar se o texto se ajusta logo antes da exibição do elemento. Então você pode usar esta função que não requer que o elemento esteja na tela.
Uso:
fonte
Caso alguém mais chegue aqui procurando uma maneira de medir a largura de uma string e uma maneira de saber qual é o maior tamanho de fonte que caberá em uma largura específica, aqui está uma função que se baseia na solução @ Domi com uma pesquisa binária :
fonte
Tente este código:
fonte
A largura e a altura de um texto podem ser obtidas com
clientWidth
eclientHeight
verifique se a propriedade de posição do estilo está definida como absoluta
não é necessário estar dentro de um
div
, pode estar dentro de ump
ou umspan
fonte
Partindo da resposta de Deepak Nadar , alterei os parâmetros de funções para aceitar estilos de texto e fonte. Você não precisa fazer referência a um elemento. Além disso, eles
fontOptions
têm padrões, para que você não precise fornecer todos eles.fonte
Eu acho que isso é muito parecido com a entrada de Depak, mas é baseado no trabalho de Louis Lazaris publicado em um artigo na página impressionante das redes
O evento de ajuste é usado para executar a chamada de função imediatamente após a função ser associada ao controle.
por exemplo: $ ('input'). autofit (). trigger ("fit");
fonte
Sem jQuery:
fonte
Violino do exemplo de trabalho: http://jsfiddle.net/tdpLdqpo/1/
HTML:
Código JavaScript:
fonte
A soma de todas as larguras de retângulo retornadas gera a largura total do texto em pixels.
fonte
Eu fiz um pequeno módulo ES6 (usa jQuery):
Fácil de usar:
O legal é que você pode notar - ele permite levar em consideração quaisquer atributos CSS, mesmo os preenchimentos!
fonte
Você também pode fazer isso com createRange, que é mais preciso, do que a técnica de clonagem de texto:
fonte
fonte