Esiste qualcosa come min-font-size e max-font-size?


99

Sto cercando di rendere un carattere in un div reattivo alla finestra del browser. Finora ha funzionato perfettamente, ma il div genitore ha un max-widthdi 525px. Ridimensionare ulteriormente il browser non interromperà il ridimensionamento del carattere. Questo mi ha fatto chiedere se esiste una cosa come min-font-sizeo max-font-size, e se una cosa del genere non esiste, se c'è un modo per ottenere qualcosa di simile.

Ho pensato che l'utilizzo delle percentuali in font-sizeavrebbe funzionato, ma la parte di testo non verrà ridimensionata in base al div genitore. Ecco cosa ho:

Il CSS per il div genitore:

.textField{
    background-color:rgba(88, 88, 88, 0.33);

    width:40%;
    height:450px;

    min-width:200px;
    max-width:525px;

    z-index:2;
}

Il CSS per la parte di testo in questione:

.subText{
    position:relative;
    top:-55px;
    left:15px;

    font-family:"news_gothic";
    font-size:1.3vw;
    font-size-adjust:auto;

    width:90%;

    color:white;

    z-index:1;
}

Ho cercato per un bel po 'su Internet, ma inutilmente.


La prima volta che ho visto vw usata nei caratteri lol
Brandito

Risposte:


60

No, non esiste una proprietà CSS per la dimensione del carattere minima o massima. I browser hanno spesso un'impostazione per la dimensione minima del carattere, ma è sotto il controllo dell'utente, non dell'autore.

Puoi utilizzare le @mediaquery per effettuare alcune impostazioni CSS a seconda di cose come la larghezza dello schermo o della finestra. In tali impostazioni, è possibile ad esempio impostare la dimensione del carattere su un valore piccolo specifico se la finestra è molto stretta.


Se sono corretto, le informazioni nel tuo link dicono che le media query eseguiranno il CSS specificato quando una condizione è stata soddisfatta, in questo caso del tuo link, la condizione sarebbe max-width:600px;. Ho ragione o non ho compreso correttamente le informazioni dietro il collegamento?
Toby van Kempen

4
@Toby van Kempen: Hai ragione, tuttavia la larghezza massima in questo caso si riferisce alla dimensione della visualizzazione dello schermo e non alla dimensione di un elemento arbitrario. Se è necessario modificare CSS a seconda dello stile di un elemento arbitrario, non sarà possibile utilizzare le media query per farlo. Avrai bisogno di uno script.
BoltClock

@BoltClock Quindi, si @mediariferisce alla finestra del browser? Come farà a sapere che voglio che la dimensione del mio carattere sia, diciamo, 20px quando il div genitore o la finestra del browser ha una dimensione specifica, in px?
Toby van Kempen

@Toby van Kempen: Farà sempre riferimento alla finestra del browser - da qui il "media" in "media queries".
BoltClock

1
Ah, capisco. Quindi, se ho ragione, se scrivo @media (width:600px), eseguirà lo script seguente @mediauna volta che la larghezza del browser è equivalente a 600px?
Toby van Kempen

110

Puoi farlo utilizzando una formula e includendo la larghezza del viewport.

font-size: calc(7px + .5vw);

Questo imposta la dimensione minima del carattere a 7px e la amplifica di .5vw a seconda della larghezza del viewport.

In bocca al lupo!


2
OH MIO DIO!!! Negli ultimi 3 giorni ho giocato con i numeri e con diversi modi per farlo. Lascia che ti dica che niente ha funzionato davvero come vuoi. Poi, ho trovato la tua risposta, ho inserito la tua risposta nel mio CSS e "HORAYYYY" funziona ... Fantastica risposta Pitt. Grazie.
Giovedì

Un ottimo trucco per la dimensione minima del carattere. Mi chiedo se qualcosa di simile possa essere fatto per il massimo ... Potrebbe avere qualcosa a che fare con l'idea che qualsiasi negativo sarebbe trattato come 0. Alcuni annidati calco qualcosa del genere?
Lazar Ljubenović

2
Invertirlo, quindi font-size: calc (12px - .5vw)
roberrrt-s

Questo non funziona correttamente con LESS. Immagino che l' calc()istruzione venga elaborata quando LESS viene compilato e si risolve in un pxvalore semplice . Il ridimensionamento non viene ricalcolato. Idee o pensieri?
Devil's Advocate


63

Funziona bene con i CSS.

Ho affrontato gli stessi problemi e l'ho risolto come segue.

Utilizza una dimensione fissa "px" per la dimensione massima a una larghezza specifica e superiore. Quindi per larghezze inferiori diverse, utilizzare una relativa "vw" come percentuale dello schermo.

Il risultato di seguito è che si regola da solo su schermi inferiori a 960 px ma mantiene una dimensione fissa sopra. Solo un promemoria, per non dimenticare di aggiungere il documento html nell'intestazione:

<meta name="viewport" content="width=device-width">

Esempio in CSS:

@media all and (min-width: 960px) {
h1{
    font-size: 50px;
  }
}

@media all and (max-width: 959px) and (min-width: 600px) {
h1{
    font-size: 5vw;
  }
}

@media all and (max-width: 599px) and (min-width: 50px) {
h1{
    font-size: 6vw;
  }
}

Spero che ti sia d'aiuto!


2
Questa dovrebbe essere la risposta MIGLIORE !!
KaKa

perché hai "tutto" in ogni riga?
tibi

@tibi fa tutto riferimento al tipo di supporto (o: WHERE da applicare). le opzioni sono tutte, schermo, stampa e parlato. tutto è predefinito, quindi è un po 'obsoleto qui. vedere la documentazione di mdn .
clacson

Sì! Funziona perfettamente! Quello che volevo era una dimensione del carattere MAX, e funziona perfettamente, grazie.
todbott

9

Arrivo un po 'in ritardo qui, non ne ricevo molto merito, sto solo facendo un mix delle risposte seguenti perché sono stato costretto a farlo per un progetto.

Quindi, per rispondere alla domanda: non esiste una proprietà come questa proprietà CSS . Non so perché, ma penso sia perché hanno paura di un abuso di questa proprietà, ma non trovo alcun caso d'uso in cui possa essere un problema serio.

Comunque, quali sono le soluzioni?

Due strumenti ci permetteranno di farlo: media queries e vw property

1) Esiste una soluzione "stupida" che consiste nel fare una media query per ogni passaggio che eseguiamo nel nostro css, cambiando font da un importo fisso a un altro importo fisso. Funziona, ma è molto noioso da fare e non hai un aspetto lineare liscio.

2) Come ha spiegato AlmostPitt, c'è una soluzione brillante per i minimi:

font-size: calc(7px + .5vw);

Il minimo qui sarebbe 7px in aggiunta allo 0,5% della larghezza della vista. Questo è già molto interessante e funziona nella maggior parte dei casi . Non richiede alcuna media query, devi solo dedicare un po 'di tempo a trovare i parametri giusti.

Come hai notato è una funzione lineare, la matematica di base ti impara che due punti ti trovano già i parametri. Quindi aggiusta la dimensione del carattere in px che desideri per schermi molto grandi e per la versione mobile, quindi calcola se vuoi fare un metodo scientifico. Pensato, non è assolutamente necessario e puoi semplicemente provare.

3) Supponiamo che tu abbia un cliente molto noioso (come me) che vuole assolutamente che un titolo sia una riga e non di più. Se hai utilizzato la soluzione AlmostPitt, allora sei nei guai perché il tuo carattere continuerà a crescere e se hai un contenitore a larghezza fissa (come bootstrap che si ferma a 1140px o qualcosa del genere in grandi finestre). Qui ti suggerisco di utilizzare anche una media query. In effetti puoi semplicemente trovare la quantità massima di px size che puoi gestire nel tuo contenitore prima che l'aspetto diventi indesiderato (pxMax). Questo sarà il tuo massimo. Quindi devi solo trovare la larghezza esatta dello schermo che devi fermare (wMax). (Ti lascio invertire una funzione lineare da solo).

Dopodiché fallo

@media (min-width: [wMax]px) {
    h2{
        font-size: [pxMax]px;
    }
}

Quindi è perfettamente lineare e la dimensione del tuo carattere smette di crescere! Si noti che non è necessario inserire la proprietà CSS precedente (calc ...) in una media query sotto wMax perché le media query sono considerate più importanti e sovrascriveranno la proprietà precedente.

Non penso sia utile fare uno snippet per questo, poiché avresti problemi a farlo a tutto schermo e dopotutto non è scienza missilistica.

Spero che questo possa aiutare gli altri e non dimenticare di ringraziare AlmostPitt per la sua soluzione.


Potete suggerire una formula per trovare i valori giusti per calc () che restituiscono lo stesso di max(*a*px,, *b*vw)? Perché nel mio caso, non posso tollerare un'aggiunta ingenua perché il risultato è troppo grande, ma sembra che tu stia suggerendo che potrei in qualche modo ridurre aeb rispetto agli importi ingenui - Ho problemi a capire i calcoli, e io serve una soluzione generale, non solo un caso specifico.
Michael

L'unica buona spiegazione che ho trovato è stata un'immagine, quindi non posso aiutarti tramite i commenti, ti suggerisco di creare una nuova domanda
Alburkerk

6

Questo è attualmente proposto nei CSS4

Bozza di lavoro al W3C

Citazione:

Queste due proprietà consentono a un sito Web o a un utente di richiedere che la dimensione del carattere di un elemento sia limitata entro l'intervallo fornito con queste due proprietà. Se il valore calcolato font-size è al di fuori dei limiti creati da font-min-size e font-max-size, il valore d'uso di font-size viene bloccato ai valori specificati in queste due proprietà.

In realtà funzionerebbe come segue:

.element {
    font-min-size: 10px;
    font-max-size: 18px;
    font-size: 5vw; // viewport-relative units are responsive.
}

Ciò significherebbe letteralmente che la dimensione del carattere sarà il 5% della larghezza del riquadro di visualizzazione, ma mai inferiore a 10 pixel e mai superiore a 18 pixel.

Sfortunatamente, questa funzione non è ancora implementata da nessuna parte (nemmeno su caniuse.com).


4
Grande. Quindi devo solo smettere di lavorare su questo progetto per alcuni anni fino a quando non verrà implementato ....: '- (
Michael

3

Lo zaino è fantastico, ma non devi necessariamente ricorrere a strumenti come Gulp o Grunt ecc.

Ho realizzato una demo utilizzando le proprietà personalizzate CSS (variabili CSS) per controllare facilmente le dimensioni minime e massime dei caratteri.

Così:

* {
  /* Calculation */
  --diff: calc(var(--max-size) - var(--min-size));
  --responsive: calc((var(--min-size) * 1px) + var(--diff) * ((100vw - 420px) / (1200 - 420))); /* Ranges from 421px to 1199px */
}

h1 {
  --max-size: 50;
  --min-size: 25;
  font-size: var(--responsive);
}

h2 {
  --max-size: 40;
  --min-size: 20;
  font-size: var(--responsive);
}

2

Ho ottenuto dei buoni risultati con questi. Scorre dolcemente tra le 3 gamme di larghezza, come una funzione continua a tratti.

@media screen and (min-width: 581px) and (max-width: 1760px){
    #expandingHeader {
        line-height:5.2vw;
        font-size: 5.99vw;
    }
    #tagLine {
        letter-spacing: .15vw;
        font-size: 1.7vw;
        line-height:1.0vw;
    }
}

@media screen and (min-width: 1761px){
    #expandingHeader {
        line-height:.9em;
        font-size: 7.03em;

    }
    #tagLine {
        letter-spacing: .15vw;
        font-size: 1.7vw;
        line-height:1.0vw;
    }
}

@media screen and (max-width: 580px){
    #expandingHeader {
        line-height:.9em;
        font-size: 2.3em;
    }
    #tagLine {
        letter-spacing: .1em;
        font-size: .65em;
        line-height: .10em;
    }
}

In che modo è diverso dall'altra risposta?
user193661

2

Puoi usare Sass per controllare le dimensioni minime e massime dei caratteri. Ecco una brillante soluzione di Eduardo Boucas.

https://eduardoboucas.com/blog/2015/06/18/viewport-sized-typography-with-minimum-and-mamost-sizes.html

@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;
}

.limit-min {
  @include responsive-font(3vw, 20px);
}

.limit-min-max {
  @include responsive-font(3vw, 20px, 50px);
}

1

Tieni presente che l'impostazione del dimensionamento dei caratteri con px non è consigliata a causa di problemi di accessibilità :

"La definizione delle dimensioni dei caratteri in px non è accessibile, perché l'utente non può modificare la dimensione del carattere in alcuni browser. Ad esempio, gli utenti con problemi di vista potrebbero voler impostare la dimensione del carattere molto più grande della dimensione scelta da un web designer." (vedi https://developer.mozilla.org/en-US/docs/Web/CSS/font-size )

Un approccio più accessibile consiste font-size: 100%nell'impostare in html, che rispetta le impostazioni di dimensione predefinite dell'utente , e POI utilizzando percentuali o unità relative durante il ridimensionamento ( emo rem), ad esempio con una query @media.

(vedi https://betterwebtype.com/articles/2019/06/16/5-keys-to-accessible-web-typography/ )


0

Sì, sembrano esserci alcune restrizioni da parte di alcuni browser in SVG. Lo sviluppatore lo limita a 8000px; Il seguente grafico generato dinamicamente non riesce, ad esempio, in Chrome.

Provare http://www.xn--dddelei-n2a.de/2018/test-von-svt/

<svg id="diagrammChart"
     width="100%"
     height="100%"
     viewBox="-400000 0 1000000 550000"
     font-size="27559"
     overflow="hidden"
     preserveAspectRatio="xMidYMid meet"
>
    <g class="hover-check">
        <text class="hover-toggle" x="-16800" y="36857.506818182" opacity="1" height="24390.997159091" width="953959" font-size="27559">
            <set attributeName="opacity" to="1" begin="ExampShow56TestBarRect1.touchstart"
                 end="ExampShow56TestBarRect1.touchend">
            </set>
            <set attributeName="opacity" to="1" begin="ExampShow56TestBarRect1.mouseover"
                 end="ExampShow56TestBarRect1.mouseout">
            </set>
            Heinz: -16800
        </text>
        <rect class="hover-rect" x="-16800" y="12466.509659091" width="16800" height="24390.997159091" fill="darkred">
            <set attributeName="opacity" to="0.1" begin="ExampShow56TestBarRect1.mouseover"
                 end="ExampShow56TestBarRect1.mouseout">
            </set>
            <set attributeName="opacity" to="0.1" begin="ExampShow56TestBarRect1.touchstart"
                 end="ExampShow56TestBarRect1.touchend">
            </set>
        </rect>
        <rect id="ExampShow56TestBarRect1" x="-384261" y="0" width="953959" height="48781.994318182"
              opacity="0">
        </rect>

    </g>
</svg>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.