Fungsi CSS min (), max () dan clamp ()

Dukungan untuk fungsi perbandingan CSS min(), max()dan clamp()muncul di Firefox pada 8 April 2020. Ini berarti bahwa fitur-fitur ini sekarang didukung di semua browser utama. Fitur-fitur CSS ini memperluas kemampuan kami untuk membuat tata letak yang dinamis dan merancang komponen yang lebih fleksibel daripada sebelumnya. Mereka dapat digunakan untuk menyesuaikan ukuran elemen wadah, font, indentasi, dan banyak lagi. Benar, seorang desainer web yang membuat tata letak halaman dengan mempertimbangkan kemungkinan menggunakan fungsi-fungsi luar biasa ini mungkin perlu belajar berpikir dengan cara baru. Hari ini saya ingin berbicara tentang fitur-fitur dari fungsi-fungsi ini, menjelaskan segala sesuatu yang mungkin tidak dapat dimengerti di dalamnya, dan memberikan contoh praktis penggunaannya.





Dukungan browser


Pertama, saya ingin menyentuh dukungan browser untuk fungsi min(), max()dan clamp(). Namun demikian, mereka muncul relatif baru-baru ini. Perlu dicatat bahwa fungsi min()dan max()menggunakan tingkat dukungan browser yang sama.


Dukungan untuk fungsi min () (informasi dukungan maks () juga terlihat seperti ini)

Berikut ini adalah informasi tentang dukungan untuk fungsi tersebutclamp().


Dukungan fungsi Clamp ()

Fungsi perbandingan CSS


Spesifikasi CSS memberi tahu kami bahwa ada fungsi perbandingan min() , max()dan clamp()memungkinkan kami untuk membandingkan nilai ekspresi dan mewakili salah satunya. Nilai yang dikembalikan oleh suatu fungsi tergantung pada fitur-fiturnya. Jelajahi fitur-fitur ini.

Fungsi min ()


Suatu fungsi min()mengambil satu atau lebih nilai, dipisahkan oleh koma, dan mengembalikan yang terkecil darinya. Fungsi ini digunakan untuk membatasi nilai properti CSS ke tingkat maksimum yang ditentukan secara ketat.

Perhatikan contoh berikut. Kita membutuhkan lebar maksimum elemen untuk tidak melebihi 500px.

.element {
    width: min(50%, 500px);
}


Dengan lebar viewport 1150px, yang lebih besar dari 1000px, elemen akan memiliki lebar 500px.

Browser harus memilih nilai terkecil dari50%dan500px. Lebar viewport memengaruhi hasil seleksi. Jika 50% dari lebar viewport lebih dari500px, maka nilai ini akan diabaikan dan fungsinya akan kembali500px.

Jika tidak, jika 50% dari lebar viewport kurang500px, nilai yang dihasilkan akan digunakan untuk menyesuaikan lebar elemen. Bagaimana menurut Anda, pada lebar area tampilan mana 50% dari lebarnya tidak akan melebihi500px? Ini jelas1000px. Dengan lebar ini, kedua nilai yang diteruskan ke fungsi akan sama. Jika lebar viewport kurang1000px, maka akan digunakan untuk mengatur lebar elemen.


Jika lebar viewport kurang dari 1000px, maka 50% dari lebar ini akan digunakan untuk menyesuaikan lebar elemen.

Saya harap saya bisa menjelaskan semua ini dengan jelas. Saya memikirkan fungsi itu untuk waktu yang lamamin(), mencoba menembus esensinya. Karena itu, saya ingin sekali membicarakannya dengan jelas. Ini adalah video yang menunjukkan hasil penggunaan fitur ini.


Lebar item dibatasi hingga 500px.

Ini adalah contoh interaktif yang digunakan untuk merekam video di atas. Untuk melihat fungsimin()dalam tindakan, cobalah mengubah ukuran jendela browser.

Fungsi maks ()


Fungsi ini max()mengambil satu atau lebih nilai, dipisahkan dengan koma, dan mengembalikan yang terbesar dari mereka. Fungsi ini digunakan untuk memperbaiki nilai minimum yang dapat diambil properti CSS.

Pada contoh berikut ini, setidaknya kita membutuhkan lebar elemen 500px.

.element {
    width: max(50%, 500px);
}


Jika 50% dari lebar viewport lebih besar dari 500px - nilai ini akan digunakan untuk menyesuaikan lebar elemen

.Peramban perlu memilih nilai maksimum dari50%dan500px. Pilihannya tergantung pada lebar viewport. Jika 50% dari lebar viewport kurang dari500px, browser akan mengabaikan nilai ini dan menggunakan nilai tersebut500px.

Jika 50% dari lebar viewport lebih besar500px, maka lebar elemen akan diset sama dengan nilai ini. Seperti yang Anda lihat, fungsimax()adalah kebalikan dari fungsimin().

Untuk lebih memahami ini, lihatdemo interaktif ini .

Fungsi penjepit ()


Fungsi ini clamp()memungkinkan Anda untuk membatasi rentang variasi nilai tertentu dengan menetapkan batas bawah dan atas. Dibutuhkan tiga parameter: nilai minimum, nilai yang dihitung (disarankan), dan nilai maksimum. Jika nilai yang dihitung tidak melebihi batas yang dibatasi oleh nilai minimum dan maksimum yang diteruskan ke fungsi, maka itu akan mengembalikan nilai itu.

Berikut ini sebuah contoh.

.element {
    width: clamp(200px, 50%, 1000px);
}

Di sini kita menyesuaikan lebar elemen, yang seharusnya tidak kurang 200pxdan lebih banyak 1000px. Jika nilai dalam 50%tidak melampaui batas ini, nilai ini digunakan. Ini tampilannya.


Jika 50% dari lebar viewport jatuh ke dalam kisaran 200px-1000px - nilai ini akan digunakan untuk mengatur lebar elemen. Dalam hal ini, 575px.

Mari kita periksa contoh ini:

  • Lebar elemen tidak akan pernah lebih kecil 200px.
  • Parameter kedua dari fungsi, ditetapkan sebagai 50%, akan digunakan hanya jika lebar viewport lebih besar 400pxdan lebih kecil 2000px.
  • Lebar item tidak akan melebihi 1000px.

Sebagai hasilnya, kita dapat mengatakan bahwa fungsi ini clamp()memungkinkan Anda untuk menentukan kisaran di mana nilai yang dihitung yang dikirimkan dapat berubah.

Di sini Anda dapat bereksperimen dengan halaman yang bergaya menggunakan fungsi ini.

▍ Bagaimana hasil dari fungsi clamp () dihitung?


Anda dapat menemukan informasi tentang MDN bahwa ketika fungsi yang digunakan sebagai nilai properti CSS clamp(), itu setara dengan pembangunan di mana max()dan fungsi yang diterapkan min(). Lihatlah contoh berikut:

.element {
    width: clamp(200px, 50%, 1000px);
    /*  -    */
    width: max(200px, min(50%, 1000px));
}

Nilai ini 50%tergantung pada lebar area tampilan browser. Bayangkan bahwa lebar viewport adalah 1150px.

.element {
    width: max(200px, min(50%, 1000px));
    /* ,      1150px */
    width: max(200px, min(575px, 1000px));
    /*   */
    width: max(200px, 575px);
    /*   */
    width: 575px;
}

▍ Masalah konteks


Nilai yang dihitung tergantung pada konteksnya. Jika Anda menentukan nilai dihitung, Anda dapat menggunakan unit pengukuran yang berbeda: %, em, rem, vw/vh. Bahkan jika nilai dinyatakan sebagai persentase, saat menghitungnya, baik lebar viewport dapat digunakan - jika elemen ada di tag <body>, atau lebar elemen lain yang merupakan wadah elemen.

▍ Ekspresi matras


Perlu dikatakan bahwa ketika menggunakan suatu fungsi, clamp()Anda dapat meneruskan ekspresi matematis padanya, yang menyelamatkan kita dari keharusan menggunakan suatu fungsi calc(). Spesifikasi memberi tahu kita bahwa clamp()ekspresi matematis lengkap dapat digunakan dalam setiap argumen . Oleh karena itu, tidak perlu fungsi bersarang calc(). Selain itu, jika Anda perlu menerapkan beberapa batasan pada nilai akhir, Anda bisa memberikan lebih dari dua argumen ke fungsi.

Lihatlah contoh berikut:

.type {
  /*  font-size ,   12px  100px */
  font-size: clamp(12px, 10 * (1vw + 1vh) / 2, 100px);
}

Apa yang akan berubah fungsi perbandingan CSS dalam cara kami mendesain tata letak halaman?


Sering terjadi bahwa perancang, mendesain laman, berfokus pada perangkat seluler dan desktop, mengandalkan dua skenario untuk penggunaannya. Dan ketika mengerjakan beberapa proyek, lebih banyak skenario harus diperhitungkan.

Saya melihat situasi ini seperti yang ditunjukkan di bawah ini.


Lantai atas adalah bagaimana halaman dirancang hari ini. Di bawah ini adalah apa yang dapat Anda harapkan di masa depan. Bagian

atas ilustrasi adalah bagaimana halaman dirancang hari ini. Di sini Anda dapat melihat beberapa langkah yang mewakili area tampilan yang berbeda di mana halaman harus dirancang. Langkah-langkah ini dapat, misalnya, mewakili nilai properti. Bagian bawah dari ilustrasi menunjukkan rentang nilai kontinu yang dapat diperoleh dengan membatasi nilai ini ke minimum dan maksimum tertentu. Saya percaya bahwa di masa depan, misalnya, ketika mengatur ukuran font, desainer akan melakukan sesuatu yang mirip dengan yang ditunjukkan di bawah ini.


Nilai minimum, yang direkomendasikan, dan maksimum properti.

Bagi saya, ini luar biasa. Saya mengagumi gagasan mengerjakan proyek yang komponennya membutuhkan fleksibilitas. Tentu saja, tidak semua komponen harus dinamis, tetapi beberapa di antaranya mungkin sangat baik.

Gunakan kasing


▍ Sidebar dan area halaman utama



Di sebelah kiri adalah panel samping. Di sebelah kanan adalah area utama halaman.

Biasanya panel samping halaman memiliki lebar tetap, dan lebar area utama secara fleksibel menyesuaikan ke area tampilan. Kami dapat memperluas kemampuan bilah samping dan membuatnya lebih dinamis, membuatnya, dengan area tampilan yang cukup besar, membutuhkan lebih banyak ruang. Untuk mencapai ini, Anda perlu membatasi ukuran lebar minimum bilah sisi menggunakan fungsimax().

Perhatikan contoh berikut.

.wrapper {
    display: flex;
}

aside {
  flex-basis: max(30vw, 150px);
}

main {
  flex-grow: 1;
}

Lebar minimum elemen asideadalah 150px. Ini akan mengambil ukuran 30vwjika lebar viewport lebih besar 500px(500 * 30% = 150).

β†’ Ini sebuah contoh

▍ Ukuran font header



Penyesuaian ukuran font header fleksibel

Skrip yang sangat baik untuk menggunakan fungsiclamp()ini adalah penyesuaian ukuran font header fleksibel. Bayangkan bahwa kita membutuhkan ukuran font minimum dari header16px, dan maksimum -50px. Berkat penggunaan fungsi,clamp()kita dapat membuat ukuran font berada dalam nilai-nilai ini tanpa menjadi lebih rendah atau lebih tinggi.

.title {
    font-size: clamp(16px, 5vw, 50px);
}

Fungsi clamp()adalah solusi sempurna untuk masalah di atas. Ini memungkinkan Anda untuk mengatur ukuran font sehingga teks tetap dapat diakses dan mudah dibaca pada berbagai ukuran area tampilan. Jika di sini, misalnya, Anda menggunakan fungsi ini min(), maka kami akan kehilangan kendali atas ukuran font pada halaman yang ditampilkan di area tampilan kecil.

.title {
    font-size: min(3vw, 24px); /*  ,     */
}

Berikut ini adalah ilustrasi dari ide ini.


Menggunakan fungsi min () membuat teks tampak terlalu kecil di layar kecil.

Pada layar perangkat seluler, ukuran font terlalu kecil. Oleh karena itu, tidak disarankan untuk hanya menggunakan fungsi untuk mengatur ukuran fontmin(). Tentu saja, ukuran font dapat dikonfigurasi ulang menggunakan kueri media, tetapi kemudian makna menggunakan fungsi perbandingan CSS benar-benar hilang.

Seperti yang telah disebutkan, suatu fungsimin()dapat digunakan di dalam suatu fungsimax(). Ini memungkinkan Anda mereproduksi fitur-fitur fungsiclamp().

.title {
    font-size: max(16px, min(10vw, 50px));
}

Di sini Anda dapat bereksperimen dengan sebuah contoh.

Saya ingin mencatat bahwa setelah diskusi di Twitter ternyata tidak tepat untuk menggunakan 10vwukuran font sebagai nilai yang dihitung. Yaitu, kita berbicara tentang fakta bahwa ini akan menyebabkan masalah aksesibilitas jika pengguna memperbesar peramban.

Karena itu, lebih baik melakukannya:

.title {
    font-size: clamp(16px, (1rem + 5vw), 50px);
}

Di sini, ekspresi ditentukan sebagai ukuran font yang dihitung (1rem + 5vw). Ini menyelesaikan masalah.

Head Tajuk dekoratif



Judul tembus dekoratif ditampilkan menggunakan font yang sangat besar.

Apakah Anda melihat teks transparan besar yang terletak di bawah judul? Ini adalah judul dekoratif, dimensi yang harus konsisten dengan ukuran viewport. Untuk membentuk header seperti itu, Anda dapat menggunakan fungsimax()dengan nilai yang dinyatakan dalam satuan ukuran yang diteruskan ke sanavw. Ini akan memungkinkan untuk memastikan bahwa ukuran font tidak kurang dari nilai yang ditentukan.

.section-title:before {
  content: attr(data-test);
  font-size: max(13vw, 50px);
}

β†’ Ini adalah contoh yang bagus

▍ Menghasilkan gradien halus di area tampilan yang berbeda


Saat menyesuaikan gradien menggunakan CSS, Anda mungkin perlu menyesuaikannya secara dinamis agar gradien ditampilkan di layar ponsel lebih halus. Lihatlah contoh berikut. Ada gradien seperti itu:

.element {
    background: linear-gradient(135deg, #2c3e50, #2c3e50 60%, #3498db);
}


Gradien pada layar seluler ditandai oleh transisi antar warna yang terlalu tajam.

Harap perhatikan bahwa pada layar seluler, batas pemisahan warna terlihat jelas. Ini buruk. Anda dapat memperbaiki situasi dengan bantuan penyelidikan media lama yang baik. (Ups, sepertinya saya sudah mempertimbangkan pertanyaan media sebagai "teknologi lama yang bagus.")

@media (max-width: 700px) {
    .element {
        background: linear-gradient(135deg, #2c3e50, #2c3e50 25%, #3498db)
    }
}

Meskipun ini adalah cara normal untuk menyelesaikan masalah, dalam situasi yang sama kita dapat menggunakan fungsi CSS min().

.element {
    background: linear-gradient(135deg, #2c3e50, #2c3e50 min(20vw, 60%), #3498db);
}

Hasilnya adalah apa yang ditunjukkan di bawah ini.


Gradien terlihat halus ketika dilihat di layar mana saja

β†’ Ini adalah demonstrasi dari ide ini

▍ Gradien tembus


Ketika Anda perlu menempatkan teks di atas foto, maka di bawahnya harus "diletakkan" gradien. Ini akan membuatnya lebih mudah untuk membaca teks. Seperti pada contoh sebelumnya, parameter gradien harus bergantung pada ukuran viewport. Lihatlah gambar berikut.


Pengaturan gradien fleksibel pada layar dengan ukuran berbeda

.element {
    background: linear-gradient(to top, #000 0, transparent max(20%, 20vw));
}

Berkat peningkatan kecil ini, gradien pada perangkat seluler akan terlihat jauh lebih baik dari sebelumnya. Jika ukuran gradien sama dengan, pada layar desktop, 50% dari elemen induk, maka pada perangkat seluler seharusnya sudah menjadi sesuatu di wilayah 30%. Anda dapat mengatur nilai minimum ukuran gradien menggunakan fungsi max().

β†’ Ini sebuah contoh

Marg Margin luar dinamis



Menyesuaikan lekukan

Anda dapat menggunakan unit yang terkait dengan karakteristik viewport untuk menyesuaikan lekukan dinamis elemen. Namun, pendekatan ini tidak selalu menunjukkan dirinya dengan baik. Faktanya adalah bahwa pengguna dapat melihat halaman pada layar yang diputar dari perangkat seluler dengan ketinggian vertikal yang sangat besar. Berikut cara mengatasi masalah ini menggunakan kueri media:

h1, h2, h3, h4, h5 {
    margin: 7vh 0 1.05rem;
}

@media (max-height: 2000px) {
    h1, h2, h3, h4, h5 {
        margin: 2.75rem 0 1.05rem;
    }
}

Meskipun kode ini bekerja dengan benar, efek yang sama dapat dicapai hanya dengan satu baris kode:

h1, h2, h3, h4, h5 {
    margin: min(7vh, 2.75rem) 0 1.05rem;
}

Dengan menggunakan fungsi ini, min()kami menetapkan nilai indentasi maksimum ke 2.75rem. Seperti yang Anda lihat, ini sangat sederhana dan nyaman.

β†’ Ini adalah contoh yang bagus

▍ Lebar Kontainer



Menyesuaikan secara dinamis lebar wadah.

Misalkan kita membutuhkan elemen wadah yang lebarnya 80% dari lebar elemen induknya. Lebar wadah tidak boleh melebihi780px. Bagaimana cara membuat wadah serupa? Biasanya dalam situasi ini, mereka melakukan sesuatu seperti ini:

.container {
    max-width: 780px;
    width: 80%;
}

Tetapi menggunakan fungsi ini min()memungkinkan Anda untuk membatasi lebar maksimal wadah seperti ini:

.container {
    max-width: min(80%, 780px);
}

β†’ Ini adalah contoh yang bagus

▍ Indentasi Vertikal


clamp()Saya suka fungsi ini sangat ideal untuk membatasi ukuran lekukan bagian halaman. Lihatlah contoh berikut, yang menunjukkan konfigurasi bagian atas halaman (bagian pahlawan).


Mengatur lekukan bagian yang terletak di bagian atas halaman. Anda dapat secara

fleksibel menyesuaikan lekukan bagian tersebut dengan hanya menggunakan satu baris kode CSS.

.hero {
    padding: clamp(2rem, 10vmax, 10rem) 1rem;
}

β†’ Ini sebuah contoh

Ound Batas dan Bayangan


Berikut adalah video yang menunjukkan elemen yang memiliki batas lebar.


Elemen dengan batas lebar

Dalam beberapa kasus, desain halaman menggunakan elemen dengan batas lebar dan dengan jari-jari radius besar. Saat menampilkan elemen seperti itu di layar seluler, batasannya harus dibuat lebih kecil. Hal yang sama berlaku untuk radius sudut. Dengan menggunakan fungsi ini,clamp()Anda dapat menyesuaikan parameter perbatasan secara dinamis, mengikatnya dengan lebar area tampilan.

.element {
    box-shadow: 0 3px 10px 0 red;
    border: min(1vw, 10px) solid #468eef;
    border-radius: clamp(7px, 2vw, 20px);
    box-shadow: 0 3px clamp(5px, 4vw, 50px) 0 rgba(0, 0, 0, 0.2);
}

Di sini Anda dapat bereksperimen dengan contoh yang berfungsi.

Istance Jarak antar sel dari tata letak kisi



Tata letak kisi

Cara menarik untuk menggunakan fungsiclamp()ini adalah mengatur propertigrid-gapdalam tata letak kisi. Secara khusus, kita berbicara tentang fakta bahwa pada layar ponsel, jarak antara sel-sel grid akan lebih sedikit daripada pada yang desktop.

.wrapper {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  grid-gap: clamp(1rem, 2vw, 24px);
}

Jika Anda tertarik dalam menggunakan fungsi CSS perbandingan ketika merancang layout grid, lihatlah ini artikel yang baik.

β†’ Ini adalah contoh untuk bagian ini

▍Gunakan dalam fungsi CSS untuk membandingkan nilai tanpa unit


Dalam perjalanan bereksperimen dengan fungsi-fungsi CSS, saya memutuskan untuk mencari tahu apa yang terjadi jika Anda melewatkan fungsi clamp()sebagai nilai minimum 0. Begini tampilannya dalam kode:

.element {
    width: clamp(0, 10vmax, 10rem);
}

Ini adalah CSS yang buruk. Saya percaya faktanya adalah bahwa angka tanpa unit pengukuran tidak boleh digunakan di sini.

▍ Mekanisme redundansi untuk browser yang tidak mendukung min (), max () dan clamp ()


Seperti halnya dengan fitur CSS baru lainnya, fungsi penerapan min(), max()dan clamp(), Anda perlu menjaga mekanisme cadangan. Untuk membuat mekanisme ini, Anda dapat menggunakan salah satu pendekatan berikut.

1. Konfigurasi manual dari mekanisme cadangan


Di sini, konfigurasi manual dipahami sebagai menambahkan ke kode properti yang menikmati dukungan browser yang luas. Properti ini harus diletakkan di depan properti yang menggunakan fungsi perbandingan CSS. Begini tampilannya:

.hero {
    padding: 4rem 1rem;
    padding: clamp(2rem, 10vmax, 10rem) 1rem;
}

Di sini browser pendukung akan clamp()mengabaikan ekspresi pertama. Dan mereka yang tidak mendukung fungsi ini akan menggunakan cara pertama untuk menyesuaikan lekukan.

2. Menggunakan arahan CSS mendukung


Arahan yang @supportsdirancang untuk menguji dukungan browser untuk berbagai teknologi dapat digunakan untuk mengetahui apakah browser dapat bekerja dengan fungsi perbandingan CSS. Saya lebih suka menggunakan solusi ini daripada yang manual yang dijelaskan dalam paragraf pertama. Faktanya adalah bahwa setiap browser yang mendukung fungsi perbandingan juga harus mendukung arahan @supports.

.hero {
    /*     ,   min() */
    padding: 4rem 1rem;
}

@supports (width: min(10px, 5vw)) {
   /*   ,   min() */
  .hero {
    padding: clamp(2rem, 10vmax, 10rem) 1rem;
  }
}

▍Tentang ketersediaan konten


Sementara fitur perbandingan CSS memberi kita cara baru untuk membuat halaman web yang lebih fleksibel menggunakannya, kita harus berhati-hati. Misalnya, menggunakan fungsi saja min()untuk mengatur properti font-sizetidak cukup. Faktanya adalah pada perangkat seluler, font yang ukurannya hanya menggunakan fungsi ini mungkin terlalu kecil. Saat mengatur konten halaman yang sangat penting, ingatlah untuk membatasi pengaturan minimum dan maksimum. Jika tidak, ini dapat memperburuk pengalaman pengguna bekerja dengan proyek.

Apakah Anda menggunakan fungsi CSS min(), max()dan clamp()?


All Articles