Gap - masa depan yang cerah untuk lekukan di Flexbox (seperti di Grid)



Salah satu bagian favorit saya dari spesifikasi Grid CSS adalah grid-gap . Mereka memudahkan indentasi antar elemen dalam grid.

Margin dan teknik yang kami gunakan untuk menerapkannya dalam situasi yang berbeda telah lama menjadi salah satu poin utama yang mengganggu dalam CSS.

W3C merekomendasikan untuk meninggalkan properti grid-gap demi gap sederhana dan penggunaannya di Flexbox dan Multi-Kolom.

Dalam tutorial ini, kita akan melihat bagaimana margin ditambahkan ke Flexbox sebelumnya dan bagaimana properti gap melakukan ini, memungkinkan kita untuk mendapatkan lekukan tanpa tambahan tweak.



Margin dalam kotak Flexbox biasa


Dalam contoh ini, kami akan mengambil sekelompok blok, menggunakan Flexbox untuk membuat gaya mesh, dan kemudian memisahkan blok dari satu sama lain menggunakan margin.

Mari kita mulai dengan HTML dasar. Kami memiliki flex-item. flex-container dan flex-item.

 <div class="flex-container"> <div class="flex-item"></div> <div class="flex-item"></div> <div class="flex-item"></div> <div class="flex-item"></div> <div class="flex-item"></div> <div class="flex-item"></div> <div class="flex-item"></div> <div class="flex-item"></div> </div> 

Berkat perilaku Flexbox, konten akan terletak di sebelah satu sama lain. Berdasarkan nilai lebar wadah, kami menentukan ukuran anak-anak dan kemudian membiarkan mereka ditransfer menggunakan properti flex-wrap .

 .flex-container { display: flex; flex-wrap: wrap; } .flex-item { width: calc(100% / 3); } 


Ini memberi kita balok dengan ukuran sempurna sama dengan 1/3 dari lebar wadah. Mari atur margin untuk menambahkan ruang vertikal dan horizontal di antara setiap elemen.

 .flex-item { width: calc(100% / 3); margin-right: 1rem; margin-bottom: 1rem; } 


Aduh! Elemen kami, yang 1/3 dari wadah, tidak lagi sesuai dengan lebar elemen induk. Meskipun margin antar baris ternyata cukup benar dan tidak menimbulkan masalah.

Kita perlu mengatur lebar anak-anak, dengan mempertimbangkan ruang tambahan yang dibuat oleh margin. Anda juga perlu mengatur properti margin-right ke nol untuk setiap elemen ketiga.

Sekarang kita memiliki dua margin sama dengan 1rem dan kita harus mengurangi 2rem ini secara merata dari lebar ketiga elemen.

 flex-item { // width: calc(100% / 3); width: calc((100% / 3) - (2rem / 3)); // one-third - two margins divided equally among 3 items margin-right: 1rem; margin-bottom: 1rem; } .flex-item:nth-child(3n) { margin-right: 0; } 



Terlihat terlalu keras? Bagi saya, ya. Ada cara-cara sederhana untuk melakukan ini, tetapi mereka juga tidak memberi Anda jarak 1rem yang tepat antar kolom. Kode kompleks ini juga sangat menyulitkan desain responsif.

Ketika properti gap tersedia untuk digunakan di Flexbox di semua browser, kode menjadi lebih bersih. Kita juga dapat beralih dari mengatur lebar untuk anak-anak ke menggunakan sifat flex-grow , flex-shrink dan flex-basis .

Indentasi dengan Gap


Dengan menggunakan properti gap, kita menyingkirkan kebutuhan untuk melakukan sebagian besar trik dengan lebar elemen. Ini juga memungkinkan kita untuk kembali menggunakan nilai flex-grow / flex-shrink.

Dalam contoh berikut, kami masih menggunakan display: flex dan flex-wrap: wrap properti untuk wadah kami, tetapi sekarang kami juga menambahkan properti gap . Ini adalah properti singkatan yang menggabungkan row-gap dan row-gap - column-gap . Lihat dokumentasi MDN untuk semua metode.

Sekarang, alih-alih mengatur lebar untuk setiap elemen flex, kami mengatur nilai flex-grow, flex-shrink dan flex-basis. Properti flex-basis akan menentukan berapa banyak kolom browser yang akan dipasang di wadah. Kami masih akan menggunakan fungsi calc() untuk ini, tetapi kode akhirnya akan menjadi lebih bersih

 .flex-container { display: flex; flex-wrap: wrap; gap: 1rem; } .flex-item { flex: 1 1 calc((100% / 3) - 2rem); } 



Pembaca yang penuh perhatian juga akan melihat bahwa sekarang ini memungkinkan elemen terakhir tumbuh dalam ukuran untuk mengisi ruang baris di mana elemen tersebut hilang. Inilah yang tidak bisa dilakukan oleh CSS Grid dan Flexbox berdasarkan lebar elemen.

Bonus: Gap juga memfasilitasi daya tanggap.


Dalam contoh asli kami, jika kami ingin mengubah jumlah kolom kontainer pada titik kontrol tertentu, kami harus menghitung ulang lebar DAN mengubah pemilih nth-child untuk menyingkirkan margin.

Dalam contoh gap , yang perlu kita lakukan adalah menyesuaikan properti berbasis flex, dan Anda selesai.

 .flex-item { flex: 1 1 100%; // 1 across at mobile } @media (min-width: 640px) { .flex-item { flex-basis: calc((100% / 2) - 1rem); // 2 across at tabletish } } @media (min-width: 1024px) { .flex-item { flex-basis: calc((100% / 3) - 2rem); // 3 across at desktop } } 

Saya tidak berbohong, saya masih lebih suka CSS Grid untuk pola desain seperti itu, tetapi saya harap Anda melihat beberapa contoh penggunaan untuk fitur baru yang luar biasa ini.

Mencari masa depan


Sekarang properti gap hanya didukung di Firefox. Jadi, jika artikel ini menarik minat Anda, dengan rendah hati saya minta maaf. Anda harus menunggu browser lain untuk mengejar ketinggalan. Saya harap mereka memperhatikan penderitaan pengembang yang terkait dengan margin dan cepat atau lambat memberi kita peluang baru.



Tambahan dari penerjemah


Tampaknya masih ada trik yang memungkinkan Anda untuk menyingkirkan kebutuhan sekarang dengan menggunakan, misalnya, nth-child(3n) untuk menghapus lekukan yang tepat dari elemen Flex yang berdekatan dengan tepi kanan wadah, dan bahkan memperbaikinya setiap kali jumlah kolom di Flex- perubahan wadah.

Tentu saja, itu juga tidak sempurna dan adalah sebagai berikut:

  1. Dalam markup HTML, bungkus wadah Flex dalam tag bungkus opsional
  2. Untuk anak-anak, misalnya, alih-alih margin-right: 10px , atur margin-left: 10px
  3. Dan untuk mengkompensasi kenaikan indentasi kiri, perlu mengatur properti untuk wadah Flex dengan nilai margin-left: -10px; negatif margin-left: -10px;

Hasilnya dapat dilihat di CodePen

Source: https://habr.com/ru/post/id468327/


All Articles