Me está costando entender cómo escalar las fuentes.
Actualmente tengo este sitio con un cuerpo font-size
del 100%. ¿100% de qué sin embargo? Esto parece calcularse a 16 píxeles.
Tenía la impresión de que el 100% de alguna manera se referiría al tamaño de la ventana del navegador, pero aparentemente no porque siempre es de 16 píxeles si la ventana se redimensiona a un ancho móvil o un escritorio de pantalla panorámica en toda regla.
¿Cómo puedo hacer que el texto en mi sitio se escale en relación con su contenedor? Intenté usarlo em
, pero esto tampoco escala.
Mi razonamiento es que cosas como mi menú se aplastan cuando cambias el tamaño, por lo que necesito reducir el px
font-size
de .menuItem
entre otros elementos en relación con el ancho del contenedor. (Por ejemplo, en el menú de un escritorio grande, 22px
funciona perfectamente. Mover hacia abajo al ancho de la tableta y 16px
es más apropiado).
Soy consciente de que puedo agregar puntos de interrupción, pero realmente quiero que el texto se escale y que tenga puntos de interrupción adicionales, de lo contrario, terminaré con cientos de puntos de interrupción por cada 100 píxeles de disminución de ancho para controlar el texto.
fuente
font-size: 100%;
significa el 100% del tamaño que tendría el texto (es decir, el que hereda de su padre). Por defecto eso es 16px. Entonces, si usó 50%, sería el tamaño de fuente: 8pxRespuestas:
EDITAR: si el contenedor no es el cuerpo, CSS Tricks cubre todas sus opciones en Ajustar texto a un contenedor .
Si el contenedor es el cuerpo, lo que está buscando son longitudes de porcentaje de ventana gráfica :
Los valores son:
vw
(% del ancho de la ventana gráfica)vh
(% de la altura de la ventana gráfica)vi
(1% del tamaño de la vista en la dirección del eje en línea del elemento raíz)vb
(1% del tamaño de la ventana gráfica en la dirección del eje de bloque del elemento raíz)vmin
(el menor devw
ovh
)vmax
(el más grandevw
ovh
)1 v * es igual al 1% del bloque contenedor inicial.
Usarlo se ve así:
Como puede ver, cuando aumenta el ancho de la ventana gráfica, también lo hace
font-size
, sin necesidad de usar consultas de medios.Estos valores son una unidad de tamaño, al igual que
px
oem
, por lo que también se pueden usar para cambiar el tamaño de otros elementos, como el ancho, el margen o el relleno.La compatibilidad con el navegador es bastante buena, pero es probable que necesite un respaldo, como:
Consulte las estadísticas de soporte: http://caniuse.com/#feat=viewport-units .
Además, echa un vistazo a CSS-Tricks para una apariencia más amplia: Tipografía de tamaño de ventana gráfica
Aquí hay un buen artículo sobre cómo establecer tamaños mínimos / máximos y ejercer un poco más de control sobre los tamaños: control preciso sobre la tipografía receptiva
Y aquí hay un artículo sobre cómo configurar su tamaño usando calc () para que el texto llene la ventana gráfica: http://codepen.io/CrocoDillon/pen/fBJxu
Además, vea este artículo, que utiliza una técnica denominada 'guía fundida' para ajustar también la altura de la línea. Fundido líder en CSS
fuente
FitText.js
alternativa provista al final del artículo que @jbenjohnson suministró.Pero, ¿qué pasa si el contenedor no es la ventana gráfica (cuerpo)?
Esta pregunta se hace en un comentario de Alex bajo la respuesta aceptada .
Ese hecho no significa
vw
que no se pueda utilizar hasta cierto punto para dimensionar ese contenedor. Ahora, para ver cualquier variación, uno debe asumir que el contenedor de alguna manera es flexible en tamaño. Ya sea a través de un porcentaje directowidth
o por ser 100% menos márgenes. El punto se convierte en "discutible" si el contenedor siempre se establece en, digamos,200px
ancho, luego simplemente configure unfont-size
que funcione para ese ancho.Ejemplo 1
Sin embargo, con un contenedor de ancho flexible, debe tenerse en cuenta que de alguna manera el contenedor todavía se está dimensionando fuera de la ventana gráfica . Como tal, se trata de ajustar una
vw
configuración basada en esa diferencia de tamaño porcentual a la ventana gráfica, lo que significa tener en cuenta el tamaño de los contenedores primarios. Toma este ejemplo :Suponiendo que aquí
div
es un hijo delbody
, es50%
de ese100%
ancho, que es el tamaño de la ventana gráfica en este caso básico. Básicamente, desea establecer unvw
que se vea bien para usted. Como puede ver en mi comentario en el contenido CSS anterior, puede "pensar" matemáticamente con respecto al tamaño completo de la ventana gráfica, pero no es necesario que lo haga. El texto se va a "flexionar" con el contenedor porque el contenedor se está flexionando con el tamaño de la ventana gráfica. ACTUALIZACIÓN: aquí hay un ejemplo de dos contenedores de diferentes tamaños .Ejemplo 2
Puede ayudar a garantizar el tamaño de la vista forzando el cálculo basado en eso. Considere este ejemplo :
El tamaño todavía se basa en la vista, pero en esencia se configura en función del tamaño del contenedor.
El tamaño del contenedor debería cambiar dinámicamente ...
Si el tamaño del elemento contenedor terminó cambiando dinámicamente su relación porcentual, ya sea a través de
@media
puntos de interrupción o mediante JavaScript, entonces cualquiera que sea el "objetivo" base necesitaría un nuevo cálculo para mantener la misma "relación" para el tamaño del texto.Tome el ejemplo # 1 arriba. Si
div
se cambió al25%
ancho por cualquiera de ellos@media
o por JavaScript, al mismo tiempo,font-size
sería necesario ajustar en la consulta de medios o por JavaScript al nuevo cálculo de5vw * .25 = 1.25
. Esto pondría el tamaño del texto al mismo tamaño que hubiera tenido si el "ancho" del50%
contenedor original se hubiera reducido a la mitad del tamaño de la ventana gráfica, pero ahora se ha reducido debido a un cambio en su propio cálculo de porcentaje.Un reto
Con la
calc()
función CSS3 en uso, sería difícil de ajustar dinámicamente, ya que esa función no funciona parafont-size
fines en este momento. Por lo tanto, no podría hacer un ajuste CSS 3 puro si su ancho está cambiandocalc()
. Por supuesto, un pequeño ajuste de ancho para los márgenes puede no ser suficiente para garantizar cualquier cambiofont-size
, por lo que puede no importar.fuente
@media
punto de interrupción para cambiar la forma en que se dimensiona la fuente en ese punto (esencialmente dándole un tamaño fijo al llegarmax-width
) . Solo un pensamiento para trabajar con unamax-width
situación.Solución con SVG:
https://jsfiddle.net/qc8ht5eb/
Solución con SVG y ajuste de texto usando
foreignObject
:https://jsfiddle.net/2rp1q0sy/
fuente
En uno de mis proyectos, uso una "mezcla" entre vw y vh para ajustar el tamaño de fuente a mis necesidades, por ejemplo:
Sé que esto no responde la pregunta del OP, pero tal vez pueda ser una solución para cualquier otra persona.
fuente
vmin
y / o en suvmax
lugar.Solución de CSS puro con
calc()
unidades CSS y matemáticasEsto no es precisamente lo que OP pregunta, pero puede alegrarle el día a alguien. Esta respuesta no es fácil de alimentar y necesita un poco de investigación sobre el desarrollo final.
Finalmente vine a obtener una solución de CSS puro para esto usando
calc()
diferentes unidades. Necesitará una comprensión matemática básica de las fórmulas para calcular su expresióncalc()
.Cuando resolví esto, tuve que obtener un encabezado receptivo de ancho de página completo con algunos rellenos para algunos padres en DOM. Usaré mis valores aquí, reemplácelos con los suyos.
A las matematicas
Necesitará:
padding: 3em
y el ancho completo, así que esto llegó a100wv - 2 * 3em
X es el ancho del contenedor, así que reemplácelo con su propia expresión o ajuste el valor para obtener texto de página completa.
R
es la proporción que tendrás Puede obtenerlo ajustando los valores en alguna ventana gráfica, inspeccionando el ancho y la altura del elemento y reemplazándolos con sus propios valores. Además, lo eswidth / heigth
;)Y bang! ¡Funcionó! escribí
a mi encabezado y se ajustó muy bien en cada ventana gráfica.
pero como funciona?
Necesitamos algunas constantes aquí arriba.
100vw
significa el ancho completo de la ventana gráfica, y mi objetivo era establecer un encabezado de ancho completo con algo de relleno.El radio. Obtener un ancho y una altura en una ventana gráfica me dio una relación para jugar, y con la relación sé cuál debería ser la altura en el ancho de otra ventana gráfica. Calcularlos con la mano llevaría mucho tiempo y al menos tomaría mucho ancho de banda, por lo que no es una buena respuesta.
Conclusión
Me pregunto por qué nadie se ha dado cuenta de esto y algunas personas incluso dicen que sería imposible jugar con CSS. No me gusta usar JavaScript para ajustar elementos, por lo que no acepto las respuestas de JavaScript (y me olvido de jQuery) sin excavar más. En general, es bueno que esto se haya resuelto y este es un paso para las implementaciones de CSS puro en el diseño de sitios web.
Pido disculpas por cualquier convención inusual en mi texto, no soy hablante nativo en inglés y también soy bastante nuevo en escribir respuestas de desbordamiento de pila.
También debe tenerse en cuenta que tenemos barras de desplazamiento malvadas en algunos navegadores. Por ejemplo, al usar Firefox, noté que eso
100vw
significa el ancho completo de la ventana gráfica, que se extiende debajo de la barra de desplazamiento (¡donde el contenido no se puede expandir!), Por lo que el texto de ancho completo debe ser marginado cuidadosamente y preferiblemente probado con muchos navegadores y dispositivos.fuente
x
es de 640 px y relaciónr
16: 9, entonces:x = 640px, r = 16 / 9, y = x / r = 640px / (16 / 9) = 360px
Hay una gran filosofía para este tema.
Lo más fácil sería darle un cierto tamaño de fuente al cuerpo (recomiendo 10), y luego todos los demás elementos tendrían su fuente en
em
orem
. Te daré un ejemplo para entender esas unidades.Em
siempre es relativo a su padre:Rem
siempre es relativo al cuerpo:Y luego puede crear una secuencia de comandos que modifique el tamaño de fuente en relación con el ancho de su contenedor. Pero esto no es lo que recomendaría. Porque en un contenedor de 900 píxeles de ancho, por ejemplo, tendría un
p
elemento con un tamaño de fuente de 12 píxeles, digamos. Y según su idea, se convertiría en un contenedor de 300 píxeles de ancho con un tamaño de fuente de 4 píxeles. Tiene que haber un límite inferior.Otras soluciones serían con consultas de medios, para que pueda configurar la fuente para diferentes anchos.
Pero las soluciones que recomendaría es usar una biblioteca de JavaScript que lo ayude con eso. Y fittext.js que encontré hasta ahora.
fuente
rem
unidad es relativa al elemento raíz, es decir, elhtml
elemento, no elbody
elemento. El elemento raíz en el DOM es lahtml
etiqueta. developer.mozilla.org/en-US/docs/Web/CSS/length ...rem
siempre es relativo a lahtml
etiqueta, que es el elemento raíz, no la etiqueta del cuerpo ... pero es una buena respuesta :)Aquí está la función:
Luego convierta todos los tamaños de fuente del elemento hijo de sus documentos a
em
's o%
.Luego agregue algo como esto a su código para establecer el tamaño de fuente base.
http://jsfiddle.net/0tpvccjt/
fuente
return this
final de la función. Para el rendimiento, es posible que también desee eliminar el tamaño del onresize para que no se vuelva a dibujar al arrastrar. Es un código bastante simple, por lo que alguien podría basar su solución mejorada en él con poco esfuerzo.¡Hay una manera de hacer esto sin JavaScript!
Puede usar una imagen SVG en línea. Puede usar CSS en un SVG si está en línea. Debe recordar que usar este método significa que su imagen SVG responderá al tamaño de su contenedor.
Intente usar la siguiente solución ...
HTML
CSS
Ejemplo: https://jsfiddle.net/k8L4xLLa/32/
¿Quieres algo más llamativo?
Las imágenes SVG también te permiten hacer cosas geniales con formas y basura. Mira este gran caso de uso para texto escalable ...
https://jsfiddle.net/k8L4xLLa/14/
fuente
vw
dimensionamiento. Si cambia el texto, todo se saldrá del límite.Esto puede no ser súper práctico, pero si desea que una fuente sea una función directa del padre, sin tener ningún JavaScript que escuche / bucles (intervalo) para leer el tamaño del div / página, hay una manera de hacerlo . Iframes
Cualquier cosa dentro del iframe considerará el tamaño del iframe como el tamaño de la ventana gráfica. Entonces, el truco es hacer un iframe cuyo ancho sea el ancho máximo que desea que sea su texto, y cuya altura sea igual a la altura máxima * de la relación de aspecto del texto en particular.
Dejando a un lado la limitación de que las unidades de ventana gráfica no pueden venir junto con las unidades primarias para el texto (como en el caso de que el% de tamaño se comporte como todos los demás), las unidades de ventana gráfica proporcionan una herramienta muy poderosa: poder obtener la dimensión mínima / máxima . No puedes hacer eso en ningún otro lado, no puedes decir ... haz que la altura de este div sea el ancho del padre * algo.
Dicho esto, el truco es usar vmin y establecer el tamaño del iframe para que [fracción] * altura total sea un buen tamaño de fuente cuando la altura es la dimensión límite, y [fracción] * ancho total cuando el ancho es el dimensión limitante Es por eso que la altura tiene que ser un producto del ancho y la relación de aspecto.
Para mi ejemplo particular, tienes
La pequeña molestia con este método es que debe configurar manualmente el CSS del iframe. Si adjunta todo el archivo CSS, eso ocuparía mucho ancho de banda para muchas áreas de texto. Entonces, lo que hago es adjuntar la regla que quiero directamente desde mi CSS.
Puede escribir una función pequeña que obtenga la regla CSS / todas las reglas CSS que afectarían el área de texto.
No puedo pensar en otra forma de hacerlo sin tener un poco de ciclismo / escuchar JavaScript. La solución real sería que los navegadores proporcionaran una forma de escalar texto en función del contenedor principal y también proporcionar la misma funcionalidad de tipo vmin / vmax.
JSFiddle: https://jsfiddle.net/0jr7rrgm/3/ (haga clic una vez para bloquear el cuadrado rojo en el mouse y haga clic nuevamente para liberarlo)
La mayor parte del JavaScript en el violín es solo mi función personalizada de hacer clic y arrastrar.
fuente
srcdoc
: jsfiddle.net/wauzgob6/3Usando
vw
,em
y co. funciona con seguridad, pero en mi opinión siempre necesita un toque humano para afinar.Aquí hay un script que acabo de escribir basado en la respuesta de @ tnt-rox que intenta automatizar el toque de ese humano:
Básicamente reduce el tamaño de la fuente
1em
y luego comienza a aumentar en 0.1 hasta que alcanza el ancho máximo.JSFiddle
fuente
ems
requiere un toque humano y ritmo vertical no es una especie de hechicería.100% es relativo al tamaño de fuente base, que, si no lo ha configurado, sería el valor predeterminado de agente de usuario del navegador.
Para obtener el efecto que busca, usaría un fragmento de código JavaScript para ajustar el tamaño de fuente base en relación con las dimensiones de la ventana.
fuente
Dentro de su CSS, intente agregar esto en la parte inferior cambiando el ancho de 320 píxeles para donde su diseño comience a romperse:
Luego proporcione el tamaño de fuente en "px" o "em" como desee.
fuente
Mi propia solución, basada en jQuery, funciona aumentando gradualmente el tamaño de la fuente hasta que el contenedor obtenga un gran aumento de altura (lo que significa que tiene un salto de línea).
Es bastante simple, pero funciona bastante bien y es muy fácil de usar. No tiene que saber nada sobre la fuente que se está utilizando, el navegador se encarga de todo.
Puedes jugar con él en http://jsfiddle.net/tubededentifrice/u5y15d0L/2/
La magia sucede aquí:
fuente
Este componente web cambia el tamaño de la fuente para que el ancho del texto interno coincida con el ancho del contenedor. Mira la demo .
Puedes usarlo así:
fuente
Puede que estés buscando algo como esto:
http://jsfiddle.net/sijav/dGsC9/4/
http://fiddle.jshell.net/sijav/dGsC9/4/show/
He usado flowtype , y funciona muy bien (sin embargo, es JavaScript y no una solución CSS pura):
fuente
He preparado una función de escala simple usando la transformación CSS en lugar del tamaño de fuente. Puede usarlo dentro de cualquier contenedor, no tiene que configurar consultas de medios, etc. :)
Entrada de blog: encabezado escalable CSS y JS de ancho completo
El código:
Demostración de trabajo: https://codepen.io/maciejkorsan/pen/BWLryj
fuente
Usar variables CSS
Nadie ha mencionado aún las variables CSS, y este enfoque funcionó mejor para mí, así que:
Supongamos que tiene una columna en su página que tiene el 100% del ancho de la pantalla de un usuario móvil, pero tiene un
max-width
tamaño de 800 px, por lo que en el escritorio hay espacio a cada lado de la columna. Pon esto en la parte superior de tu página:Y ahora puede usar esa variable (en lugar de la
vw
unidad integrada ) para establecer el tamaño de su fuente. P.ejNo es un enfoque CSS puro , pero está bastante cerca.
fuente
Pruebe http://simplefocus.com/flowtype/ . Esto es lo que uso para mis sitios, y ha funcionado perfectamente.
fuente
Mi problema era similar, pero relacionado con el escalado de texto dentro de un encabezado. Probé Fit Font, pero necesitaba alternar el compresor para obtener algún resultado, ya que estaba resolviendo un problema ligeramente diferente, al igual que Text Flow.
Así que escribí mi propio pequeño complemento que reducía el tamaño de la fuente para que se ajustara al contenedor, suponiendo que sí,
overflow: hidden
y dewhite-space: nowrap
modo que incluso si reducir la fuente al mínimo no permite mostrar el encabezado completo, simplemente corta lo que puede mostrar.fuente
Artísticamente, si necesita ajustar dos o más líneas de texto dentro del mismo ancho, independientemente de su recuento de caracteres, entonces tiene buenas opciones.
Es mejor encontrar una solución dinámica para que cualquier texto que ingrese termine con una buena visualización.
Veamos cómo podemos acercarnos.
Todo lo que hacemos es obtener el ancho (
els[0].clientWidth
) y el tamaño de fuente (parseFloat(window.getComputedStyle(els[0],null).getPropertyValue("font-size"))
) de la primera línea como referencia y luego simplemente calcular el tamaño de fuente de las líneas subsiguientes en consecuencia.fuente
Intente usar el complemento fitText , porque los tamaños de Viewport no son la solución de este problema.
Simplemente agregue la biblioteca:
Y cambie el tamaño de fuente para corregir mediante la configuración del coeficiente de texto:
Puede establecer valores máximos y mínimos de texto:
fuente
Mira mi código. Hace el
font size smaller
afit
lo que sea que haya.Pero creo que esto no conduce a una buena experiencia de usuario
fuente
Como alternativa de JavaScript (o su única solución), puede usar mi complemento jQuery Scalem , que le permite escalar en relación con el elemento primario (contenedor) pasando la
reference
opción.fuente
En caso de que sea útil para alguien, la mayoría de las soluciones en este hilo fueron envolver texto en varias líneas, forma e.
Pero luego encontré esto, y funcionó:
https://github.com/chunksnbits/jquery-quickfit
Ejemplo de uso:
$('.someText').quickfit({max:50,tolerance:.4})
fuente
Siempre tenga su elemento con este atributo:
JavaScript:
element.style.fontSize = "100%";
o
CSS:
style = "font-size: 100%;"
Cuando va a pantalla completa, ya debe tener una variable de escala calculada (escala> 1 o escala = 1). Luego, en pantalla completa:
Funciona bien con poco código.
fuente
Para texto dinámico, este complemento es bastante útil:
http://freqdec.github.io/slabText/
Simplemente agregue CSS:
Y el guión:
fuente
Esto funcionó para mí:
Intento aproximar el tamaño de fuente en función del ancho / alto obtenido de la configuración de `font-size: 10px`. Básicamente, la idea es "si tengo 20 píxeles de ancho y 11 píxeles de alto con` font-size: 10px`, entonces, ¿cuál sería el tamaño máximo de fuente para matemática un contenedor de 50 píxeles de ancho y 30 píxeles de alto? "
La respuesta es un sistema de doble proporción:
{20: 10 = 50: X, 11: 10 = 30: Y} = {X = (10 * 50) / 20, Y = (10 * 30) / 11}
Ahora X es un tamaño de fuente que coincidirá con el ancho, e Y es un tamaño de fuente que coincidirá con la altura; tomar el menor valor
NB: el argumento de la función debe ser un elemento span o un elemento que sea más pequeño que su padre, de lo contrario, si los hijos y los padres tienen la misma función de ancho / alto fallarán.
fuente
No veo ninguna respuesta con referencia a la propiedad CSS flex, pero también puede ser muy útil.
fuente
Para que el tamaño de fuente se ajuste a su contenedor, en lugar de la ventana, vea la
resizeFont()
función que he compartido en esta pregunta (una combinación de otras respuestas, la mayoría de las cuales ya están vinculadas aquí). Se activa usandowindow.addEventListener('resize', resizeFont);
.JavaScript de vainilla: cambie el tamaño de la fuente para que se ajuste al contenedor
JavaScript:
Tal vez podría usar vw / vh como respaldo, por lo que asigna
em
orem
unidades usando JavaScript, asegurando que las fuentes se escalen a la ventana si JavaScript está deshabilitado.Aplique la
.resize
clase a todos los elementos que contienen texto que desea escalar.Active la función antes de agregar el detector de eventos de cambio de tamaño de ventana. Luego, cualquier texto que no se ajuste a su contenedor se reducirá cuando se cargue la página, así como cuando se cambie su tamaño.
NOTA: El valor por defecto
font-size
debe establecerse en cualquieraem
,rem
o%
para lograr resultados adecuados.fuente
HTML
Código JavaScript para maximizar el tamaño de fuente:
fuente