Menu

calc() CSS: Mencampur Satuan, Sintaks, dan Contoh

calc() memungkinkan kamu berhitung di CSS dan mencampur satuan, misalnya 100% dikurangi sidebar tetap 200px. Pelajari aturan sintaksnya (spasi itu penting), calc() dengan variabel CSS, tata letak umum yang bisa diselesaikannya, dan kenapa calc() yang tidak valid diabaikan diam-diam.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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 */
AturanValidTidak valid
Spasi di sekitar + dan -calc(100% - 20px)calc(100%-20px)
*: minimal satu sisi berupa angka biasacalc(2 * 1rem)calc(2px * 3px)
/: bagi panjang dengan angka biasacalc(100% / 3)width: calc(300px / 3px) (bukan panjang)
Satuan harus cocokcalc(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

Kebutuhancalc()
Mengisi ruang di samping elemen yang ukurannya tetapwidth: calc(100% - 240px)
Bagian di bawah header yang tetapmin-height: calc(100vh - 64px)
Setengah lebar dikurangi setengah gapwidth: calc(50% - 8px)
Menengahkan kotak 100px yang diposisikan absoluteleft: calc(50% - 50px)
Ukuran font yang sedikit membesar mengikuti layarfont-size: calc(1rem + 0.5vw)
Mengubah variabel angka menjadi panjangcalc(var(--n) * 1px)
Nilai negatif dari sebuah variabelcalc(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) untuk height membutuhkan induk dengan tinggi yang diatur, sama seperti height: 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: 15px tidak 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).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai