Cómo establecer el tamaño mínimo de fuente en CSS

81

Quiero establecer un tamaño de fuente mínimo para cada elemento de mi página HTML.

Por ejemplo, si hay elementos con un tamaño de fuente inferior a 12 px, cambiarán a 12 px.
Pero si hay elementos con un tamaño de fuente más grande que 12px, no cambiarán.

¿Hay alguna forma de hacerlo con CSS?

nrofis
fuente

Respuestas:

3

No. Si bien puede establecer un tamaño de fuente base al bodyusar la font-sizepropiedad, cualquier cosa posterior que especifique un tamaño más pequeño anulará la regla base para ese elemento. Para hacer lo que busca, necesitará utilizar Javascript.

Puede iterar a través de los elementos de la página y cambiar las fuentes más pequeñas usando algo como esto:

$("*").each( function () {
    var $this = $(this);
    if (parseInt($this.css("fontSize")) < 12) {
        $this.css({ "font-size": "12px" });   
    }
});

Aquí hay un violín donde puedes verlo hecho: http://jsfiddle.net/mifi79/LfdL8/2/

mifi79
fuente
¿Existe una forma sencilla de encontrar elementos de jQuery con un tamaño inferior a 12px?
nrofis
@nrofis: claro, vea la edición de mi respuesta anterior. ¡Salud!
mifi79
11
Iterar TODOS los elementos de una página y cambiar una propiedad CSS parece una muy mala idea desde el punto de vista del rendimiento. No soy un experto en lo que desencadena los reflujos, pero podría inadvertidamente volver a fluir mucho la página con este enfoque. No recomiendo este enfoque.
Avand Amiri
Estoy con @AvandAmiri: este es un mal enfoque en el sentido de que este tipo de pensamiento conduce a muchas otras soluciones como esta en una página, lo que luego conduce a sitios que no funcionan e incluso a pérdidas de memoria que bloquearán su aplicación. La verdadera respuesta a esto es (hasta que el tamaño de fuente máximo se convierta en algo legítimamente utilizable) es ajustar la arquitectura: diseñar e implementar un buen sistema que haga las cosas correctamente. No debe haber tamaños de fuente en una página que sean "accidentales".
dudewad
1
@ AndersLindén En ese caso, establezca un tamaño de fuente mínimo en una consulta de medios, por ejemplo, si no desea que el tamaño de fuente sea inferior a 10px: p{ font-size: 1vw } @media (max-width: 1000px){ p{ font-size: 10px } }
nHaskins
209

En CSS3 hay un truco simple pero brillante para eso:

font-size:calc(12px + 1.5vw);

Esto se debe a que la parte estática de calc () define el mínimo. Aunque la parte dinámica puede reducirse a algo cercano a 0.

Marc Ruef
fuente
19
truco fantástico!
1
te quiero. Esto es asombroso.
Luke Taylor
4
@StefanSteiger, puede usar consultas de medios para esto: (a) medios (ancho máximo: 610px) ...
Adam Wallner
2
¡Brillante! Exactamente lo que necesitaba. ¡Gracias!
spedley
6
Aunque este es un buen truco, diría que no es realmente una solución, ya que afecta el tamaño de la fuente cuando el tamaño está por encima del mínimo, por lo que debe soportar ese extra 12px(en este caso) en todo momento.
Tom Wyllie
53

A mediados de diciembre de 2019, la función CSS4 min / max es exactamente lo que desea:
(pise con cuidado, esto es muy nuevo, los navegadores más antiguos (también conocidos como IE y msEdge) aún no lo admiten)
(compatible a partir de Chromium 79 y Firefox v75)

https://developer.mozilla.org/en-US/docs/Web/CSS/min
https://developer.mozilla.org/en-US/docs/Web/CSS/max

Ejemplo:

blockquote {
    font-size: max(1em, 12px);
}

De esa manera, el tamaño de la fuente será 1em (si 1em> 12px), pero al menos 12px.

Desafortunadamente, esta característica increíble de CSS3 aún no es compatible con ningún navegador, ¡pero espero que esto cambie pronto!

Editar:

Esto solía ser parte de CSS3, pero luego fue reprogramado para CSS4.
A partir del 11 de diciembre de 2019 , el soporte llegó en Chrome / Chromium 79 (incluido en Android y en Android WebView) y, como tal, también en Microsoft Chredge, también conocido como Anaheim, incluidos Opera 66 y Safari 11.1 (incluido iOS).

Stefan Steiger
fuente
7
En serio, ¿por qué los comités de normas siempre eliminan las cosas que realmente harían posible mi trabajo?
Michael
2
@Michael, el CSS WG elimina cosas principalmente por falta de interés o prioridad del implementador. Necesita dos implementaciones independientes para obtener una función CSS en una recomendación final del W3C. No tiene sentido escribir un artículo y nadie quiere introducirlo en el software del mundo real. Así que debería preguntar a los proveedores de navegadores ...
jj
1
¡Gran descubrimiento! Se puede usar con variables css para establecer min / max. Ejemplo: :root { --responsive-font-size-primary: min(2em, max(0.5em, 5vmin)); }simplificar el uso:font-size: var(--responsive-font-size-primary);
Corey Alix
@Corey Alix: Genial, acabo de notar que el soporte para eso llegó el 11 de diciembre de 2019. Thread con cuidado, todos los navegadores que no están basados ​​en Chromium aún no lo admiten. Pero la compatibilidad con Chrome es una buena noticia.
Stefan Steiger
1
@Michael: Buenas noticias: ¡ahora está implementado! (a mediados de diciembre de 2019)
Stefan Steiger
8

Parece que llegué un poco tarde, pero para otras personas con este problema, pruebe este código

p { font-size: 3vmax; }

use la etiqueta que prefiera y el tamaño que prefiera (reemplace el 3)

p { font-size: 3vmin; }

se utiliza para un tamaño máximo.

ccc
fuente
5
vmax y vmin se utilizan en realidad para especificar valores relativos al punto de vista / tamaño de página. El mínimo y el máximo se refieren a la ventana gráfica mínima / máxima, no al mínimo o al máximo del tamaño de fuente, que es lo que preguntaba el operador. (por ejemplo, si la altura es mayor que el ancho de la ventana gráfica, entonces vmax es igual a 100vmax = altura de la ventana gráfica y 100vmin = ancho de la ventana gráfica)
Chaim
8

Utilice una consulta de medios. Ejemplo: Esto es algo que estoy usando, el tamaño original es 1.0vw, pero cuando llega a 1000, la letra se vuelve demasiado pequeña, así que la amplío.

@media(max-width:600px){
    body,input,textarea{
         font-size:2.0vw !important;
    }
}

Este sitio en el que estoy trabajando no responde a más de 500 px, pero es posible que necesite más. El beneficio profesional de esta solución es que mantiene la escala del tamaño de la fuente sin tener letras súper mini y puede mantenerlo gratis.

zardilior
fuente
1
ugh. esto vincula el elemento a la resolución de la ventana, ¿no es así? lo que significa que, en general, necesitaría una consulta de medios separada para cada elemento de la página.
Michael
4

CSS tiene una función clamp () que mantiene el valor entre el límite superior e inferior. La función clamp () permite la selección del valor medio en el rango de valores entre los valores mínimo y máximo definidos.

Simplemente toma tres dimensiones:

  1. Valor mínimo.
  2. Elemento de lista
  3. Valor preferido Valor máximo permitido.

intente con el código a continuación y verifique el cambio de tamaño de la ventana, que cambiará el tamaño de fuente que ve en la consola. Establezco el valor máximo 150pxy el valor mínimo 100px.

$(window).resize(function(){
    console.log($('#element').css('font-size'));
});
console.log($('#element').css('font-size'));
h1{
    font-size: 10vw; /* Browsers that do not support "MIN () - MAX ()" and "Clamp ()" functions will take this value.*/
    font-size: max(100px, min(10vw, 150px)); /* Browsers that do not support the "clamp ()" function will take this value. */
    font-size: clamp(100px, 10vw, 150px);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<center>
  <h1 id="element">THIS IS TEXT</h1>
</center>

Bhavik Hirani
fuente
3

Solución CSS:

.h2{
  font-size: 2vw
}
@media (min-width: 700px) {
  .h2{
    /* Minimum font size */
    font-size: 14px
  }
}
@media (max-width: 1200px) {
  .h2{
    /* Maximum font size */
    font-size: 24px
  }
}

Por si acaso si algunos necesitan scss mixin:

///
/// Viewport sized typography with minimum and maximum values
///
/// @author Eduardo Boucas (@eduardoboucas)
///
/// @param {Number}   $responsive  - Viewport-based size
/// @param {Number}   $min         - Minimum font size (px)
/// @param {Number}   $max         - Maximum font size (px)
///                                  (optional)
/// @param {Number}   $fallback    - Fallback for viewport-
///                                  based units (optional)
///
/// @example scss - 5vw font size (with 50px fallback),
///                 minumum of 35px and maximum of 150px
///  @include responsive-font(5vw, 35px, 150px, 50px);
///

@mixin responsive-font($responsive, $min, $max: false, $fallback: false) {
  $responsive-unitless: $responsive / ($responsive - $responsive + 1);
  $dimension: if(unit($responsive) == 'vh', 'height', 'width');
  $min-breakpoint: $min / $responsive-unitless * 100;

  @media (max-#{$dimension}: #{$min-breakpoint}) {
    font-size: $min;
  }

  @if $max {
    $max-breakpoint: $max / $responsive-unitless * 100;

    @media (min-#{$dimension}: #{$max-breakpoint}) {
      font-size: $max;
    }
  }

  @if $fallback {
    font-size: $fallback;
  }

  font-size: $responsive;
}
Syed
fuente
1

AFAIK, no es posible con CSS simple,
pero puede hacer una operación jQuery bastante costosa como:

jsBin demo

$('*').css('fontSize', function(i, fs){
  if(parseInt(fs, 10) < 12 ) return this.style.fontSize = "12px";
});

En lugar de utilizar el Selector global * , le sugiero (si es posible) que sea más específico con sus selectores.

Roko C. Buljan
fuente
1

Las propiedades font-min-sizey font-max-sizeCSS se eliminaron de la especificación de nivel 4 del módulo de fuentes CSS (y nunca se implementaron en los navegadores AFAIK). Y el Grupo de Trabajo de CSS reemplazó los ejemplos de CSS con los font-size: clamp(...)que aún no tienen el mayor soporte de navegador, por lo que tendremos que esperar a que los navegadores lo admitan. Vea el ejemplo en https://developer.mozilla.org/en-US/docs/Web/CSS/clamp#Examples .

Nulo
fuente
0

A juzgar por su comentario anterior, está bien haciendo esto con jQuery, aquí va:

// for every element in the body tag
$("*", "body").each(function() {
  // parse out its computed font size, and see if it is less than 12
  if ( parseInt($(this).css("font-size"), 10) < 12 )
    // if so, then manually give it a CSS property of 12px
    $(this).css("font-size", "12px")
});

Una forma más limpia de hacer esto podría ser tener una clase "min-font" en su CSS que establezca el tamaño de fuente: 12px, y simplemente agregue la clase en su lugar:

$("*", "body").each(function() {
  if ( parseInt($(this).css("font-size"), 10) < 12 )
    $(this).addClass("min-font")
});
Patrick Harrington
fuente
-1

Funcionará perfectamente con 50px. Que actuará como estático y, por lo tanto, como ancho mínimo.

font-size: calc(50px + 5vw);
Jayant Khandelwal
fuente