1. Web Design
  2. HTML/CSS
  3. HTML Templates

Memecahkan masalah dengan CSS Grid dan Flexbox: kartu UI

Scroll to top

() translation by (you can also view the original English article)

Pola "kartu" telah melihat sukses besar dalam waktu belakangan ini, tetapi cara kami membuatnya masih terbatas karena CSS tersedia bagi kami. Sampai sekarang, itu adalah. Dengan menggabungkan CSS Grid dan Flexbox, kita dapat membuat kartu yang menyelaraskan rapi, responsif berperilaku, dan yang beradaptasi dengan konten di dalamnya. Mari kita lihat bagaimana!

Apa yang kita akan membangun

Kita akan membangun ini kartu UI (Lihat versi halaman penuh untuk ide yang lebih jelas):

Pada berbagai breakpoints pengaturan kartu akan berubah sebagai berikut:

Breakpoints of CSS Grid layout
1: kecil, 2: media, 3: viewport besar

CSS Grid vs Flexbox

Ketika Flexbox memukul CSS adegan teriakan sukacita bisa didengar di seluruh dunia; akhirnya kami memiliki tata letak modul untuk memecahkan semua frustrasi float kami. Tapi itu tidak benar-benar terjadi. Flexbox terbaik untuk mendistribusikan unsur-unsur sepanjang sumbu tunggal; horizontal sepanjang berturut-turut atau vertikal sebagai kolom. Membangun sebuah grid yang benar-benar cairan dengan Flexbox sulit.

Grid, namun, ditujukan untuk meletakkan elemen di seluruh dua sumbu (atau dimensi); secara horizontal dan vertikal. Dalam tutorial ini kita akan menggunakan masing-masing untuk tujuan itu dimaksudkan, memberikan kita solusi yang benar-benar padat. Mari kita mulai!

Inspirasi

Bbc.co.uk meluncurkan (dalam versi beta) iteration terbaru mereka, akan bersih dan luas dengan kartu mereka UI. 5

Kartu teratas dibangun dan selaras di baris dengan Flexbox, tetapi kita akan memperluas tata letak yang menggunakan Grid.

Catatan: untuk mengikuti bersama Anda akan memerlukan browser yang mendukung Grid. Berikut ini beberapa info untuk Anda mulai.

Kami Markup kartu

Mari kita mulai dengan pembungkus untuk grid kami <div class="band">, beberapa item grid untuk mengatur segala sesuatu <div class="item">, dan beberapa jangkar (anchor setiap akan kartu):

1
  <div class="band">
2
  
3
    <!-- grid item, containing a card -->
4
    <div class="item-1">
5
          <a href="" class="card">
6
            <div class="thumb"></div>
7
            <article>
8
              <h1>Post title</h1>
9
              <span>Author</span>
10
            </article>
11
          </a>
12
    </div>
13
    
14
    <!-- grid item, containing a card -->
15
    <div class="item-2">
16
    ...
17
    </div>
18
    
19
    <!-- grid item, containing a card -->
20
    <div class="item-3">
21
    ...
22
    </div>
23
    
24
  </div>

Tempat kartu sebanyak yang Anda inginkan; Kami menggunakan tujuh. Masing-masing memiliki thumbnail <div class="thumb">yang kami akan berikan gambar latar belakang kemudian. Kemudian ada <article>, yang pada gilirannya rumah <h1>, <span> penulis, dan bahkan mungkin <p> untuk informasi lebih lanjut.

Dasar-dasar grid

Sekarang mari kita memulai beberapa gaya dengan menyusun setiap item dalam kotak.

Catatan: jika ini adalah perampokan pertama Anda ke "Grid" Anda mungkin ingin mendapatkan sampai dengan kecepatan dengan membaca tutorial awal dalam pemahaman CSS Grid Layout.

Kami akan menggunakan seluler terlebih dahulu di sini, jadi gaya pertama akan memberikan pembungkus lebar dan memusatkannya, lalu mengatur beberapa aturan Grid:

1
.band {
2
  width: 90%;
3
  max-width: 1240px;
4
  margin: 0 auto;
5
  
6
  display: grid;
7
  
8
  grid-template-columns: 1fr;
9
  grid-template-rows: auto;
10
  grid-gap: 20px;
11
}

Paling penting, di sini kami Anda menyatakan bahwa .band kami akan display: grid;. Kami kemudian menyatakan grid-template-columns 1fr, yang mengatakan bahwa setiap kolom akan mengambil sebagian kecil tunggal yang tersedia. Kami hanya telah menyatakan satu untuk sekarang, sehingga setiap kolom akan mengisi seluruh lebar.

Kemudian kita menyatakan grid-template-baris: auto;. Ini sebenarnya adalah nilai default, jadi kita bisa menghilangkannya, dan berarti ketinggian baris akan ditentukan murni oleh konten.

Akhirnya kita mendefinisikan grid-gap 20px, yang memberi kami kami Talang kolom dan baris.

Media Query Numero Uno

Di viewports yang lebih luas (500px benar-benar sewenang-wenang), kami akan mengubah grid-template-columns untuk memberi kita mungkin dua kartu per baris. Sekarang ada dua kolom, masing-masing menjadi salah satu dari dua fraksi tersedia.

1
@media only screen and (min-width: 500px) {
2
  .band {
3
    grid-template-columns: 1fr 1fr;
4
  }  
5
}

Media Query Numero Dos

Terakhir, untuk layar yang lebih besar kita akan pergi dengan empat kolom layout.

1
@media only screen and (min-width: 850px) {
2
  .band {
3
    grid-template-columns: 1fr 1fr 1fr 1fr;
4
  }
5
}

Di sini kita bisa sama-sama ditulis repeat(4, 1fr) bukan 1fr 1fr 1fr 1fr. Untuk informasi lebih lanjut tentang bagaimana fr unit bekerja, cek keluar CSS Grid Layout: kolom fluida dan selokan yang lebih baik.

Jadi apa yang diberikan kepada kita?

Styling Kartu

Yang telah memberi kita tata letak kotak cukup padat, dan jika Anda seorang penggemar dari brutalism Anda mungkin ingin menjaga hal-hal seperti ini, tetapi untuk orang lain, mari kita membuat kartu kami terlihat sedikit lebih seperti kartu.

Kita akan mulai dengan ini:

1
.card {
2
  background: white;
3
  text-decoration: none;
4
  color: #444;
5
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
6
  display: flex;
7
  flex-direction: column;
8
  min-height: 100%;
9
}

Ini memberikan kita beberapa gaya dasar: latar belakang putih, menggarisbawahi tidak ada teks, warna abu-abu dan box-shadow rapi untuk memberikan kita beberapa kedalaman.

Selanjutnya kita mendeklarasikan kartu menjadi display: flex;. Hal ini penting-kita akan dapat menyelaraskan isi kartu vertikal, menggunakan Flexbox. Oleh karena itu kita juga menyatakan flex-direction: column; untuk memberikan kami sumbu vertikal. Akhirnya kita mendeklarasikan min-height: 100%; dalam rangka bahwa semua kartu mengisi ketinggian orangtua (item kami grid). Pekerjaan yang baik! Yang memberi kita ini:

Hover State

Mari kita membuat beberapa perbaikan sebelum menyelam lebih lanjut ke dalam Flexbox. Tambahkan position: relative; dan transition sehingga kita dapat memindahkan kartu di hover:

1
  position: relative;
2
  top: 0;
3
  transition: all .1s ease-in;

Kemudian di hover, mengangkat kartu sedikit dan membuat bayangan lebih jelas:

1
.card:hover {
2
  top: -2px;
3
  box-shadow: 0 4px 5px rgba(0,0,0,0.2);
4
}

Tipografi

Sekarang kami akan menambahkan beberapa gaya umum untuk tipografi untuk mengubah warna dan spasi.

1
.card article {
2
  padding: 20px;
3
}
4
5
/* typography */
6
.card h1 {
7
  font-size: 20px;
8
  margin: 0;
9
  color: #333;
10
}
11
12
.card p { 
13
  line-height: 1.4;
14
}
15
16
.card span {
17
  font-size: 12px;
18
  font-weight: bold;
19
  color: #999;
20
  text-transform: uppercase;
21
  letter-spacing: .05em;
22
  margin: 2em 0 0 0;
23
}

Berikut adalah apa yang Anda harus:

Thumbnail

Setiap gambar kecil akan diterapkan sebagai gambar latar belakang, jadi kami akan menambahkan beberapa markup di seluruh papan, seperti ini:

1
<div class="thumb" style="background-image: url(thumb.jpg);"></div>

Sekarang kami akan membuat yakin pada divs .thumb memiliki beberapa dimensi, dan bahwa latar belakang gambar yang mengisi mereka dengan benar:

1
.card .thumb {
2
  padding-bottom: 60%;
3
  background-size: cover;
4
  background-position: center center;
5
}

Pekerjaan yang baik, yang memberi kita ini:

Flexbox artikel

Sekarang kami ingin nama penulis berjajaran di bagian bawah kartu, terlepas dari berapa banyak konten yang ada di atasnya. Ini adalah tempat Flexbox lagi datang:

1
.card article {
2
  padding: 20px;
3
  flex: 1;
4
  
5
  display: flex;
6
  flex-direction: column;
7
  justify-content: space-between;
8
}

Kami menggunakan singkatan flex: 1; untuk menyatakan bahwa item flex ini (it's masih anak wadah flex asli) harus tumbuh untuk mengambil semua ruang yang tersedia.

Kemudian, kami menyatakan bahwa artikel adalah wadah flex tersendiri, dan sekali lagi kita sedang menyatakan flex-direction: column; untuk memberikan penyebaran vertikal. Terakhir, justify-content: space-between; menyatakan bahwa semua benda yang lentur di dalamnya harus tersebar merata di sepanjang sumbu, dengan jarak yang sama antara.

Itu semua hebat, tetapi itu memberi kita paragraf yang aneh dan mengembara ini di tengah-tengah kartu kami.

Untuk menyelaraskan ini dengan benar, mari tambahkan flex-grow: 1; (atau cukup flex: 1;) kepada mereka, sehingga mereka mengisi semua ruang vertikal yang tersisa, menyelaraskan diri dengan baik ke atas.

1
.card p { 
2
  flex: 1; /* make p grow to fill available space*/
3
  line-height: 1.4;
4
}

Lebih baik!

Mengubah Grid

Pada titik ini kita cukup banyak terbungkus, tetapi satu hal yang memungkinkan Grid untuk kita lakukan sekarang adalah mengubah tata letak sepenuhnya dengan menempatkan item grid kita di mana pun kita suka, dan berapa pun ukuran yang kita suka. Untuk demo ini, kami ingin membuat kartu pertama (sebut saja "kartu unggulan" kami) dua kolom lebar untuk apa pun selain area pandang terkecil.

Di kueri media pertama kami, mari lakukan ini:

1
@media only screen and (min-width: 500px) {
2
3
    ...
4
    
5
  .item-1 {
6
    grid-column: 1/ span 2;
7
  }
8
  
9
}

Mengacu kembali ke tutorial pengantar kami tentang grid areas, di sini kami mengatakan bahwa, di luar 500px, item pertama harus dimulai pada garis grid 1 dan membentang di dua lintasan. Sisanya item grid jatuh ke tempatnya secara otomatis.

Dalam kueri media yang sama ini saya juga mengetuk font-size dari tajuk di kartu unggulan kami.

Kesimpulan

Ini telah menjadi latihan yang baik dalam menggunakan Grid dengan Flexbox; Grid ditangani dua dimensi tata letak kami utama, maka Flexbox ditangani distribusi vertikal unsur-unsur dalam kartu kami. Bersenang-senang bermain-main dengan itu!

Bacaan lebih lanjut

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.