vm Ostatnio robię poprawki na blogu. Przyglądam się temu, jak pisałem kiedyś CSS. Widzę, że dla pewnych nagłówków tekstowych napisałem tyle "@media Queries", aby tekst zawsze dopasowywał się do wielkości ekranu. Oczywiście tak nie powinno się robić. W sumie to rozwiązanie zakłada pewną ilość znaków tekście.  

Spójrz. Czy to dobrze wygląda?

.title {
    text-align: center;
    font-size: 2.3em;
    line-height: 1.1;
    text-transform: uppercase;
    font-style: normal;
    font-weight: 700;
    margin-bottom: 0;
    /* border-top: solid 1px white; */
    position: relative;
    z-index: 0;
}

@media screen and (min-width: 20em)
.title {
    font-size: 2.7em;
}

@media screen and (min-width: 28em)
.title {
    font-size: 2.5em;
}

@media screen and (min-width: 37em)
.title {
    font-size: 3.9em;
}

@media screen and (min-width: 44em)
.title {
    font-size: 5.9em;
}

@media screen and (min-width: 58em)
.title {
    font-size: 7.4em;
}

Mogło być gorzej. Mogłem użyć jQuery i dynamicznie obliczać rozmiar ekranu i dopasowywać rozmiar czcionki w ten sposób.

Zaraz.

To w sumie dobry pomysł, gdyby tylko można było, to zrobić używając tylko CSS.

Na szczęście żyjemy w roku 2020 i istnieją od wielu lat lepsze rozwiązania.  W CSS, istnieje coś takiego jak rozmiar ViewPort. Określa on rozmiar rzeczy w zależności od rozmiaru viewportu, a sam viewport można uznać za rozmiar ekranu w zależności od urządzenia, na jakim wyświetla się strona internetowa.

Jedna jednostka to 1% rozmiaru jednego z wymiarów osi ekranu. Długość albo szerokość. 

Te rozmiary mogą być bardzo użyteczne 

Dlaczego to jest takie wspaniałe

Istnieje wiele powodów:

  • Nie musisz pisać złożonej logiki, aby uzyskać efekt
  • Możesz bardziej intuicyjnie określić rozmiar swojego tekstu względem ekranu
  • Masz dokładne powiązanie pomiędzy rozmiarem ekranu a tą zmienną

Jak to działa

Jakie mamy rozmiary do dyspozycji:

1 vm : 1% długości viewport

1vh : 1% wysokości viewport

1vmin : 1% wysokości lub długości. Zostanie wybrany rozmiar, który jest mniejszy

1 vmax : 1% wysokości lub długości. Zostanie wybrany rozmiar, który jest większy

Przykład użycia

Wracając, do poprzedniego przykładu. Można by go poprawić w taki sposób.

.title {
    text-align: center;
    font-size: 2.3em;
    line-height: 1.1;
    text-transform: uppercase;
    font-style: normal;
    font-weight: 700;
    margin-bottom: 0;
    /* border-top: solid 1px white; */
    position: relative;
    z-index: 0;
}

@media screen and (min-width: 20em)
.title {
    font-size: 2.7em;
    font-size: 12vw;
}

@media screen and (min-width: 28em)
.title {
    font-size: 2.5em;
    font-size: 12vw;
}

@media screen and (min-width: 37em)
.title {
    font-size: 3.9em;
    font-size: 12vw;
}

@media screen and (min-width: 44em)
.title {
    font-size: 5.9em;
    font-size: 12vw;
}

Zauważ, że zostawiłem stare wartości na wszelki wypadek, gdy trafię na starą przeglądarkę, w której ta technika nie jest wspierana.

Oto kolejny przykład.

h1 {
  font-size: 5.9vw;
}

h2 {
  font-size: 3.0vh;
}

p {
  font-size: 2vmin;
}

Sprawdź te demo

Zmień rozmiary ekranu, aby zobaczyć czy tekst też się zmienia.

Czy można to zrobić jeszcze lepiej?

Nie wiem, czy wiesz, ale od jakiegoś czasu istnieje funkcja calc() w CSS.

Dlaczego nie stworzyć funkcji, która by ustalała rozmiary czcionki według pewnego wzoru. Dodatkowo dla rozmiaru ekranu 1000px ustalibyśmy stały rozmiar tekstu.

html {
  font-size: 16px;
}
@media screen and (min-width: 320px) {
  html {
    font-size: calc(16px + 8 * ((100vw - 320px) / 680));
  }
}
@media screen and (min-width: 1000px) {
  html {
    font-size: 24px;
  }
}

Niedługo będzie można skorzystać z funkcji max() i min() w CSS. Co uprości ten kod jeszcze bardziej.

html {
  font-size: min(max(1rem, 4vw), 24px);
}

Istnieje jeszcze najnowsza funkcja, która spełni podobny cel. Jest to clamp(). Używając jej , można skrócić kod jeszcze bardziej.

body {
  font-size: clamp(100%, 1rem + 2vw, 24px);
}