Eu tenho uma coleção de elementos de bloco em uma página. Todos eles têm as regras de CSS espaço em branco, estouro, estouro de texto definidas para que o texto excedente seja cortado e reticências sejam usadas.
No entanto, nem todos os elementos estão excedidos.
Existe alguma maneira que eu possa usar o javascript para detectar quais elementos estão transbordando?
Obrigado.
Adicionado: exemplo de estrutura HTML com a qual estou trabalhando.
<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>
Os elementos SPAN sempre se encaixam nas células, eles têm a regra de reticências aplicada. Quero detectar quando as reticências são aplicadas ao conteúdo de texto do SPAN.
javascript
html
css
ellipsis
deanoj
fonte
fonte
Respostas:
Era uma vez que eu precisava fazer isso, e a única solução confiável entre navegadores que encontrei foi o hack job. Não sou o maior fã de soluções como essa, mas certamente produz o resultado correto repetidamente.
A idéia é que você clone o elemento, remova qualquer largura delimitadora e teste se o elemento clonado é maior que o original. Nesse caso, você sabe que terá sido truncado.
Por exemplo, usando jQuery:
Eu fiz um jsFiddle para demonstrar isso, http://jsfiddle.net/cgzW8/2/
Você pode até criar seu próprio pseudo-seletor personalizado para jQuery:
Em seguida, use-o para encontrar elementos
Demonstração: http://jsfiddle.net/cgzW8/293/
Espero que isso ajude, hacky como é.
fonte
white-space: nowrap
.Experimente esta função JS, passando o elemento span como argumento:
fonte
text-overflow:ellipsis
que deveria sere.offsetWidth <= e.scrollWidth
Adicionando à resposta do italo, você também pode fazer isso usando o jQuery.
Além disso, como Smoky apontou, convém usar o jQuery outerWidth () em vez da largura ().
fonte
Para aqueles que usam (ou planejam usar) a resposta aceita por Christian Varga, esteja ciente dos problemas de desempenho.
A clonagem / manipulação do DOM dessa maneira causa o DOM Reflow (veja uma explicação sobre o DOM reflow aqui), que consome extremamente recursos.
O uso da solução de Christian Varga em mais de 100 elementos em uma página causou um atraso de refluxo de 4 segundos durante o qual o encadeamento JS está bloqueado. Considerando que o JS é de thread único, isso significa um atraso significativo no UX para o usuário final.
A resposta de Italo Borssatto deve ser a aceita, foi aproximadamente 10 vezes mais rápida durante meu perfil.
fonte
mouseenter
para ver se uma dica de ferramenta precisa ser mostrada.A resposta do italo é muito boa! No entanto, deixe-me refinar um pouco:
Compatibilidade entre navegadores
Se, de fato, tentar o código e uso superior
console.log
para imprimir os valores dee.offsetWidth
ee.scrollWidth
, você vai notar, no IE, que, mesmo quando você não tem truncagem de texto, uma diferença valor1px
ou2px
é experiente.Portanto, dependendo do tamanho da fonte usado, permita uma certa tolerância!
fonte
elem.offsetWdith VS ele.scrollWidth Este trabalho para mim! https://jsfiddle.net/gustavojuan/210to9p1/
fonte
Este exemplo mostra a dica de ferramenta na tabela de células com o texto truncado. É dinâmico com base na largura da tabela:
Demonstração: https://jsfiddle.net/t4qs3tqs/
Funciona em todas as versões do jQuery
fonte
Acho que a melhor maneira de detectá-lo é usar
getClientRects()
, parece que cada retângulo tem a mesma altura, para que possamos calcular o número de linhas com o número detop
valor diferente .getClientRects
trabalho como estegetRowRects
trabalho como estevocê pode detectar como este
fonte
Todas as soluções realmente não funcionaram para mim, o que funcionou foi comparar os elementos
scrollWidth
com osscrollWidth
de seu pai (ou filho, dependendo de qual elemento possui o gatilho).Quando a criança
scrollWidth
é mais alta que seus pais, significa que.text-ellipsis
está ativa.Quando
event
é o elemento paiQuando
event
é o elemento filhofonte
A
e.offsetWidth < e.scrollWidth
solução nem sempre está funcionando.E se você quiser usar JavaScript puro, recomendo usar isso:
(datilografado)
fonte
A solução @ItaloBorssatto é perfeita. Mas antes de olhar para a SO - tomei minha decisão. Aqui está :)
fonte
Minha implementação)
fonte
existem alguns erros na demo http://jsfiddle.net/brandonzylstra/hjk9mvcy/ mencionados por https://stackoverflow.com/users/241142/iconoclast .
em sua demo, adicione estes códigos funcionará:
fonte