Witaj w Nekropolii Gizy matematyki CSS! Podobnie jak starożytni egipcy używali zaawansowanej matematyki do budowy piramid, tak my możemy używać CSS Functions do tworzenia dynamicznych, responsywnych i elastycznych stylów. Poznaj funkcje matematyczne, które rewolucjonizują sposób pisania CSS!
CSS Functions to wbudowane funkcje, które wykonują obliczenia i zwracają wartości. Pozwalają na tworzenie dynamicznych stylów bez JavaScript!
Najważniejsze funkcje matematyczne:
calc() - podstawowe obliczeniamin() - najmniejsza wartośćmax() - największa wartośćclamp() - wartość w zakresieminmax() - dla CSS GridAnalogia egipska: To jak egipski skryba wykonujący precyzyjne obliczenia dla budowy piramidy - matematyka wbudowana bezpośrednio w plany!
calc() pozwala na wykonywanie matematycznych operacji z różnymi jednostkami:1.element {
2 /* Dodawanie */
3 width: calc(100% - 50px);
4
5 /* Odejmowanie */
6 height: calc(100vh - 80px);
7
8 /* Mnożenie */
9 font-size: calc(16px * 1.5);
10
11 /* Dzielenie */
12 padding: calc(20px / 2);
13
14 /* Kombinacje */
15 margin: calc((100% - 960px) / 2);
16}Ważne zasady:
calc(100% - 50px) ✅, calc(100%-50px) ❌1.container {
2 display: flex;
3}
4
5.sidebar {
6 width: 250px;
7 flex-shrink: 0;
8}
9
10.main-content {
11 /* Szerokość = 100% minus sidebar minus gap */
12 width: calc(100% - 250px - 20px);
13}1.main {
2 /* 100vh minus wysokość header (80px) i footer (60px) */
3 min-height: calc(100vh - 80px - 60px);
4}1.section {
2 /* Padding rośnie z rozmiarem ekranu */
3 padding: calc(20px + 2vw);
4 /* Na 320px: 20px + 6.4px = 26.4px */
5 /* Na 1920px: 20px + 38.4px = 58.4px */
6}1.grid {
2 display: grid;
3 grid-template-columns: repeat(3, calc((100% - 40px) / 3));
4 gap: 20px;
5 /* 3 kolumny, 2 gaps po 20px = 40px total gap */
6}1.aspect-16-9 {
2 width: 100%;
3 /* 9/16 = 0.5625 = 56.25% */
4 padding-bottom: calc(9 / 16 * 100%);
5 position: relative;
6}
7
8.aspect-16-9 > * {
9 position: absolute;
10 top: 0;
11 left: 0;
12 width: 100%;
13 height: 100%;
14}min() zwraca najmniejszą wartość z podanych. Idealne do ustawiania maksymalnych limitów!1.element {
2 /* Nigdy więcej niż 800px, ale może być mniejszy */
3 width: min(800px, 100%);
4
5 /* Równoważne: */
6 width: 100%;
7 max-width: 800px;
8}1.container {
2 /* Maksymalnie 1200px, ale 90% na małych ekranach */
3 width: min(1200px, 90%);
4 margin: 0 auto;
5}1h1 {
2 /* Maksymalnie 48px, ale skaluje się z ekranem */
3 font-size: min(48px, 5vw);
4}1.section {
2 /* Padding rośnie, ale maksymalnie 80px */
3 padding: min(80px, 5vw);
4}1.grid {
2 display: grid;
3 /* Kolumny minimum 250px, maksimum równe części */
4 grid-template-columns: repeat(auto-fit, min(250px, 100%));
5 gap: 20px;
6}max() zwraca największą wartość z podanych. Idealne do ustawiania minimalnych limitów!1.element {
2 /* Nigdy mniejszy niż 200px, ale może być większy */
3 width: max(200px, 50%);
4
5 /* Równoważne: */
6 width: 50%;
7 min-width: 200px;
8}1.card {
2 /* Minimum 300px, ale może rosnąć */
3 width: max(300px, 30%);
4}1body {
2 /* Minimum 16px, ale rośnie z ekranem */
3 font-size: max(16px, 1vw);
4}1.section {
2 /* Minimum 20px padding, nawet na małych ekranach */
3 padding: max(20px, 3vw);
4}1.grid {
2 /* Kolumny minimum 200px */
3 grid-template-columns: repeat(auto-fit, minmax(max(200px, 25%), 1fr));
4}clamp() to najpo tężniejsza funkcja - zwraca wartość ograniczoną do zakresu!Składnia:
clamp(minimum, preferowana, maksimum)1.element {
2 /* Minimum 16px, preferowane 2vw, maksimum 32px */
3 font-size: clamp(16px, 2vw, 32px);
4}Jak działa:
1h1 {
2 /* Font size od 24px do 64px, skaluje się płynnie */
3 font-size: clamp(24px, 4vw + 1rem, 64px);
4}
5
6h2 {
7 font-size: clamp(20px, 3vw + 1rem, 48px);
8}
9
10h3 {
11 font-size: clamp(18px, 2.5vw + 1rem, 36px);
12}
13
14p {
15 font-size: clamp(16px, 1vw + 0.5rem, 20px);
16}
17
18/* Jeden system typografii dla wszystkich ekranów! */1.container {
2 /* Od 320px do 1200px, płynnie skaluje */
3 width: clamp(320px, 90%, 1200px);
4 margin: 0 auto;
5}1:root {
2 /* Płynne spacing od małych do dużych ekranów */
3 --spacing-xs: clamp(0.5rem, 1vw, 1rem);
4 --spacing-sm: clamp(1rem, 2vw, 1.5rem);
5 --spacing-md: clamp(1.5rem, 3vw, 2.5rem);
6 --spacing-lg: clamp(2rem, 4vw, 4rem);
7 --spacing-xl: clamp(3rem, 6vw, 6rem);
8}
9
10.section {
11 padding: var(--spacing-lg);
12 margin-bottom: var(--spacing-md);
13}1p {
2 font-size: clamp(16px, 1vw + 0.5rem, 20px);
3 /* Line height też płynny! */
4 line-height: clamp(1.5, 0.5vw + 1.3, 1.8);
5}1.grid {
2 display: grid;
3 grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
4 /* Płynny gap */
5 gap: clamp(1rem, 2vw, 3rem);
6}1.button {
2 /* Padding rośnie z rozmiarem ekranu */
3 padding: clamp(0.5rem, 1vw, 1rem) clamp(1rem, 2vw, 2rem);
4 font-size: clamp(14px, 1.5vw, 18px);
5}1.element {
2 /* Szerokość z dynamicznym padding */
3 width: calc(min(1200px, 100%) - 2rem);
4
5 /* Wysokość z minimum i dynamicznym offset */
6 height: calc(max(400px, 50vh) - 80px);
7
8 /* Padding proporcjonalny z limitami */
9 padding: calc(clamp(1rem, 3vw, 3rem) * 0.5);
10}1.container {
2 /* Maksymalnie 1400px, ale minimum 90%, z padding */
3 width: calc(min(1400px, 90%) - clamp(1rem, 3vw, 3rem) * 2);
4}1:root {
2 --base-spacing: 1rem;
3 --multiplier: 2;
4 --max-spacing: 4rem;
5}
6
7.element {
8 /* Dynamiczne spacing z variables */
9 padding: clamp(
10 var(--base-spacing),
11 calc(var(--base-spacing) * var(--multiplier)),
12 var(--max-spacing)
13 );
14}1:root {
2 /* Viewport units dla skalowania */
3 --fluid-min-width: 320;
4 --fluid-max-width: 1920;
5
6 /* Font sizes */
7 --fluid-xs: clamp(0.75rem, 0.5vw + 0.5rem, 0.875rem);
8 --fluid-sm: clamp(0.875rem, 0.75vw + 0.625rem, 1rem);
9 --fluid-base: clamp(1rem, 1vw + 0.75rem, 1.125rem);
10 --fluid-md: clamp(1.125rem, 1.5vw + 0.75rem, 1.5rem);
11 --fluid-lg: clamp(1.5rem, 2vw + 1rem, 2rem);
12 --fluid-xl: clamp(2rem, 3vw + 1.25rem, 3rem);
13 --fluid-2xl: clamp(2.5rem, 4vw + 1.5rem, 4rem);
14 --fluid-3xl: clamp(3rem, 5vw + 2rem, 5rem);
15}
16
17body {
18 font-size: var(--fluid-base);
19 line-height: clamp(1.5, 0.3vw + 1.4, 1.7);
20}
21
22h1 {
23 font-size: var(--fluid-3xl);
24 line-height: 1.1;
25}
26
27h2 {
28 font-size: var(--fluid-2xl);
29 line-height: 1.2;
30}
31
32h3 {
33 font-size: var(--fluid-xl);
34 line-height: 1.3;
35}
36
37.small {
38 font-size: var(--fluid-sm);
39}
40
41.large {
42 font-size: var(--fluid-lg);
43}1.tooltip::after {
2 content: attr(data-tooltip);
3 /* Użyj wartości atrybutu jako content */
4}1:root {
2 --primary-color: #3498db;
3 --spacing: 20px;
4}
5
6.element {
7 color: var(--primary-color);
8 padding: var(--spacing);
9
10 /* Z fallback */
11 background: var(--secondary-color, #2ecc71);
12}1.element {
2 /* RGB */
3 color: rgb(52, 152, 219);
4
5 /* RGBA z alpha */
6 background: rgba(52, 152, 219, 0.5);
7
8 /* HSL (Hue, Saturation, Lightness) */
9 color: hsl(204, 70%, 53%);
10
11 /* HSLA */
12 background: hsla(204, 70%, 53%, 0.5);
13}1.element {
2 background-image: url('pyramid.jpg');
3 list-style-image: url('hieroglyph.svg');
4}Wsparcie przeglądarek:
calc() - wszędzie (od 2013)min(), max() - Chrome 79+, Firefox 75+, Safari 11.1+ (2020)clamp() - Chrome 79+, Firefox 75+, Safari 13.1+ (2020)Performance:
Fallbacks dla starych przeglądarek:
1.element {
2 /* Fallback */
3 font-size: 20px;
4
5 /* Modern browsers */
6 font-size: clamp(16px, 2vw, 32px);
7}
8
9/* Lub z @supports */
10@supports (font-size: clamp(16px, 2vw, 32px)) {
11 .element {
12 font-size: clamp(16px, 2vw, 32px);
13 }
14}1/* ✅ Dobrze udokumentowane */
2h1 {
3 /* 24px @ 320px → 64px @ 1920px */
4 font-size: clamp(24px, 1.5rem + 2.5vw, 64px);
5}CSS Functions - zastosowania:
Zalety:
Najlepsze use cases:
Pamiętaj: CSS Functions to jak matematyka egipskich skrybów - precyzyjne obliczenia wbudowane bezpośrednio w arkusze stylów, pozwalające na tworzenie dynamicznych, responsywnych designów bez JavaScript!