Estou tentando calcular a largura do texto usando jQuery. Não tenho certeza do quê, mas definitivamente estou fazendo algo errado.
Então, aqui está o código:
var c = $('.calltoaction');
var cTxt = c.text();
var cWidth = cTxt.outerWidth();
c.css('width' , cWidth);
Respostas:
Isso funcionou melhor para mim:
fonte
'</span>'
, embora não pareça fazer diferença (funcionou com ou sem ele no FF9).Esta é uma função melhor do que outras postadas porque
<input>
,<span>
ou"string"
.Demo: http://jsfiddle.net/philfreo/MqM76/
fonte
Minha solução
Basicamente, uma melhoria em relação a Rune, que não usa
.html
tão levianamentefonte
/
antes do colchete de fechamento da<span>
tag:calculator = $('<span style="display: inline-block;" />'),
As
textWidth
funções fornecidas nas respostas e que aceitam astring
como argumento não levarão em conta espaços em branco à esquerda e à direita (aqueles não são renderizados no contêiner fictício). Além disso, eles não funcionarão se o texto contiver qualquer marcação html (uma sequência secundária<br>
não produzirá nenhuma saída e
retornará o comprimento de um espaço).Este é apenas um problema para as
textWidth
funções que aceitam umstring
, porque se um elemento DOM é fornecido e.html()
é chamado sobre o elemento, então provavelmente não há necessidade de corrigir isso para esse caso de uso.Mas se, por exemplo, você está calculando a largura do texto para modificar dinamicamente a largura de um
input
elemento de texto conforme o usuário digita (meu caso de uso atual), você provavelmente desejará substituir os espaços à esquerda e à direita por
e codificar a string para html.Usei a solução de philfreo, então aqui está uma versão dela que corrige isso (com comentários sobre adições):
fonte
font-size
. Tive que adicionarcss('font-size'), this.css('font-size'))
para que funcionasse. Alguma ideia por quefont
sozinho não copia esse valor?.css
método existente , mas vejo que meus colchetes estão errados. Deve sercss('font-size', this.css('font-size'))
.As funções de largura do jQuery podem ser um pouco confusas ao tentar determinar a largura do texto devido a modelos de caixa inconsistentes. A maneira certa seria injetar div dentro do seu elemento para determinar a largura real do texto:
Para usar este mini plug-in, basta:
fonte
span
você obtém zero. Tentei essa solução em umH2
, em que os elementos pai têm overflow oculto e só consigo o comprimento truncado do texto. Talvez uma explicação de como isso deveria funcionar ajudasse a fazer com que funcionasse melhor?Achei que essa solução funciona bem e herda a fonte de origem antes do tamanho:
fonte
org.css("font-weight")
. Além disso, eu diria que aif(!text)
parte não é intuitiva. Se eu usar, por exemplojQuery("#someContainer").textWidth("Lorem ipsum")
, gostaria de saber a largura do texto de "Lorem ipsum" quando aplicado naquele contêiner específico.Nem Rune nem Brain estavam funcionando para mim no caso de o elemento que estava segurando o texto ter largura fixa. Fiz algo semelhante ao Okamera. Ele usa menos seletores.
EDITAR: Provavelmente não funcionará para elementos que usam relativo
font-size
, já que o código a seguir insere ohtmlCalc
elemento em,body
assim, perde a informação sobre a relação dos pais.fonte
this
já é um objeto jQuery, portanto,$(this)
é redundante.Se você está tentando fazer isso com texto em uma caixa de seleção ou se os dois não estão funcionando, tente este:
ou
se você quiser pegar o texto primeiro
fonte
a coisa, você está fazendo errado, que você está chamando um método em cTxt, que é uma string simples e não um objeto jQuery. cTxt é realmente o texto contido.
fonte
Ligeira mudança no de Nico, já que .children () retornará um conjunto vazio se estivermos fazendo referência a um elemento de texto como h1 ou p . Portanto, usaremos .contents () em vez disso, e usaremos isso em vez de $ (this), pois estamos criando um método em um objeto jQuery.
fonte
depois de perseguir um fantasma por dois dias, tentando descobrir por que a largura de um texto estava incorreta, percebi que eram os espaços em branco na string de texto que impediriam o cálculo da largura.
então, outra dica é verificar se os espaços em branco estão causando problemas. usar
espaço ininterrupto e veja se isso o conserta.
as outras funções que as pessoas sugeriram também funcionam bem, mas foram os espaços em branco que causaram problemas.
fonte
white-space: nowrap
ao CSS embutido para evitar isso.Se você está tentando determinar a largura de uma mistura de nós de texto e elementos dentro de um determinado elemento, você precisa envolver todo o conteúdo com wrapInner () , calcular a largura e, em seguida, desembrulhar o conteúdo.
* Nota: Você também precisará estender o jQuery para adicionar uma função unbrapInner (), pois ela não é fornecida por padrão.
fonte
Expandindo a resposta de @philfreo:
Eu adicionei a capacidade de verificar
text-transform
, já que coisas comotext-transform: uppercase
geralmente tendem a tornar o texto mais amplo.fonte
fonte
Chame getColumnWidth () para obter o com do texto. Isso funciona perfeitamente bem.
Nota: - Se você quiser .css embutidos, passe os detalhes da fonte apenas no estilo.
fonte
Modifiquei o código de Nico para atender às minhas necessidades.
Estou usando .contents () porque .children () não retorna nós de texto que eu precisava. Também descobri que a largura retornada foi impactada pela largura da janela de visualização, o que estava causando quebra de linha, então estou usando espaço em branco: nowrap; para obter a largura correta, independentemente da largura da janela de visualização.
fonte
quase um forro. Dá a você o com do primeiro personagem
fonte
Não consegui fazer com que nenhuma das soluções listadas funcionasse 100%, então criei este híbrido , baseado em ideias de @chmurson (que por sua vez era baseado em @Okamera) e também de @philfreo:
Notas:
this
dentro de um método de extensão jQuery já é um objeto jQuery, então não há necessidade de todos os extras$(this)
que muitos exemplos têm.white-space: nowrap
, apenas para garantir que mede como uma única linha (e não quebra de linha com base em outro estilo de página).font
sozinho e tive que copiar explicitamentefont-size
também. Não tenho certeza do porquê ainda (ainda investigando).@philfreo
.fonte
Às vezes, você também precisa medir a altura adicional e não apenas o texto , mas também a largura do HTML . Peguei a resposta @philfreo e tornei-a mais flexível e útil:
fonte
a largura do texto pode ser diferente para pais diferentes, por exemplo, se você adicionar um texto na tag h1, ele será mais largo do que div ou rótulo, então minha solução é esta:
fonte
Tive problemas com soluções como @ rune-kaagaard para grandes quantidades de texto. Eu descobri isso:
JSFiddle GitHub
fonte
eu acho que você deveria usar
$('.calltoaction').val;
Além disso, eu estaria usando id (#) em vez de uma classe para isso .. se vc tiver mais de uma dessas classes, como isso lidaria?
fonte