calc() Czy wiedziałeś, że w CSS możesz wykonywać kalkulacje matematyczne?

Tworzenie stron internetowych nigdy nie było, aż tak łatwe. Pomyśleć, że kiedyś CSS nie miało żadnych funkcji teraz ich masz bardzo dużo i jednym problemem jest wsparcie przez przeglądarki.

Dobra wiadomość jednak jest taka, że wraz ze śmiercią Internet Explorer i pojawieniem się przeglądarki EGDE - CSS przeżywa najszybszy rozwój niż kiedykolwiek.

W tym wpisie omówimy w dokładnych szczegółach jak tą funkcje LICZENIA wykorzystać.

Calc() jest dla obliczania wartości

Używając Calc() możesz obliczyć wartości, nawet gdy ich jednostki liczbowe są różne.

.el {
  font-size: calc(3vw + 2px);
  width:     calc(100% - 20px);
  height:    calc(100vh - 20px);
  padding:   calc(1vw + 5px);
}

Możesz nawet utworzyć gradient w odpowiednim kolorze korzystając z calc().

.el {
   background: # linear-gradient(
     to bottom,
     #8CA5E2,
     #8CA5E2 calc(50% - 10px),
     #3A83AA calc(50% + 10px),
     #3A83AA
   );
}

Używając tej funkcji łatwo byś mógł ustalić ułamek wielkości pewnego rozmiaru. Warto zaznaczyć, że liczba dzieląca nie może mieć swojej jednostki liczbowej.

.col7 { width: calc(100% / 7); }
.col6 { width: calc(100% / 6); }
.col5 { width: calc(100% / 5); }
.col4 { width: calc(100% / 4); }
.col3 { width: calc(100% / 3); }
.col2 { width: calc(100% / 2); }

Calc() i operacje nieliczbowe?

Calc nie wykonuje operacji na napisach. Znaki i operacje "dodawania" wielu językach się pojawiają przy napisach, ale nie w tym przypadku.

Calc() i media queries

Calc() nie działa z media queries.

Jak to jest z mieszaniem jednostek liczbowych

Mieszanie jednostek liczbowych działa, gdy taka operacja ma sens.

width: calc(80% - 20px);

Pomyśl 80% reprezentuje rozmiar 4/5 maksymalnego dostępnego rozmiaru. Ten rozmiar zostanie przeliczony na piksele, a gdy tak się stanie operacja odejmowania nie jest problemem.

Oczywiście w CSS operujemy nie tylko na wielkościach. Mam przecież jednostkę stopni, gdy chcemy coś obrócić.

transform: rotate(calc(1turn + 45deg));

animation-delay: calc(1s + 15ms);

Mamy także przecież też jednostki czasu w animacjach. Warto sobie w takim wypadach zadać pytanie, czy przeglądarka będzie w stanie wykonać operację takiej kalkulacji.

Zmienne i kalkulacje 

Zmienne i kalkulacje kiedyś żyły tylko w świecie SASS. Teraz w CSS możesz zrobić to samo bez żadnych dodatkowych zabawek.

Najpierw sprawdziłem czy do zmiennych CSS mogę umieścić zmienne liczbowe.

:root {
    --mainmax-width: 55px;
    --main-padding: 15px;
}

.element {
    max-width: var(--mainmax-width);
    padding: var(--main-padding);
    background-color: yellow;
}

Gdy to potwierdziłem pozostało tylko sprawdzić, czy mogę zrobić operacje matematyczne na tych zmiennych.

:root {
    --mainmax-width: 55px;
    --main-padding: 15px;
}

.element {
    max-width: calc(var(--mainmax-width)*2);
    padding: calc(var(--main-padding) *2 );
    background-color: yellow;
}

Odpowiedź brzmi tak.

Tak jak z dzieleniem pamiętaj jednak, że przy mnożeniu nie podajesz jednostki liczbowej.

Białe znaki mają znaczenie

Spacje muszą być.

.element {
  /* Działa */
  font-size: calc(2vh + 5px);

  /* Nie działa */
  font-size: calc(2vh+5px);

  /* Działa */
  font-size: calc(2vh - 5px);

  /* Nie działa */
  font-size: calc(2vh-5px);
}

Nawias jest kluczowy w deklaracji calc() więc ten kod też nie jest poprany.

.element {
  /* Nie poprawne */
  width: calc (100% / 3);
}

Wielokrotne użycie calc()

Ciekawostka, gdy chcesz użyć wiele razy calc(), to nie musisz pisać takiego kodu.

.element {
  width: calc(
   calc(100% / 3)
    -
   calc(1vh * 2)
  );
}

Wystarczą Ci zwykłe nawiasy

.element {
  width: calc(
   (100% / 3)
    -
   (1vh * 2)
  );
}

Tak jak w każdym języku programowania, pojawia się kwestia kolejności działań. Pamiętaj mnożenie, dzielenie wykona się przed odejmowanie i dodawaniem. 

Jeżeli chcesz zmienić tą kolejność to korzystasz z nawiasów.

Tworzenie kolorów

Zmienne i funkcja Calc() działa bardzo dobrze z deklarowaniem kolorów poprzez formaty RGB czy HSL.

root: {
  --H: 100;
  --S: 100%;
  --L: 50%;
}

.el {
  background: hsl(
    calc(var(--H) + 40),
    calc(var(--S) - 30%),
    calc(var(--L) + 10%)
  )
}

Jak to jest z przeglądarkami

Jeżeli musisz wspierać IE8 lub FireFox-a 3.6 to zapomnij o użyciu calc(). 

FireFox do wersji 60 nie wspiera calc() przy użyciu generowania kolorów. 

IE 9 - 11 : źle tworzy box-shadow, gdy calc() jest w użyciu

Ciekawostka ani IE, ani Egde obecnie nie wspiera width:calc() dla komórek w tabeli. Jeżeli używasz tabelek to musisz o tym pamiętać.