Fungsi calc()
calc() melakukan aritmetika di dalam nilai CSS, dan bisa mencampur satuan yang baru punya ukuran saat halaman ditata. Kasus klasiknya adalah "lebar penuh dikurangi sidebar tetap":
100% baru diketahui setelah halaman ditata, sedangkan 180px tetap, jadi tidak ada satu satuan pun yang bisa menyatakan ini. calc() yang menghitungnya: di pratinjau selebar 800px, barisnya 784px dan kolom utama mendapat 604px, dan baris di bawah tata letak mencetak angka sebenarnya. Sekarang flexbox atau grid bisa membuat tata letak ini tanpa hitungan, tetapi pengurangan yang sama tetap muncul di mana-mana: tinggi dikurangi header, lebar dikurangi gap.
Aturan sintaks
width: calc(100% - 2rem); /* + and - need spaces on both sides */
width: calc(100% / 3); /* divide by a plain number */
margin: calc(var(--space) * 2); /* multiply by a plain number */
height: calc(100vh - (64px + 1rem)); /* parentheses group */
| Aturan | Valid | Tidak valid |
|---|---|---|
Spasi di sekitar + dan - | calc(100% - 20px) | calc(100%-20px) |
*: minimal satu sisi berupa angka biasa | calc(2 * 1rem) | calc(2px * 3px) |
/: bagi panjang dengan angka biasa | calc(100% / 3) | width: calc(300px / 3px) (bukan panjang) |
| Satuan harus cocok | calc(1rem + 10px) | calc(1rem + 2s) |
Aturan spasi ada karena 100% -20px akan dibaca sebagai dua nilai terpisah, dengan nilai kedua berupa angka negatif. Jika sebuah calc() tidak valid, seluruh deklarasinya dibuang dan elemen tetap memakai nilai apa pun yang dimilikinya dari aturan sebelumnya.
Coba sebuah ekspresi
Ketik ekspresi apa saja untuk lebar kotak. Browser melaporkan apakah ekspresinya valid, dan berapa lebar hasilnya:
Coba 100%-200px (tidak valid, tanpa spasi), 100% / 3, 50% + 4rem, 2 * 120px, 200px * 2px (tidak valid), dan (100% - 40px) / 2.
calc() dengan variabel CSS
Variabel dan calc() sangat cocok dipakai bersama: simpan nilai dasar sekali lalu turunkan nilai lainnya dari situ. Variabel tanpa satuan menjadi panjang saat kamu mengalikannya dengan satu satuan:
Ubah --space menjadi 12px atau --cols menjadi 4, dan setiap nilai turunannya ikut berubah. Halaman variabel CSS membahas cara mendeklarasikan dan mengatur cakupannya.
Penggunaan umum
| Kebutuhan | calc() |
|---|---|
| Mengisi ruang di samping elemen yang ukurannya tetap | width: calc(100% - 240px) |
| Bagian di bawah header yang tetap | min-height: calc(100vh - 64px) |
| Setengah lebar dikurangi setengah gap | width: calc(50% - 8px) |
| Menengahkan kotak 100px yang diposisikan absolute | left: calc(50% - 50px) |
| Ukuran font yang sedikit membesar mengikuti layar | font-size: calc(1rem + 0.5vw) |
| Mengubah variabel angka menjadi panjang | calc(var(--n) * 1px) |
| Nilai negatif dari sebuah variabel | calc(var(--space) * -1) |
Untuk nilai yang harus tetap di antara dua batas, pakai clamp(), yang menerima hitungan yang sama di argumennya tanpa perlu menulis calc().
Di mana calc() bisa dipakai
Di mana pun panjang, persentase, angka, sudut, atau waktu diizinkan: width, margin, padding, top, font-size, line-height, ukuran track grid, transition-delay, dan sudut di dalam transform. calc() bisa ditulis bersarang, dan calc() yang bersarang sama saja dengan tanda kurung biasa.
Sudut adalah contoh yang bagus. Setiap garis penanda di bawah punya --i sendiri (0 sampai 11), dan satu aturan mengubahnya menjadi sudut dengan calc(var(--i) * 30deg):
Penanda ke-3 mendapat rotate(90deg), yang dilaporkan Chrome sebagai matriks matrix(0, 1, -1, 0, 0, 0): seperempat putaran. left: calc(50% - 2px) menengahkan setiap penanda dengan mengurangi setengah dari lebarnya sendiri yang 4px.
Kesalahan umum
- Tanpa spasi di sekitar
-atau+.calc(100%-20px)tidak valid dan diabaikan. - Mengalikan dua panjang.
calc(10px * 2px)tidak punya arti di CSS. Salah satu sisi*harus berupa angka biasa. - Memakai calc() untuk tinggi persentase tanpa tinggi induk.
calc(100% - 20px)untukheightmembutuhkan induk dengan tinggi yang diatur, sama sepertiheight: 100%. - Memakai calc() padahal flexbox atau grid sudah cukup.
width: calc(33.333% - 10px)untuk kolom mudah rusak;display: grid; grid-template-columns: repeat(3, 1fr); gap: 15pxtidak butuh hitungan. - Berharap ada pesan error. Browser tidak memberi peringatan tentang calc() yang tidak valid. Periksa elemennya di developer tools: deklarasi yang tidak valid ditampilkan dicoret.
Pertanyaan yang sering diajukan
Apa fungsi calc() di CSS?
calc() menghitung sebuah nilai dari ekspresi dengan +, -, *, dan /, dan bisa mencampur satuan yang baru diketahui browser saat menata halaman. width: calc(100% - 200px) adalah lebar penuh induknya dikurangi 200px, berapa pun lebar induk itu.
Kenapa calc() saya tidak berfungsi?
Penyebab paling umum adalah spasi yang hilang: + dan - harus punya spasi di kedua sisinya, jadi calc(100%-20px) tidak valid. Penyebab lain adalah mengalikan dua panjang (10px * 2px) atau membagi dengan sebuah panjang, yang tidak menghasilkan panjang. calc() yang tidak valid membuat seluruh deklarasinya tidak valid, jadi browser mengabaikannya.
Bisakah saya memakai variabel CSS di dalam calc()?
Bisa. calc(var(--gap) * 2) menggandakan sebuah variabel, dan calc(var(--columns) * 1px) mengubah angka tanpa satuan menjadi piksel. Nilai variabel disisipkan lebih dulu, baru kemudian dihitung.
Apakah saya perlu spasi di sekitar * dan / di calc()?
Tidak. Hanya + dan - yang wajib diberi spasi, karena tanpa spasi -20px akan dibaca sebagai angka negatif. Spasi di sekitar * dan / boleh ditulis atau tidak, tetapi menulisnya di semua tempat adalah aturan yang paling mudah diingat.
Apa perbedaan calc() dan clamp()?
calc() menghitung satu nilai dari sebuah ekspresi. clamp(MIN, VAL, MAX) menjaga nilai tetap di antara dua batas. Keduanya bisa digabung: setiap argumen clamp() sudah bisa berisi hitungan ala calc, misalnya clamp(1rem, 1rem + 2vw, 3rem).