[Bookmark] CSS: Menggunakan Indentasi dan Indentasi

Jika beberapa elemen halaman web berdekatan satu sama lain, maka pengguna merasa bahwa elemen-elemen ini memiliki kesamaan. Pengelompokan elemen membantu pengguna memahami hubungan mereka dengan mengevaluasi jarak di antara mereka. Jika semua elemen terletak pada jarak yang sama satu sama lain, akan sulit bagi pengguna untuk menelusuri halaman untuk mencari tahu mana dari mereka yang terkait satu sama lain dan mana yang tidak. Artikel ini didedikasikan untuk semua yang perlu Anda ketahui tentang pengaturan jarak antar elemen dan tentang pengaturan ruang elemen internal. Secara khusus, kita akan berbicara tentang situasi mana yang layak menggunakan padding internal, dan di mana - eksternal (margin).




Jenis jarak CSS


Jarak antara elemen dan bagian-bagiannya, dapat disesuaikan dengan CSS, terdiri dari dua jenis. Mereka, dalam kaitannya dengan elemen, dibagi menjadi internal dan eksternal. Bayangkan kita memiliki elemen. Jika di dalamnya ada jarak tertentu antara beberapa bagiannya, maka ini adalah indentasi internal. Jika kita berbicara tentang jarak antara elemen-elemen individual - ini adalah indentasi luar.


Ruang dalam dan ruang luar

Dalam CSS, jarak antara elemen dan komponennya dapat disesuaikan sebagai berikut:

.element {
    padding: 1rem;
    margin-bottom: 1rem;
}

Properti paddingdigunakan di sini untuk menyesuaikan indentasi, dan properti margindigunakan untuk mengkonfigurasi indentasi. Semuanya sangat sederhana. Kebenaran? Tetapi menyesuaikan jarak dalam CSS bisa sangat rumit jika Anda bekerja dengan komponen yang memiliki banyak bagian kecil dan anak-anak.

▍ Properti Margin - Indent


Properti ini margindigunakan untuk mengatur jarak antara elemen individu. Sebagai contoh, contoh sebelumnya menggunakan properti CSS margin-bottom: 1remuntuk menambahkan jarak vertikal antara dua elemen yang terletak satu di atas yang lain.

Lekukan eksternal dapat diatur untuk empat sisi elemen (atas, kanan, bawah, kiri - atas, kanan, bawah, kiri). Oleh karena itu, sebelum beralih ke contoh dan diskusi tentang berbagai cara pengaturan jarak, penting untuk menjelaskan beberapa konsep dasar.

▍ Tutup bantalan luar


Jika kita menggambarkan konsep "keruntuhan margin luar" dengan kata-kata sederhana, maka kita dapat mengatakan bahwa ini terjadi jika dua elemen yang terletak satu di atas yang lain memiliki margin luar, dan indentasi salah satunya lebih besar daripada indentasi yang lain. Dalam hal ini, indentasi yang lebih besar akan digunakan, dan yang lebih kecil akan diabaikan.


Lekukan yang lebih besar menang.

Pada diagram di atas, properti dikonfigurasikan pada elemen atas dan propertimargin-bottompada elemen bawahmargin-top. Jarak vertikal antara elemen-elemen sesuai dengan indentasi yang lebih besar.

Untuk menghindari masalah ini, disarankan untuk mengkonfigurasi lekukan yang sama di semua elemen (seperti dijelaskan di sini ). Dan inilah fakta menarik lainnya. Sumber daya Trik CSSmemberikan suara pada penggunaan propertimargin-bottomdanmargin-top. Ternyata, properti itumargin-bottommenang, mengambil 61% suara.

Inilah cara mengatasi masalah ini:

.element:not(:last-child) {
    margin-bottom: 1rem;
}

Menggunakan pemilih CSS :notmembuatnya mudah untuk menghapus indentasi luar dari anak terakhir untuk menghilangkan ruang yang tidak perlu di antara elemen-elemen.

Ini adalah demo bekerja dengan margin luar.

Contoh lain yang terkait dengan collapsing margin luar terkait dengan elemen anak dan orang tua. Misalkan Anda memiliki HTML berikut:

<div class="parent">
  <div class="child">I'm the child element</div>
</div>

Inilah gayanya:

.parent {
  margin: 50px auto 0 auto;
  width: 400px;
  height: 120px;
}

.child {
  margin: 50px 0;
}

Beginilah hasil dari memvisualisasikan semua ini.


Anak dan orang tua

Perhatikan bahwa anak berbatasan dengan bagian atas orang tua. Ini adalah hasil dari keruntuhan margin luar mereka. Menurut W3C , ada beberapa opsi untuk menyelesaikan masalah ini:

  • Menambahkan properti borderke elemen induk.
  • Menetapkan properti displayelemen anak ke nilai inline-block.

Solusi yang lebih dapat dimengerti untuk masalah ini adalah dengan mengatur properti dari padding-topelemen induk.


Mengatur indentasi atas elemen induk

▍ Indentasi Negatif


Nilai negatif dapat digunakan untuk indentasi luar. Dalam beberapa kasus, teknik ini sangat berguna. Lihatlah gambar berikut.


Hasil pengaturan properti padding dari elemen

induk Elemen induk memiliki propertipadding: 1rem. Ini menyebabkan anak memiliki offset dari atas, kiri, dan kanan. Tetapi anak harus berdekatan dengan perbatasan orang tua. Margin luar negatif akan membantu untuk mencapai ini.

.parent {
    padding: 1rem
}

.child {
    margin-left: -1rem;
    margin-right: -1rem;
    margin-top: -1rem;
}

Itulah yang terjadi sebagai akibat dari gaya seperti itu.


Margin luar negatif anak membantu mencapai efek yang diinginkan

Berikut ini demonstrasi.

Jika Anda tertarik dengan topik margin luar negatif, saya sarankanartikel ini .

▍ Properti Padding - bantalan dalam


Seperti yang telah disebutkan, properti paddingmemungkinkan Anda untuk mengontrol ruang di dalam elemen. Tujuan penerapan properti ini tergantung pada situasi di mana ia digunakan.

Misalnya, ini dapat digunakan untuk menambah ruang di sekitar tautan. Ini mengarah pada peningkatan ruang tautan yang dapat diklik .


Diindentasi dengan warna hijau

▍ Situasi di mana properti padding tidak berfungsi


Penting untuk dicatat bahwa lekukan vertikal tidak berfungsi dengan elemen yang memiliki properti display: inline. Sebagai contoh, ini adalah elemen <span>dan <a>. Jika Anda mengonfigurasi properti paddingelemen seperti itu, pengaturan seperti pada elemen ini tidak akan berfungsi. Ini hanya pengingat ramah bahwa elemen sebaris perlu mengubah properti display:

.element span {
    display: inline-block;
    padding-top: 1rem;
    padding-bottom: 1rem;
}

Spasi Antara Elemen Layout Kotak CSS


Di Grid CSS, Anda dapat dengan mudah menyesuaikan jarak antara kolom dan baris menggunakan properti grid-gap. Ini adalah singkatan untuk properti yang menentukan jarak antara kolom dan baris.


Jarak antara kolom dan baris

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-gap: 16px; /*    16px     */
}

Catatan lengkap dari properti ini terlihat seperti ini:

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-row-gap: 24px;
    grid-column-gap: 16px;
}

Ruang Antara Elemen CSS pada Tata Letak Flexbox


Ada satu properti yang disarankan untuk tata letak kotak dan flexbox. Ini properti gap. Saat ini, hanya Firefox yang mendukungnya .

.element {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
}

Selain itu, properti ini tidak dapat digunakan dengan CSS @supportsuntuk menentukan apakah didukung, dan untuk membuat keputusan yang tepat berdasarkan ini. Jika Anda menyukai properti ini - pilih untuk menambahkannya ke Chrome.

Elemen Posisi dalam CSS


Mungkin penentuan posisi elemen tidak dapat secara langsung dikaitkan dengan cara untuk menyesuaikan jarak di antara mereka, tetapi dalam beberapa kasus, penentuan posisi memainkan peran. Misalnya, jika ada elemen anak yang benar-benar diposisikan yang perlu ditempatkan di 16pxtepi kiri dan atas elemen induk.

Perhatikan contoh berikut. Ada kartu di mana ada ikon yang perlu ditempatkan agak jauh dari tepi atas dan kiri elemen induk. Untuk mencapai efek ini, Anda dapat menggunakan gaya berikut:

.category {
    position: absolute;
    left: 16px;
    top: 16px;
}



Jarak antara batas-batas elemen induk dan anak disorot dalam warna hijau.

Gunakan Skenario dan Studi Kasus


Pada bagian ini, kita akan melihat skenario untuk menggunakan cara untuk mengatur jarak antar elemen. Sesuatu yang serupa mungkin muncul dalam pekerjaan harian Anda dengan CSS.

▍ Komponen tajuk



Komponen adalah header yang memiliki pengaturan berikut: margin kiri dan kanan, ruang di sekitar logo, ruang di sekitar elemen navigasi, jarak antara elemen navigasi dan nama pengguna.

Dalam hal ini, komponen header memiliki logo, area navigasi, dan area di mana informasi ditampilkan tentang profil pengguna. Bisakah Anda menebak seperti apa kode stylization dari elemen seperti itu? Di sini, untuk membuatnya lebih mudah, markup skematis dari elemen seperti itu:

<header class="c-header">
  <h1 class="c-logo"><a href="#">Logo</a></h1>
  <div class="c-header__nav">
    <nav class="c-nav">
      <ul>
        <li><a href="#">...</a></li>
      </ul>
    </nav>
    <a href="#" class="c-user">
      <span>Ahmad</span>
      <img class="c-avatar" src="shadeed.jpg" alt="">
    </a>
  </div>
</header>



Margin dalam dan luar Margin

kiri dan kanan digunakan. Tujuannya adalah untuk memastikan bahwa isi tajuk tidak melekat pada tepinya.

.c-header {
    padding-left: 16px;
    padding-right: 16px;
}

Saat mengatur tautan navigasi, seseorang harus memperhitungkan fakta bahwa masing-masing dari mereka harus memiliki ruang internal yang cukup baik secara vertikal maupun horizontal. Karena ini, area yang dapat diklik mereka akan cukup besar, yang akan meningkatkan aksesibilitas proyek.

.c-nav a {
    display: block;
    padding: 16px 8px;
}

Jika kita berbicara tentang jarak antara unsur-unsur, maka Anda dapat menggunakan properti margin, atau - Anda dapat mengubah properti dari displayelemen <li>untuk inline-block. Karena itu, ruang kecil ditambahkan antara elemen-elemen yang terletak pada tingkat yang sama, karena fakta bahwa elemen-elemen tersebut dianggap sebagai simbol.

.c-nav li {
    /*     ,     */
    display: inline-block;
}

Akhirnya, nama pengguna dan avatar memiliki indentasi luar kiri.

.c-user img,
.c-user span {
    margin-left: 10px;
}

Harap dicatat bahwa jika Anda membuat situs web multibahasa, disarankan untuk menggunakan properti CSS logis dalam situasi ini :

.c-user img,
.c-user span {
    margin-inline-start: 1rem;
}



Jarak sebelum dan sesudah pemisah tidak sama.

Perhatikan bahwa jarak sebelum dan sesudah pemisah tidak sama. Alasannya adalah lebar blok navigasi tidak disetel. Sebaliknya, hanya indentasi internal yang dikonfigurasi di sini. Akibatnya, lebar elemen navigasi tergantung pada kontennya. Berikut adalah solusi untuk masalah ini:

  • Mengatur lebar minimum untuk item navigasi.
  • Tingkatkan lekukan horisontal.
  • Menambahkan indentasi tambahan di sisi kiri pemisah.

Cara terbaik dan termudah adalah dengan menggunakan metode ketiga, yaitu mengkonfigurasi properti margin-left:

.c-user {
    margin-left: 8px;
}

Ini demo

▍ Jarak dalam tata letak kotak - CSS Flexbox


Layout grid adalah tempat di mana teknologi untuk mengatur jarak antar elemen sering digunakan. Perhatikan contoh berikut.


Layout Grid

Kita perlu mengatur jarak antara baris dan kolom tabel. Ini markupnya:

<div class="wrapper">
    <div class="grid grid--4">
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <!--   .. -->
    </div>
</div>

Saya biasanya lebih suka menyimpan komponen dalam keadaan enkapsulasi dan menghindari pengaturan indentasi luarnya. Untuk alasan ini, saya memiliki elemen grid_itemdi mana elemen kartu akan ditemukan.

.grid--4 {
    display: flex;
    flex-wrap: wrap;
}

.grid__item {
    flex-basis: 25%;
    margin-bottom: 16px;
}

Berkat kode CSS ini, akan ada empat kartu di setiap baris. Berikut adalah salah satu cara yang mungkin untuk mengatur jarak di antara mereka:

.grid__item {
    flex-basis: calc(25% - 10px);
    margin-left: 10px;
    margin-bottom: 16px;
}

Dengan menggunakan fungsi CSS, calc()indentasi dikurangi flex-basis. Seperti yang Anda lihat, ini bukan solusi yang sederhana. Saya sebenarnya lebih suka yang berikut ini:

  • Setel properti item kisi padding-left.
  • Atur elemen induk untuk memiliki margin luar negatif margin-leftdengan nilai yang sama dengan y padding-left.

Saya belajar tentang metode ini bertahun-tahun yang lalu, setelah membaca di sini beberapa artikel, yang namanya sudah dilupakan (jika Anda tahu artikel seperti apa - tolong beri tahu saya).

.grid--4 {
    display: flex;
    flex-wrap: wrap;
    margin-left: -10px;
}

.grid__item {
    flex-basis: 25%;
    padding-left: 10px;
    margin-bottom: 16px;
}

Alasan saya menggunakan nilai negatif untuk di sini margin-leftadalah karena kartu pertama memiliki properti padding-leftyang, pada kenyataannya, tidak diperlukan. Akibatnya, saya memindahkan elemen pembungkus ke kiri dan menyingkirkan ruang yang tidak perlu.

→  Ini adalah contoh yang berfungsi.

Gagasan lain yang serupa adalah menggunakan indentasi dan indentasi negatif. Ini adalah contoh dari situs Facebook.


Margin dalam dan luar

Berikut adalah kode CSS yang menggambarkan ide ini:

.wrapper {
    margin-left: -4px;
    margin-right: -4px;
}

.story {
    padding-left: 4px;
    padding-right: 4px;
}

Istance Jarak dalam tata letak kotak - Kotak CSS


Dan sekarang - bagian terbaik! Dalam tata letak berbasis CSS Grid, jarak antar elemen sangat mudah untuk disesuaikan menggunakan properti grid-gap. Selain itu, Anda tidak perlu khawatir tentang lebar elemen dan batas eksternal yang lebih rendah. Layout grid CSS menangani semua ini.

.grid--4 {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-gap: 1rem;
}

Itu saja. Saya percaya tidak ada yang akan berpendapat bahwa mengatur tata letak Grid lebih mudah dan lebih mudah dipahami daripada mengatur tata letak Flexbox.

▍Mengatur jarak antar elemen hanya jika perlu


Dalam tata letak Grid, saya sangat menyukai kenyataan bahwa properti grid-gaphanya diterapkan ketika harus ada jarak antara elemen. Lihatlah tata letak berikut.


Tata letak grid di mana elemen-elemen di lingkungan ponsel diatur secara vertikal, dan di desktop - secara horizontal.Ada

bagian situs dengan dua kartu. Saya membutuhkan mereka untuk dipisahkan baik dalam lingkungan mobile, dengan susunan kartu vertikal, dan pada desktop, dengan susunan horizontal mereka. Tanpa CSS Grid, fleksibilitas tata letak seperti itu tidak mungkin tercapai. Lihatlah kode berikut:

.card:not(:last-child) {
    margin-bottom: 16px;
}

@media (min-width: 700px) {
    .card:not(:last-child) {
        margin-bottom: 0;
        margin-left: 1rem;
    }
}

Sangat tidak nyaman. Kebenaran? Bagaimana dengan gaya selanjutnya?

.card-wrapper {
    display: grid;
    grid-template-columns: 1fr;
    grid-gap: 1rem;
}

@media (min-width: 700px) {
    .card-wrapper {
        grid-template-columns: 1fr 1fr;
    }
}

Sudah selesai! Dan semuanya jauh lebih sederhana.

▍Bekerja dengan indentasi luar bawah


Misalkan kita memiliki komponen-komponen berikut yang terletak satu di atas yang lain. Masing-masing dari mereka memiliki indentasi luar yang lebih rendah.


Seperangkat komponen yang disusun secara horizontal

Perhatikan bahwa ada margin luar bawah untuk elemen terakhir. Dan ini salah, karena indentasi seharusnya hanya ada di antara elemen.

Anda dapat memperbaiki masalah ini dengan menggunakan salah satu solusi yang sekarang akan kami analisis.

Solusi # 1: pemilih CSS: tidak


.element:not(:last-child) {
    margin-bottom: 16px;
}

Solusi No. 2: kombinasi elemen tetangga dari tingkat yang sama


.element + .element {
    margin-top: 16px;
}

Analisis keputusan


Meskipun solusi # 1 tampaknya lebih menarik, ia memiliki kelemahan berikut:

  • Ini mengarah ke masalah spesifik CSS. Itu tidak dapat didefinisikan ulang sampai pemilih digunakan :not.
  • Itu tidak berlaku ketika ada lebih dari satu kolom item. Ini diilustrasikan di bawah ini.


Dua kolom elemen dan masalah solusi No. 1

Jika kita berbicara tentang solusi No. 2, maka penerapannya tidak mengarah pada masalah dengan spesifisitas. Benar, solusi ini juga hanya cocok dalam kasus-kasus ketika datang ke satu kolom elemen.

Dalam situasi ini, yang terbaik adalah mengambil keputusan untuk menghapus ruang yang tidak perlu dengan menambahkan lekukan eksternal negatif ke elemen induk:

.wrapper {
    margin-bottom: -16px;
}

Di sini hal berikut terjadi. Berkat pengaturan ini, elemen digeser ke bawah dengan jarak yang sama dengan lekukan eksternal yang ditentukan. Tapi di sini Anda harus berhati-hati untuk tidak mengatur indentasi eksternal saat menggunakan elemen yang tumpang tindih.

▍ Kartu Komponen


Sekarang saya ingin membahas secara rinci pengaturan kartu komponen. Mungkin pada akhirnya saya akan mendapatkan seluruh buku tentang itu. Di sini saya akan mempertimbangkan pola universal untuk mengonfigurasi kartu dan berbicara tentang cara mengelolanya.


Kartu komponen (jika Anda ingin makan - maaf)

Pikirkan di mana tepatnya dalam kartu ini jarak antara elemen dan bagian-bagiannya digunakan. Inilah jawaban saya untuk pertanyaan ini.


Margin dalam dan luar

Inilah markupnya:

<article class="card">
    <a href="#">
      <div class="card__thumb"><img src="food.jpg" alt=""></div>
      <div class="card__content">
        <h3 class="card__title">Cinnamon Rolls</font></h3>
        <p class="card__author">Chef Ahmad</p>
        <div class="card__rating"><span>4.9</span></div>
        <div class="card__meta"><!-- --></div>
      </div>
    </a>
</article>

Inilah gaya kelasnya card__content:

.card__content {
    padding: 10px;
}

Berkat indentasi yang ditetapkan di sini, offset untuk semua anak akan ditetapkan. Kemudian atur margin luar:

.card__title,
.card__author,
.card__rating {
  margin-bottom: 10px;
}

Saat mengatur pemisahan peringkat dan informasi, saya menggunakan perbatasan:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
}

Tapi di sini kita dihadapkan dengan masalah! Perbatasan tidak terikat ke tepi, yang disebabkan oleh card__contentlekukan elemen induk dengan kelas .


Pemisah tidak terikat ke tepi.

Anda, mungkin, sudah menebak bahwa indentasi negatif akan membantu kami di sini:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}

Tapi di sini lagi, ada yang tidak beres. Sekarang teks telah tersangkut di tepi kartu.


Pemisahnya normal, tetapi isi kartu tidak terletak dengan benar.

Untuk mengatasi masalah ini, Anda perlu mengonfigurasi indentasi kiri dan kanan untuk isi kartu.

.card__meta {
    padding: 10px 10px 0 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}



Kartu dikonfigurasikan sebagaimana mestinya

Ini adalah contohnya

▍ Konten artikel


Saya yakin apa yang akan kita bicarakan di sini adalah situasi yang sangat, sangat umum. Intinya di sini adalah bahwa konten artikel biasanya pergi ke halaman dari CMS (Content Management System - sistem manajemen konten), atau dihasilkan secara otomatis berdasarkan file penurunan harga. Anda tidak dapat menentukan kelas elemen di sini.

Perhatikan contoh berikut, yang menunjukkan markup yang berisi campuran judul, paragraf, dan gambar.

<div class="wrapper">
  <h1>Spacing Elements in CSS</h1>
  <p><!-- content --></p>
  <h2><font color="#3AC1EF">Types of Spacing</font></h2>
  <img src="spacing-1.png" alt="">
  <p><!-- content --></p> 
  <p><!-- content --></p> 
  <h2><font color="#3AC1EF">Use Cases</font></h2>
  <p><!-- content --></p> 
  <h3><font color="#3AC1EF">▍Card Component</font></h3> 
  <img src="use-case-card-2.png" alt="">
</div>

Agar penampilannya layak, jarak antar elemen harus seragam dan harus digunakan secara bertanggung jawab. Saat mengerjakan contoh ini, saya meminjam beberapa gaya dari type-scale.com .

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

h1 {
  margin-top: 0;
}

img {
  margin-bottom: 0.5rem;
}

Berikut adalah diagram halaman dengan teks artikel.


Tata letak halaman dan penerapan properti margin-top dan margin-bottom

Jika suatu elemen<p>diikuti oleh tajuk, misalnya, tajukTypes of Spacing, maka propertimargin-bottomelemen<p>tersebut akan diabaikan. Ini, seperti yang bisa Anda tebak, adalah konsekuensi dari runtuhnya margin luar.

Ini sebuah contoh

▍ Lekukan eksternal, sebagaimana berlaku


Lihatlah tata letak berikut.


Elemen dalam kondisi normal dan dalam situasi kehabisan ruang

Elemen tidak terlihat sangat baik ketika mereka terlalu dekat satu sama lain. Saya membuat tata letak ini menggunakan Flexbox. Teknik ini disebut "Alignment Shifting Wrapping". Saya tahu tentang namanya dari sini .

.element {
    display: flex;
    flex-wrap: wrap;
}

Sebagai hasil dari penerapan teknik ini, pembungkus garis dilakukan jika area tampilan kurang dari batas tertentu. Ini tampilannya.


Elemen anak berada pada baris baru.

Di sini Anda perlu berurusan dengan situasi menengah di mana dua elemen masih bersebelahan, tetapi jarak di antara mereka adalah nol. Dalam hal ini, saya lebih memilih untuk menggunakan propertimargin-right, yang mencegah elemen-elemen saling bersentuhan dan mempercepat responsflex-wrap.


Elemen tidak saling bersentuhan

Mode penulisan properti ▍CSS


Pertama kami mengutip MDN : "Properti writing-modemenetapkan posisi horizontal atau vertikal teks, serta arah blok."

Pernahkah Anda berpikir tentang bagaimana lekukan eksternal harus berperilaku ketika mereka digunakan dengan elemen yang propertinya writing-modeberbeda dari standar? Perhatikan contoh berikut.


Kartu dengan header vertikal.

Berikut adalah gaya-gayanya:

.wrapper {
    /*              */
    display: flex;
}

.title {
    writing-mode: vertical-lr;
    margin-right: 16px;
}

Header diputar 90 derajat. Harus ada ruang kosong di antara itu dan gambar. Ternyata, properti margin-rightitu menunjukkan dirinya dengan sempurna dengan nilai properti yang berbeda writing-mode.

Ini contohnya.

Saya yakin kita sudah membahas cukup skenario indentasi. Sekarang pertimbangkan beberapa konsep menarik.

Enkapsulasi komponen


Sistem desain besar mengandung banyak komponen. Apakah logis untuk menyesuaikan margin luarnya?

Perhatikan contoh berikut.


Tombol

<button class="button">Save Changes</button>
<button class="button button-outline">Discard</button>

Di mana saya perlu menyesuaikan jarak antara tombol? Apakah saya perlu mengkonfigurasi beberapa properti tombol kiri atau kanan? Mungkin Anda bisa menggunakan kombinasi elemen tetangga dengan level yang sama?

.button + .button {
    margin-left: 1rem;
}

Tidak ada yang baik tentang itu. Bagaimana jika hanya ada satu tombol? Dan bagaimana cara kerjanya pada perangkat seluler, dalam kasus ketika tombol berada secara vertikal, dan tidak horizontal? Secara umum, di sini kita dihadapkan dengan banyak pertanyaan sulit.

▍Menggunakan komponen yang diabstraksi


Solusi untuk masalah di atas adalah penggunaan komponen yang diabstraksi, yang digunakan untuk menempatkan komponen lain di dalamnya. Ini, seperti yang dikatakan di sini , adalah sedikit pergeseran dalam tanggung jawab untuk mengelola padding ke elemen induk. Kami memikirkan kembali contoh sebelumnya berdasarkan ide ini.


Komponen induk dan anak

<div class="list">
    <div class="list__item">
        <button class="button">Save Changes</button>
    </div>
    <div class="list__item">
        <button class="button button-outline">Discard</button>
    </div>
</div>

Harap dicatat bahwa ada elemen pembungkus. Setiap tombol memiliki pembungkusnya sendiri.

.list {
    display: flex;
    align-items: center;
    margin-left: -1rem; /*       */
}

.list__item {
    margin-left: 1rem;
}

Itu saja! Dan terlebih lagi, konsep ini mudah diterapkan pada kerangka JavaScript apa pun. Contohnya:

<List>
  <Button>Save Changes</Button>
  <Button outline>Discard</Button>
</List>

Dan alat JS yang digunakan harus meletakkan setiap elemen dalam pembungkusnya sendiri.

Komponen Digunakan sebagai Pemisah


Jika Anda ragu membaca judulnya dengan benar - jangan ragu. Kita berbicara tentang komponen yang digunakan sebagai pemisah. Secara khusus, di sini saya merujuk pada artikel ini , yang membahas konsep yang menghindari penggunaan indentasi dan menggunakan komponen pemisah sebagai gantinya.

Bayangkan bahwa di bagian tertentu dari situs Anda memerlukan indentasi luar kiri ukuran 24px. Dalam hal ini, persyaratan berikut diajukan untuk indentasi:

  • Lekukan eksternal tidak boleh dikonfigurasikan secara langsung pada komponen, karena merupakan bagian dari sistem desain yang sudah dibuat.
  • Lekukan harus fleksibel. Pada satu halaman dapat memiliki ukuran X, dan di sisi lain - ukuran Y.

Saya pertama kali memperhatikan trik ini saat menjelajahi desain Facebook baru .


Elemen Pemisah Desain Facebook

Di sini digunakan sebagai elemen pemisah<div>dengan gaya inlinewidth: 16px. Tujuan utamanya adalah untuk menambah ruang kosong antara elemen kiri dan elemen kontainer.

Berikut ini kutipan darimanual pelatihan Bereaksi ini : “Tetapi di dunia nyata, kita membutuhkan ruang yang ditentukan di luar komponen untuk mengatur komponen menjadi halaman dan adegan. Di sinilah pengaturan indentasi luar masuk ke dalam kode komponen untuk menyesuaikan jarak antara komponen ketika mereka dirakit. ”

Saya setuju dengan itu. Dalam sistem desain besar, menambahkan lekukan ke komponen akan tidak rasional. Ini akan menghasilkan kode yang tidak terlalu bagus.

▍ Masalah komponen pemisah


Sekarang setelah Anda membiasakan diri dengan gagasan komponen pemisah, mari kita bicara tentang beberapa masalah yang diperkirakan terjadi ketika bekerja dengannya. Inilah beberapa pertanyaan yang saya pikirkan:

  • Bagaimana komponen pemisah mengambil ruang dalam komponen induk? Bagaimana dia berperilaku dalam tata letak horizontal dan vertikal? Sebagai contoh, bagaimana komponen seperti itu memisahkan komponen secara vertikal dan horizontal?
  • Apakah saya perlu menata komponen ini berdasarkan properti displaydari komponen induk (Flexbox, Grid)?

Mari kita periksa pertanyaan-pertanyaan ini.

▍ Ukuran komponen pemisah


Anda dapat membuat komponen pemisah yang menerima berbagai parameter. Saya bukan pengembang JavaScript, tetapi saya rasa inilah yang disebut "alat peraga". Perhatikan contoh berikut, diambil dari sini .

Ada komponen pemisah yang terletak di antara Headerdan Section.

<Header />
<Spacer mb={4} />
<Section />

Dan ini adalah situasi yang sedikit berbeda. Di sini, pemisah digunakan untuk membuat jarak yang dapat diatur secara otomatis antara logo (komponen Logo) dan area navigasi yang diwakili oleh komponen Link.

<Flex>
  <Logo />
  <Spacer m="auto" />
  <Link>Beep</Link>
  <Link>Boop</Link>
</Flex>

Tampaknya menerapkan pemisah seperti itu menggunakan CSS sangat sederhana, dan itu cukup untuk menggunakan desain justify-content: space-between. Tetapi bagaimana jika Anda perlu mengubah desain? Dalam hal ini, Anda harus mengubah stylization.

Lihatlah contoh berikut. Apakah kode ini terlihat fleksibel?

<Flex>
  <Logo />
  <Link>Beep</Link>
  <Link>Boop</Link>
  <Spacer m="auto" />
  <Link>Boop</Link>
</Flex>

Dalam hal ini, stilisasi perlu diubah.

Dalam hal ukuran, kita dapat mengatakan bahwa ukuran pemisah dapat disesuaikan berdasarkan ukuran elemen induk. Dalam kasus di atas, mungkin masuk akal untuk membuat properti growyang diatur ke nilai dalam CSS flex-grow: 1.

<Flex>
  <Spacer grow="1" />
</Flex>

▍Gunakan elemen pseudo


Gagasan lain yang muncul di benak saya adalah menggunakan elemen semu untuk membuat pemisah.

.element:after {
    content: "";
    display: block;
    height: 32px;
}

Mungkin kita memiliki kesempatan untuk membuat elemen pseudo sebagai pemisah, dan tidak menggunakan elemen terpisah untuk ini? Contohnya:

<Header spacer="below" type="pseudo" length="32">
  <Logo />
  <Link>Home</Link>
  <Link>About</Link>
  <Link>Contact</Link>
</Header>

Sejauh ini, saya belum menggunakan komponen pemisah di proyek saya. Tapi saya mencari skenario di mana mereka bisa berguna bagi saya.

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


Bisakah lekukan menjadi dinamis? Misalnya, apakah mungkin untuk menggunakan lekukan seperti itu, ukuran minimum dan maksimum yang tergantung pada lebar area tampilan? Saya dapat menjawab pertanyaan ini secara positif. Fungsi CSS, menurut data CanIUse , didukung oleh semua browser terkemuka.

Ingat tata letak Grid dan bicarakan bagaimana indentasi dinamis dapat digunakan di dalamnya.

.wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: min(2vmax, 32px);
}

Konstruksi min(2vmax, 32px)artinya sebagai berikut: gunakan jarak yang sama 2vmaxdengan tetapi tidak melebihi 32px.

→  Ini adalah demonstrasi video dari tata letak semacam itu

→  Ini adalah contohnya.

Fleksibilitas semacam itu sungguh menakjubkan. Ini memberi kami banyak peluang untuk membuat tata letak halaman web yang dinamis dan fleksibel.

Ringkasan


Pada artikel ini, kami memeriksa fitur menyesuaikan jarak antara elemen halaman web menggunakan CSS dan berbicara tentang mengelola ruang internal elemen. Kami harap Anda merasa berguna apa yang Anda pelajari hari ini.

Pembaca yang budiman! Alat apa yang paling sering Anda gunakan untuk menyesuaikan jarak antara elemen halaman web?


All Articles