Me gustaría usar JavaScript para calcular el ancho de una cadena. ¿Es esto posible sin tener que usar un tipo de letra monoespacio?
Si no está integrado, mi única idea es crear una tabla de anchos para cada carácter, pero esto no es razonable, especialmente para Unicode y diferentes tamaños de letra (y todos los navegadores).
javascript
textbox
Jacob
fuente
fuente
Respuestas:
Crea un DIV con los siguientes estilos. En su JavaScript, establezca el tamaño de fuente y los atributos que está tratando de medir, coloque su cadena en el DIV y luego lea el ancho y alto actuales del DIV. Se estirará para adaptarse al contenido y el tamaño estará dentro de unos pocos píxeles del tamaño de la cadena representada.
fuente
+1
sirve cada dimensión?En HTML 5 , puede usar el método Canvas.measureText (más explicaciones aquí ).
Prueba este violín :
Este violín compara este método de Canvas con una variación del método basado en DOM de Bob Monteverde , para que pueda analizar y comparar la precisión de los resultados.
Este enfoque tiene varias ventajas, que incluyen:
textAlign
ytextBaseline
.NOTA: Cuando agregue el texto a su DOM, recuerde también tener en cuenta el relleno, el margen y el borde .
NOTA 2: en algunos navegadores, este método produce una precisión de subpíxel (el resultado es un número de coma flotante), en otros no (el resultado es solo un int). Es posible que desee ejecutar
Math.floor
(oMath.ceil
) en el resultado, para evitar inconsistencias. Dado que el método basado en DOM nunca tiene una precisión de subpíxel, este método tiene una precisión aún mayor que los otros métodos aquí.De acuerdo con este jsperf (gracias a los contribuyentes en los comentarios), el método Canvas y el método basado en DOM son casi igualmente rápidos, si se agrega el almacenamiento en caché al método basado en DOM y no está utilizando Firefox. En Firefox, por alguna razón, este método de Canvas es mucho más rápido que el método basado en DOM (a partir de septiembre de 2014).
fuente
strokeText()
ofillText()
. ¿Quizás quisiste comentar una respuesta diferente?Aquí hay uno que batí sin ningún ejemplo. Parece que todos estamos en la misma página.
Usarlo es simple:
"a string".width()
** Agregado
white-space: nowrap
para que se puedan calcular cadenas con un ancho mayor que el ancho de la ventana.fuente
String
ya que disminuye la separación de preocupaciones de su programa (código central separado frente a código UI). Imagine que quiere portar su código central a una plataforma con un marco de interfaz de usuario muy diferente ...o[0].getBoundingClientRect().width
como se sugiere aquí: stackoverflow.com/a/16072668/936397jQuery:
fuente
Esto funciona para mi ...
fuente
La biblioteca de JavaScript ExtJS tiene una gran clase llamada Ext.util.TextMetrics que "proporciona mediciones precisas de píxeles para bloques de texto para que pueda determinar exactamente qué tan alto y ancho, en píxeles, será un bloque de texto dado". Puede usarlo directamente o ver su código fuente para ver cómo se hace.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
fuente
¡Me gusta tu "única idea" de hacer un mapa de ancho de caracteres estático! En realidad funciona bien para mis propósitos. A veces, por razones de rendimiento o porque no tiene fácil acceso a un DOM, es posible que solo desee una calculadora independiente rápida y hacky calibrada para una sola fuente. Así que aquí hay uno calibrado para Helvetica; pasar una cadena y (opcionalmente) un tamaño de fuente:
Esa matriz fea gigante tiene anchos de caracteres ASCII indexados por código de caracteres. Por lo tanto, esto solo es compatible con ASCII (de lo contrario, supone un ancho de caracteres promedio). Afortunadamente, el ancho básicamente se escala linealmente con el tamaño de fuente, por lo que funciona bastante bien en cualquier tamaño de fuente. Es notablemente carente de conocimiento de kerning o ligaduras o lo que sea.
Para "calibrar" acabo de representar cada carácter hasta el código 126 (la poderosa tilde) en un svg y obtuve el cuadro delimitador y lo guardé en esta matriz; Más código y explicación y demostración aquí .
fuente
* fontSize
y simplemente usarlosEscribí una pequeña herramienta para eso. Quizás sea útil para alguien. Funciona sin jQuery .
https://github.com/schickling/calculate-size
Uso:
Violín: http://jsfiddle.net/PEvL8/
fuente
Puede usar el lienzo para no tener que lidiar tanto con las propiedades css:
fuente
Esto debería funcionar siempre que la etiqueta <span> no tenga otros estilos aplicados. offsetWidth incluirá el ancho de cualquier borde, relleno horizontal, ancho de la barra de desplazamiento vertical, etc.
fuente
Los recortes de código a continuación, "calculan" el ancho de la etiqueta span, le agrega "..." si es demasiado largo y reduce la longitud del texto, hasta que encaje en su padre (o hasta que haya intentado más de mil veces)
CSS
HTML
JavaScript (con jQuery)
fuente
Lo mejor es detectar si el texto encaja justo antes de mostrar el elemento. Entonces puede usar esta función que no requiere que el elemento esté en la pantalla.
Uso:
fuente
En caso de que alguien más haya llegado aquí buscando una forma de medir el ancho de una cadena y una forma de saber cuál es el tamaño de fuente más grande que se ajustará a un ancho particular, aquí hay una función que se basa en la solución de @ Domi con una búsqueda binaria :
fuente
Prueba este código:
fuente
El ancho y la altura de un texto se pueden obtener con
clientWidth
yclientHeight
asegúrese de que la propiedad de posición de estilo esté establecida en absoluta
no se requiere estar dentro de a
div
, puede estar dentro de ap
o aspan
fuente
Partiendo de la respuesta de Deepak Nadar , cambié los parámetros de las funciones para aceptar estilos de texto y fuente. No necesita hacer referencia a un elemento. Además,
fontOptions
tienen valores predeterminados, por lo que no necesita suministrarlos todos.fuente
Supongo que esto es bastante similar a la entrada de Depak, pero se basa en el trabajo de Louis Lazaris publicado en un artículo en una impresionante página web
El evento fit se usa para ejecutar la llamada a la función inmediatamente después de que la función esté asociada al control.
por ejemplo: $ ('input'). autofit (). trigger ("fit");
fuente
Sin jQuery:
fuente
Violín de ejemplo de trabajo: http://jsfiddle.net/tdpLdqpo/1/
HTML:
Código JavaScript:
fuente
Al resumir todos los anchos de rectángulo devueltos se obtiene el ancho total del texto en píxeles.
fuente
Hice un pequeño módulo ES6 (usa jQuery):
Fácil de usar:
Lo bueno que puedes notar es que permite tener en cuenta los atributos CSS, ¡incluso los rellenos!
fuente
También puede hacer esto con createRange, que es más preciso, que la técnica de clonación de texto:
fuente
fuente