Gostaria de saber se existe uma maneira de contar linhas dentro de uma div, por exemplo. Digamos que temos uma div assim:
<div id="content">hello how are you?</div>
Dependendo de muitos fatores, a div pode ter uma, duas ou até quatro linhas de texto. Existe alguma maneira de o script saber?
Em outras palavras, as interrupções automáticas são representadas no DOM?
javascript
html
dom
buti-oxa
fonte
fonte
line-height
(que não é explicitamente definido) seria usarwindow.getComputedStyle(element, null).getPropertyValue('line-height')
Uma solução é colocar todas as palavras em uma tag span usando script. Então, se a dimensão Y de uma determinada tag de span for menor que a de seu predecessor imediato, ocorrerá uma quebra de linha.
fonte
Confira a função getClientRects () que pode ser usada para contar o número de linhas em um elemento. Aqui está um exemplo de como usá-lo.
Retorna um objeto DOM javascript. A quantidade de linhas pode ser conhecida fazendo o seguinte:
Pode retornar a altura de cada linha e muito mais. Veja a variedade completa de coisas que ele pode fazer adicionando isso ao seu script e procurando no log do console.
Apesar de algumas coisas a serem observadas, ele só funciona se o elemento contido estiver embutido, no entanto, você pode colocar o elemento embutido embutido com um elemento de bloco para controlar a largura da seguinte maneira:
Embora eu não recomendo codificar o estilo assim. É apenas para fins de exemplo.
fonte
Eu não estava satisfeito com as respostas aqui e com outras perguntas. A resposta mais alta nominal não leva
padding
ouborder
em conta, e, portanto, obviamente, ignorabox-sizing
também. Minha resposta combina algumas técnicas aqui e em outros tópicos para obter uma solução que funcione para minha satisfação.Não é perfeito: quando nenhum valor numérico pôde ser recuperado para
line-height
(por exemplo,normal
ouinherit
), apenas usa ofont-size
multiplicado por1.2
. Talvez alguém possa sugerir uma maneira confiável de detectar o valor do pixel nesses casos.Fora isso, ele conseguiu lidar corretamente com a maioria dos estilos e casos que eu joguei nele.
jsFiddle para brincar e testar. Também em linha abaixo.
fonte
Clone o objeto do contêiner e escreva 2 letras e calcule a altura. Isso retorna a altura real com todos os estilos aplicados, altura da linha, etc. Agora, calcule o objeto de altura / o tamanho de uma letra. No Jquery, a altura excede o preenchimento, a margem e a borda, é ótimo calcular a altura real de cada linha:
Se você usar uma fonte rara com altura diferente de cada letra, isso não funcionará. Mas funciona com todas as fontes normais, como Arial, mono, quadrinhos, Verdana, etc. Teste com sua fonte.
Exemplo:
Resultado:
6 Lines
Funciona em todos os navegadores sem funções raras fora dos padrões.
Verifique: https://jsfiddle.net/gzceamtr/
fonte
clone
→cloneNode
,hide
→style.visibility = "hidden"
,html('a<br>b')
→textContent='a\r\nb'
,appendTo('body')
→document.documentElement.appendChild
,height()
→getBoundingClientRect().height
Para quem usa jQuery http://jsfiddle.net/EppA2/3/
fonte
$(selector).css('line-height');
, você não obterá um número dessa função.Estou convencido de que agora é impossível. Foi, no entanto.
A implementação do getClientRects do IE7 fez exatamente o que eu quero. Abra esta página no IE8, tente atualizá-la, variando a largura da janela e veja como o número de linhas no primeiro elemento muda de acordo. Aqui estão as principais linhas do javascript dessa página:
Infelizmente para mim, o Firefox sempre retorna um retângulo de cliente por elemento, e o IE8 faz o mesmo agora. (A página de Martin Honnen funciona hoje porque o IE a processa na exibição compatível com o IE; pressione F12 no IE8 para reproduzir com modos diferentes.)
Isso é triste. Parece que mais uma vez a implementação literal, mas sem valor, das especificações do Firefox conquistou a útil da Microsoft. Ou sinto falta de uma situação em que o novo getClientRects pode ajudar um desenvolvedor?
fonte
com base na resposta de GuyPaddock acima, isso parece funcionar para mim
o truque aqui é aumentar tanto a altura da linha que "engolirá" quaisquer diferenças de navegador / SO na maneira como elas renderizam fontes
Verifiquei com vários estilos e tamanhos de fonte / famílias diferentes, o que não leva em consideração (já que no meu caso não importava), é o preenchimento - que pode ser facilmente adicionado à solução.
fonte
Não, não de forma confiável. Existem simplesmente muitas variáveis desconhecidas
A lista continua. Algum dia, espero que exista um método desse tipo para realizar isso de forma confiável com JavaScript, mas até esse dia chegar, você estará sem sorte.
Eu odeio esse tipo de resposta e espero que alguém possa me provar que estou errado.
fonte
Você deve poder dividir ('\ n'). Length e obter as quebras de linha.
update: funciona no FF / Chrome, mas não no IE.
fonte
getClientRects
devolver os rects clientes como este e se você quiser obter as linhas, use a função follow como estefonte
Eu encontrei uma maneira de calcular o número da linha quando desenvolvo um editor de html. O método principal é que:
No IE, você pode chamar getBoundingClientRects, ele retorna cada linha como um retângulo
No webkit ou no novo mecanismo html padrão, ele retorna os retângulos de cada elemento ou nó do nó; nesse caso, você pode comparar cada retângulo, quero dizer que cada um deve ter um retângulo maior, portanto, você pode ignorar aqueles retângulos cuja altura é menor (se existe a parte superior de um retângulo menor que a parte inferior e a parte inferior maior, a condição é verdadeira.)
então vamos ver o resultado do teste:
O retângulo verde é o maior retângulo em cada linha
O retângulo vermelho é o limite de seleção
O retângulo azul é o limite do início à seleção após a expansão; vemos que ele pode ser maior que o retângulo vermelho; portanto, precisamos verificar a parte inferior de cada retângulo para limitar que deve ser menor que a parte inferior do retângulo vermelho.
fonte
Experimente esta solução:
Você pode vê-lo em ação aqui: https://jsfiddle.net/u0r6avnt/
Tente redimensionar os painéis da página (para aumentar ou diminuir o lado direito da página) e, em seguida, execute-o novamente para verificar se é possível dizer com confiança quantas linhas existem.
Esse problema é mais difícil do que parece, mas a maior parte da dificuldade vem de duas fontes:
A renderização de texto é de nível muito baixo nos navegadores para ser consultada diretamente no JavaScript. Mesmo o pseudo-seletor CSS :: first-line não se comporta exatamente como outros seletores (você não pode invertê-lo, por exemplo, para aplicar estilo a todos, exceto à primeira linha).
O contexto desempenha um papel importante na maneira como você calcula o número de linhas. Por exemplo, se a altura da linha não foi definida explicitamente na hierarquia do elemento de destino, você pode obter "normal" de volta como altura da linha. Além disso, o elemento pode estar sendo usado
box-sizing: border-box
e, portanto, sujeito a preenchimento.Minha abordagem minimiza o número 2, assumindo o controle da altura da linha diretamente e considerando o método de dimensionamento da caixa, levando a um resultado mais determinístico.
fonte
Em certos casos, como um link que se estende por várias linhas em texto não justificado, você pode obter a contagem de linhas e todas as coordenadas de cada linha ao usar isso:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
Isso funciona porque cada linha seria diferente, mesmo que ligeiramente. Contanto que sejam, eles são desenhados como um "retângulo" diferente pelo renderizador.
fonte
Seguindo a sugestão do @BobBrunius 2010, criei isso com o jQuery. Sem dúvida, poderia ser melhorado, mas pode ajudar alguns.
fonte
Você pode comparar a altura e a altura do elemento com
line-height: 0
fonte