Me pregunto si hay una manera de contar líneas dentro de un div, por ejemplo. Digamos que tenemos un div como este:
<div id="content">hello how are you?</div>
Dependiendo de muchos factores, el div puede tener una, dos o incluso cuatro líneas de texto. ¿Hay alguna forma de que el script lo sepa?
En otras palabras, ¿los saltos automáticos están representados en DOM?
javascript
html
dom
buti-oxa
fuente
fuente
line-height
(que no se establece explícitamente) sería usarwindow.getComputedStyle(element, null).getPropertyValue('line-height')
Una solución es encerrar cada palabra en una etiqueta span usando un script. Entonces, si la dimensión Y de una etiqueta de extensión dada es menor que la de su predecesor inmediato, se ha producido un salto de línea.
fuente
Consulte la función getClientRects () que se puede usar para contar el número de líneas en un elemento. Aquí hay un ejemplo de cómo usarlo.
Devuelve un objeto DOM de JavaScript. La cantidad de líneas se puede conocer haciendo esto:
Puede devolver la altura de cada línea, y más. Vea toda la gama de cosas que puede hacer agregando esto a su script y luego buscando en el registro de su consola.
Aunque algunas cosas a tener en cuenta es que solo funciona si el elemento contenedor está en línea, sin embargo, puede rodear el elemento en línea contenedor con un elemento de bloque para controlar el ancho de esta manera:
Aunque no recomiendo codificar el estilo así. Es solo por ejemplo.
fuente
No estaba satisfecho con las respuestas aquí y con otras preguntas. La respuesta mejor calificada no tiene en cuenta
padding
oborder
, por lo tanto, obviamente ignorabox-sizing
. Mi respuesta combina algunas técnicas aquí y en otros hilos para obtener una solución que funcione a mi entera satisfacción.No es perfecto: cuando no se pudo recuperar ningún valor numérico para
line-height
(por ejemplo,normal
orinherit
), solo utiliza elfont-size
multiplicado por1.2
. Quizás alguien más pueda sugerir una forma confiable de detectar el valor de píxel en esos casos.Aparte de eso, ha podido manejar correctamente la mayoría de los estilos y casos que le he presentado.
jsFiddle para jugar y probar. También en línea a continuación.
fuente
Clone el objeto contenedor y escriba 2 letras y calcule la altura. Esto devuelve la altura real con todo el estilo aplicado, altura de línea, etc. Ahora, calcule el objeto de altura / el tamaño de una letra. En Jquery, la altura excede el relleno, el margen y el borde, es genial calcular la altura real de cada línea:
Si usa una fuente rara con diferente altura de cada letra, esto no funciona. Pero funciona con todas las fuentes normales, como Arial, mono, comics, Verdana, etc. Pruebe con su fuente.
Ejemplo:
Resultado:
6 Lines
Funciona en todos los navegadores sin funciones raras fuera de los estándares.
Verificación: https://jsfiddle.net/gzceamtr/
fuente
clone
→cloneNode
,hide
→style.visibility = "hidden"
,html('a<br>b')
→textContent='a\r\nb'
,appendTo('body')
→document.documentElement.appendChild
,height()
→getBoundingClientRect().height
Para aquellos que usan jQuery http://jsfiddle.net/EppA2/3/
fuente
$(selector).css('line-height');
, no obtendrá un número de esa función.Estoy convencido de que ahora es imposible. Fue, sin embargo.
La implementación de getClientRects de IE7 hizo exactamente lo que quiero. Abra esta página en IE8, intente actualizarla variando el ancho de la ventana y vea cómo el número de líneas en el primer elemento cambia en consecuencia. Aquí están las líneas clave del javascript de esa página:
Desafortunadamente para mí, Firefox siempre devuelve un rectángulo de cliente por elemento, e IE8 hace lo mismo ahora. (La página de Martin Honnen funciona hoy porque IE la muestra en la vista de compatibilidad de IE; presione F12 en IE8 para jugar con diferentes modos).
Esto es triste. Parece que una vez más, la implementación literal pero inútil de Firefox de la especificación ganó sobre la útil de Microsoft. ¿O echo de menos una situación en la que los nuevos getClientRects pueden ayudar a un desarrollador?
fuente
basado en la respuesta de GuyPaddock de arriba, esto parece funcionar para mí
el truco aquí es aumentar la altura de la línea tanto que "tragará" cualquier diferencia de navegador / sistema operativo en la forma en que representan las fuentes
Comprobado con varios estilos y diferentes tamaños de fuente / familias, lo único que no tiene en cuenta (ya que en mi caso no importó) es el relleno, que se puede agregar fácilmente a la solución.
fuente
No, no de manera confiable. Simplemente hay demasiadas variables desconocidas
La lista continua. Algún día espero que haya un método para lograr esto de manera confiable con JavaScript, pero hasta que llegue ese día, no tendrás suerte.
Odio este tipo de respuestas y espero que alguien pueda demostrar que estoy equivocado.
fuente
Debería poder dividir ('\ n'). Length y obtener los saltos de línea.
actualización: esto funciona en FF / Chrome pero no en IE.
fuente
getClientRects
devuelva el cliente de esta manera y si desea obtener las líneas, use la siguiente función de esta manerafuente
Encontré una forma de calcular el número de línea cuando desarrollo un editor html. El método principal es que:
En IE puede llamar a getBoundingClientRects, devuelve cada línea como un rectángulo
En webkit o en el nuevo motor html estándar, devuelve cada elemento o rectángulos de cliente de nodo, en este caso puede comparar cada rectángulo, quiero decir que cada uno debe ser un rectángulo es el más grande, por lo que puede ignorar esos rectángulos cuya altura es menor (si hay una parte superior de un rectángulo más pequeña que ella y una parte inferior más grande que ella, la condición es verdadera).
así que veamos el resultado de la prueba:
El rectángulo verde es el rectángulo más grande de cada fila.
El rectángulo rojo es el límite de selección.
El rectángulo azul es el límite desde el inicio hasta la selección después de expandirse, vemos que puede ser más grande que el rectángulo rojo, por lo que debemos verificar el fondo de cada rectángulo para limitarlo debe ser más pequeño que el fondo del rectángulo rojo.
fuente
Prueba esta solución:
Puedes verlo en acción aquí: https://jsfiddle.net/u0r6avnt/
Intente cambiar el tamaño de los paneles en la página (para hacer que el lado derecho de la página sea más ancho o más corto) y luego ejecútelo nuevamente para ver que puede decir de manera confiable cuántas líneas hay.
Este problema es más difícil de lo que parece, pero la mayor parte de la dificultad proviene de dos fuentes:
La representación de texto es de nivel demasiado bajo en los navegadores para ser consultado directamente desde JavaScript. Incluso el pseudo-selector CSS :: primera línea no se comporta como lo hacen otros selectores (no puede invertirlo, por ejemplo, para aplicar estilo a todos menos a la primera línea).
El contexto juega un papel importante en la forma de calcular el número de líneas. Por ejemplo, si la altura de línea no se estableció explícitamente en la jerarquía del elemento de destino, es posible que vuelva a ser "normal" como altura de línea. Además, el elemento podría estar utilizando
box-sizing: border-box
y, por lo tanto, estar sujeto a relleno.Mi enfoque minimiza el n. ° 2 tomando el control de la altura de la línea directamente y factorizando el método de dimensionamiento de la caja, lo que lleva a un resultado más determinista.
fuente
En ciertos casos, como un enlace que abarca varias filas en texto no justificado, puede obtener el recuento de filas y cada coordenada de cada línea, cuando usa esto:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
Esto funciona porque cada línea sería diferente aunque sea ligeramente. Mientras lo sean, el renderizador los dibujará como un "rectángulo" diferente.
fuente
Siguiendo la sugerencia de @BobBrunius 2010, creé esto con jQuery. Sin duda podría mejorarse, pero puede ayudar a algunos.
fuente
Puede comparar la altura del elemento y la altura del elemento con
line-height: 0
fuente