Menu

clamp() CSS: Ukuran Font Fluid, min(), dan max()

clamp(MIN, PREFERRED, MAX) mengembalikan nilai yang diinginkan, tetapi tidak pernah kurang dari MIN atau lebih dari MAX. Pelajari bagaimana clamp() membuat ukuran font dan jarak menjadi fluid tanpa media query, cara menghitung nilai tengahnya, dan hubungannya dengan min() dan max().

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

Fungsi clamp()

clamp(MIN, PREFERRED, MAX) menerima tiga nilai dan mengembalikan nilai tengahnya, selama nilai itu tetap di antara dua nilai lainnya. Penggunaan klasiknya adalah judul yang membesar mengikuti layar tetapi berhenti di batas yang masuk akal, tanpa media query:

Nilai yang diinginkan adalah 1rem + 3vw: 16px ditambah 3% dari lebar. Di pratinjau selebar 800px, hasilnya 16 + 24 = 40px, yang berada di antara 24px (1.5rem) dan 48px (3rem), jadi judulnya 40px. Di ponsel 320px, nilai yang diinginkan menjadi 25.6px. Di atas 1067px nilainya akan melebihi 48px, jadi berhenti di 48px. Ubah ukuran jendela untuk melihat angkanya berubah; vw di sini adalah persentase dari lebar bingkai pratinjau.

Lihat tanpa mengubah ukuran jendela

vw mengikuti viewport, yang tidak mudah kamu ubah sambil membaca. Satuan container query mengikuti sebuah container: cqi adalah 1% dari lebar container. Geser slider untuk mengubah kotaknya, dan clamp() sejenis langsung menyesuaikan:

Geser ke awal, dan judulnya berhenti di 20px (MIN). Geser ke ujung, dan judulnya berhenti di 40px (MAX). Di antara keduanya, judul mengikuti 0.5rem + 6cqi. Mekanismenya sama dengan versi vw, hanya dengan penggaris yang lebih kecil.

Ketiga argumen

font-size: clamp(1rem, 0.8rem + 1vw, 1.5rem);
/*               MIN   PREFERRED     MAX    */
ArgumenPeranSatuan yang umum
MINnilai terkecil yang boleh dicapairem
PREFERREDnilai yang berubah mengikuti layarrem + vw (atau cqi)
MAXnilai terbesar yang boleh dicapairem

Hitungan bisa ditulis di dalam setiap argumen tanpa menulis calc(): 1rem + 2vw sudah benar apa adanya. + dan - butuh spasi di kedua sisinya, kalau tidak seluruh deklarasinya tidak valid.

Jika MIN lebih besar dari MAX, MIN yang menang: clamp(3rem, 5vw, 2rem) selalu 3rem.

Menghitung nilai tengah

Untuk membesarkan font dari 16px di layar 320px menjadi 24px di layar 1280px:

  1. Kemiringan: (24 − 16) ÷ (1280 − 320) = 8 ÷ 960 = 0.00833, yaitu 0.833vw (vw dihitung per 100px).
  2. Titik awal: 16px − 0.00833 × 320px = 13.33px, yaitu 0.833rem.
  3. Pasang batasnya di sekelilingnya:
font-size: clamp(1rem, 0.833rem + 0.833vw, 1.5rem);

Di lebar 320px hasilnya 13.33 + 2.67 = 16px, di 1280px hasilnya 13.33 + 10.67 = 24px, dan di luar rentang itu nilainya tetap di batas. "Clamp calculator" online melakukan persis aritmetika ini.

min() dan max()

clamp() adalah gabungan dari dua fungsi yang lebih sederhana:

  • min(a, b) mengembalikan nilai yang lebih kecil, jadi menetapkan batas atas.
  • max(a, b) mengembalikan nilai yang lebih besar, jadi menetapkan batas bawah.
  • clamp(MIN, VAL, MAX) sama dengan max(MIN, min(VAL, MAX)).

Namanya terasa terbalik pada awalnya: untuk mengatakan "paling banyak 600px", kamu memakai min().

Di pratinjau yang lebar, kartu pertama berhenti di 420px. Di dalam induk 260px, 100% adalah nilai yang lebih kecil, jadi kartu kedua lebarnya 260px. max(12px, 3%) memberi kartu pertama 3% dari lebar induknya (body: sekitar 23.5px di pratinjau 800px), dan kartu kedua 12px, karena 3% dari 260px (7.8px) berada di bawah batas bawah.

width: min(100%, 420px) menggantikan pasangan lama width: 100%; max-width: 420px; dalam satu deklarasi.

Lebih dari ukuran font: jarak dan lebar

clamp() berfungsi di properti apa pun yang menerima panjang. Persentase di nilai tengah membuat komponen menjadi fluid terhadap induknya, bukan terhadap viewport:

Di induk 300px, kartunya selebar 240px (80%) dengan padding 15px (5% dari 300px). Di induk 760px, 80% akan menjadi 608px, jadi kartunya berhenti di maksimum 520px, dan 5% dari 760px adalah 38px, jadi padding-nya berhenti di 32px.

Aksesibilitas: pertahankan rem di nilai tengah

Ukuran font yang hanya terdiri dari vw, seperti font-size: 5vw, tidak membesar saat pembaca menaikkan ukuran font default di pengaturan browser, dan juga tidak membesar saat browser di-zoom, karena zoom membuat viewport lebih sempit dalam piksel CSS. Menambahkan bagian rem (1rem + 2vw) dan batas dalam rem membuat teks tetap terikat pada pengaturan pembaca. Halaman satuan menjelaskan rem dan vw secara rinci.

Kesalahan umum

  • Memakai min() untuk batas minimum. min() memilih nilai yang lebih kecil, yaitu batas atas. Untuk "paling sedikit 12px", pakai max(12px, ...).
  • Tanpa spasi di sekitar + atau -. clamp(1rem, 1rem+2vw, 3rem) tidak valid, dan propertinya kembali ke nilai sebelumnya.
  • Hanya vw di nilai tengah. Teksnya jadi mengabaikan pengaturan ukuran font pembaca. Tambahkan suku rem.
  • MIN lebih besar dari MAX. Hasilnya selalu MIN, yang jarang sekali dimaksudkan.
  • Batas dalam px untuk ukuran font. Batas ini membatasi teks bahkan untuk pembaca yang butuh teks lebih besar. Pakai rem.

Pertanyaan yang sering diajukan

Apa fungsi clamp() di CSS?

clamp(MIN, PREFERRED, MAX) memakai nilai yang diinginkan selama nilainya tetap di antara dua batas, dan memakai batas terdekat jika tidak. font-size: clamp(1rem, 4vw, 2rem) mengikuti 4% lebar viewport, tetapi tidak pernah di bawah 1rem atau di atas 2rem.

Bagaimana cara membuat ukuran font responsif dengan clamp?

Taruh nilai berbasis viewport di tengah dan batas tetap di kedua sisinya, lalu campurkan rem ke nilai tengah supaya teks tetap mengikuti pengaturan ukuran font pembaca: font-size: clamp(1.5rem, 1rem + 2vw, 3rem);.

Apa yang terjadi jika nilai minimum lebih besar dari maksimum di clamp()?

Nilai minimum yang menang. clamp(3rem, 5vw, 2rem) selalu menghasilkan 3rem, karena clamp() menerapkan minimum setelah maksimum.

Apa perbedaan min() dan max() di CSS?

min() mengembalikan nilai terkecil, jadi berperan sebagai batas atas: width: min(100%, 600px) tidak pernah lebih lebar dari 600px. max() mengembalikan nilai terbesar, jadi berperan sebagai batas bawah: font-size: max(1rem, 2vw) tidak pernah lebih kecil dari 1rem.

Apakah clamp() didukung di semua browser?

Ya, clamp(), min(), dan max() berfungsi di semua versi terbaru Chrome, Edge, Firefox, dan Safari, dan bisa dipakai di properti apa pun yang menerima panjang, angka, persentase, atau sudut.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai