Necesito mostrar el texto ingresado por el usuario en un div de tamaño fijo. Lo que quiero es que el tamaño de fuente se ajuste automáticamente para que el texto llene el cuadro tanto como sea posible.
Entonces, si el div es 400px x 300px. Si alguien ingresa a ABC, entonces es una fuente realmente grande. Si ingresan un párrafo, entonces sería una fuente pequeña.
Probablemente quiera comenzar con un tamaño de fuente máximo, tal vez 32px, y aunque el texto es demasiado grande para caber en el contenedor, reduzca el tamaño de la fuente hasta que encaje.
Respuestas:
Gracias ataque . Quería usar jQuery.
Me apuntaste en la dirección correcta, y esto es con lo que terminé:
Aquí hay un enlace al complemento: https://plugins.jquery.com/textfill/
Y un enlace a la fuente: http://jquery-textfill.github.io/
y mi html es así
Este es mi primer complemento de jquery, por lo que probablemente no sea tan bueno como debería ser. Los punteros son ciertamente bienvenidos.
fuente
404
.No encontré que ninguna de las soluciones anteriores fuera lo suficientemente adecuada debido al mal rendimiento, así que hice la mía que usa matemáticas simples en lugar de bucles. Debería funcionar bien en todos los navegadores también.
Según este caso de prueba de rendimiento , es mucho más rápido que las otras soluciones encontradas aquí.
Si quieres contribuir, he agregado esto a Gist .
fuente
.css("font-size")
en un bucle. ¿De dónde has sacado eso? Mi solución es probablemente más rápida ya que no tiene ninguna de las cosas elegantes que agregaste a tu complemento. Puede agregar su complemento a jsperf y veremos cuál es el más rápido;)Por mucho que me encanten los votos positivos ocasionales que recibo por esta respuesta (¡gracias!), Este no es realmente el mejor enfoque para este problema. Consulte algunas de las otras respuestas maravillosas aquí, especialmente las que han encontrado soluciones sin bucles.
Aún así, como referencia, aquí está mi respuesta original :
Y aquí hay una versión con clases :
fuente
offsetWidth
, también tuve que crear una variable para el tamaño y luego agregar el pxtextSpan.style.fontSize = size+"px";
La mayoría de las otras respuestas usan un bucle para reducir el tamaño de la fuente hasta que encaje en el div, esto es MUY lento ya que la página necesita volver a representar el elemento cada vez que la fuente cambia de tamaño. Eventualmente tuve que escribir mi propio algoritmo para que funcionara de una manera que me permitiera actualizar su contenido periódicamente sin congelar el navegador del usuario. Agregué alguna otra funcionalidad (rotar texto, agregar relleno) y lo empaqueté como un complemento jQuery, puede obtenerlo en:
https://github.com/DanielHoffmann/jquery-bigtext
simplemente llama
y encajará bien en su contenedor.
Véalo en acción aquí:
http://danielhoffmann.github.io/jquery-bigtext/
Por ahora tiene algunas limitaciones, el div debe tener una altura y un ancho fijos y no admite el ajuste de texto en varias líneas.
Trabajaré para obtener una opción para establecer el tamaño máximo de fuente.
Editar: He encontrado algunos problemas más con el complemento, no maneja otro modelo de caja además del estándar y el div no puede tener márgenes o bordes. Voy a trabajar en él.
Edit2: ahora he solucionado esos problemas y limitaciones y he agregado más opciones. Puede establecer el tamaño máximo de fuente y también puede elegir limitar el tamaño de fuente usando ancho, alto o ambos. Trabajaré para aceptar valores de ancho máximo y alto máximo en el elemento contenedor.
Edit3: he actualizado el complemento a la versión 1.2.0. Limpieza importante en el código y nuevas opciones (verticalAlign, horizontalAlign, textAlign) y soporte para elementos internos dentro de la etiqueta span (como saltos de línea o iconos de fuente impresionante).
fuente
Esto se basa en lo que GeekyMonkey publicó anteriormente, con algunas modificaciones.
fuente
Aquí hay un método de bucle mejorado que utiliza la búsqueda binaria para encontrar el tamaño más grande posible que se ajuste al padre en la menor cantidad de pasos posible (esto es más rápido y más preciso que pasar por un tamaño de fuente fijo). El código también está optimizado de varias maneras para el rendimiento.
De forma predeterminada, se realizarán 10 pasos de búsqueda binaria, que obtendrán un 0.1% del tamaño óptimo. En su lugar, puede establecer numIter en algún valor N para obtener 1/2 ^ N del tamaño óptimo.
Llámalo con un selector CSS, por ejemplo:
fitToParent('.title-span');
fuente
vAlign
ypadding
.vAlign == true
establece la altura de línea del elemento seleccionado a la altura de los padres. El relleno disminuye el tamaño final por el valor pasado. El valor predeterminado es 5. Creo que se ve muy bien.He creado una directiva para AngularJS, inspirada en gran medida por la respuesta de GeekyMonkey pero sin la dependencia de jQuery.
Demostración: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
Margen
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
Directiva
fuente
resizeText
parece ser llamado antes de queng-bind
realmente asigne el texto al elemento, lo que resulta en un tamaño basado en el texto anterior en lugar del texto actual. Esto no es tan malo en la demostración anterior donde se llama repetidamente a medida que el usuario escribe, pero si se llama una vez que pasa del valor nulo al valor real (como en un enlace unidireccional) permanece en el tamaño máximo.Bifurqué el script anterior de Marcus Ekwall: https://gist.github.com/3945316 y lo ajusté a mis preferencias, ahora se dispara cuando se cambia el tamaño de la ventana, para que el niño siempre se ajuste a su contenedor. He pegado el script a continuación para referencia.
fuente
Aquí está mi modificación de la respuesta del OP.
En resumen, muchas personas que intentaron optimizar esto se quejaron de que se estaba utilizando un bucle. Sí, aunque los bucles pueden ser lentos, otros enfoques pueden ser inexactos.
Por lo tanto, mi enfoque utiliza la búsqueda binaria para encontrar el mejor tamaño de fuente:
Esto también permite que el elemento especifique la fuente mínima y máxima:
Además, este algoritmo no tiene unidades. Se puede especificar
em
,rem
,%
, etc, y se va a utilizar para que su resultado final.Aquí está el violín: https://jsfiddle.net/fkhqhnqe/1/
fuente
Tuve exactamente el mismo problema con mi sitio web. Tengo una página que se muestra en un proyector, en paredes, pantallas grandes ...
Como no sé el tamaño máximo de mi fuente, reutilicé el complemento anterior de @GeekMonkey pero incrementé el tamaño de la fuente:
fuente
Aquí hay una versión de la respuesta aceptada que también puede tomar un parámetro minFontSize.
fuente
Puede usar FitText.js ( página github ) para resolver este problema. Es realmente pequeño y eficiente en comparación con TextFill. TextFill utiliza un costoso loop while y FitText no.
Además, FitText es más flexible (¡lo uso en un proyecto con requisitos muy especiales y funciona como un campeón!).
HTML:
También puede configurar opciones para ello:
CSS:
Y si lo necesita, FitText también tiene una versión sin jQuery .
fuente
EDITAR: Este código se usó para mostrar notas en la parte superior de un video HTML5. Cambia el tamaño de fuente sobre la marcha cuando se cambia el tamaño del video (cuando se cambia el tamaño de la ventana del navegador). Las notas se conectaron al video (al igual que las notas en YouTube), por lo que el código usa instancias en lugar de un controlador DOM directamente.
Según la solicitud, agregaré un código que usé para lograr esto. (Cuadros de texto sobre un video HTML5.) El código fue escrito hace mucho tiempo, y francamente creo que es bastante desordenado. Dado que la pregunta ya está respondida y una respuesta ya fue aceptada hace mucho tiempo, no me molesto en volver a escribir esto. Pero si alguien quiere simplificar esto un poco, ¡eres más que bienvenido!
Probablemente necesite ajustar estos números de font-family a font-family. Una buena manera de hacerlo es descargar un visualizador gráfico gratuito llamado GeoGebra. Cambia la longitud del texto y el tamaño del cuadro. Luego establece manualmente el tamaño. Trace los resultados manuales en el sistema de coordenadas. Luego ingresa las dos ecuaciones que he publicado aquí y ajusta los números hasta que "mi" gráfico se ajuste a sus propios puntos trazados manualmente.
fuente
Las soluciones iterativas propuestas se pueden acelerar dramáticamente en dos frentes:
1) Multiplique el tamaño de la fuente por alguna constante, en lugar de sumar o restar 1.
2) Primero, cero en el uso de una constante de curso, digamos, duplicar el tamaño de cada ciclo. Luego, con una idea aproximada de por dónde empezar, haga lo mismo con un ajuste más fino, digamos, multiplique por 1.1. Si bien el perfeccionista puede querer el tamaño exacto de píxel entero de la fuente ideal, la mayoría de los observadores no notan la diferencia entre 100 y 110 píxeles. Si eres un perfeccionista, repite una tercera vez con un ajuste aún más fino.
En lugar de escribir una rutina específica o un complemento que responda a la pregunta exacta, solo confío en las ideas básicas y escribo variaciones del código para manejar todo tipo de problemas de diseño, no solo texto, incluidos los divisores de ajuste, los tramos, las imágenes, etc. .. por ancho, alto, área, ... dentro de un contenedor, haciendo coincidir otro elemento ...
Aquí hay un ejemplo:
fuente
Esta es la solución más elegante que he creado. Utiliza la búsqueda binaria, haciendo 10 iteraciones. La forma ingenua era hacer un ciclo while y aumentar el tamaño de la fuente en 1 hasta que el elemento comenzara a desbordarse. Puede determinar cuándo un elemento comienza a desbordarse utilizando element.offsetHeight y element.scrollHeight . Si scrollHeight es más grande que offsetHeight, tiene un tamaño de fuente que es demasiado grande.
La búsqueda binaria es un algoritmo mucho mejor para esto. También está limitado por el número de iteraciones que desea realizar. Simplemente llame a flexFont e inserte la identificación div y ajustará el tamaño de fuente entre 8px y 96px .
He pasado algún tiempo investigando este tema y probando diferentes bibliotecas, pero finalmente creo que esta es la solución más sencilla y directa que realmente funcionará.
Tenga en cuenta que si lo desea, puede cambiar el uso
offsetWidth
yscrollWidth
, o agregar ambos a esta función.fuente
ReferenceError: lastSizeTooSmall is not defined
. Tal vez eso necesita ser definido en alguna parte?Tengo el mismo problema y la solución es básicamente usar JavaScript para controlar el tamaño de fuente. Verifique este ejemplo en codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Este es un ejemplo solo para la altura, tal vez necesite poner algunos si es sobre el ancho.
fuente
Me gustó
fuente
Solo quería agregar mi versión para contenteditables.
fuente
He encontrado una manera de evitar el uso de bucles para reducir el texto. Ajusta el tamaño de fuente multiplicándolo por la velocidad entre el ancho del contenedor y el ancho del contenido. Entonces, si el ancho del contenedor es 1/3 del contenido, el tamaño de la fuente se reducirá en 1/3 y el ancho del contenedor. Para escalar, he usado un ciclo while, hasta que el contenido es más grande que el contenedor.
Este código es parte de una prueba que he subido a Github https://github.com/ricardobrg/fitText/
fuente
Fui con la solución geekMonkey, pero es demasiado lenta. Lo que hace es ajustar el tamaño de fuente al máximo (maxFontPixels) y luego verifica si cabe dentro del contenedor. de lo contrario, reduce el tamaño de la fuente en 1 px y vuelve a verificar. ¿Por qué no simplemente verifica la altura del contenedor anterior y envía ese valor? (sí, sé por qué, pero ahora hice una solución, que solo funciona en la altura y también tiene una opción min / max)
Aquí hay una solución mucho más rápida:
y este sería el HTML:
Nuevamente: esta solución SOLO verifica la altura del contenedor. Es por eso que esta función no tiene que verificar si el elemento encaja dentro. Pero también implementé un valor min / max (40min, 150max), así que para mí esto funciona perfectamente bien (y también funciona en el cambio de tamaño de la ventana).
fuente
Aquí hay otra versión de esta solución:
fuente