Menyelam Jauh Ke dalam kesesuaian objek dan ukuran latar belakang di CSS

Diterbitkan: 2022-03-10
Ringkasan cepat Dalam artikel ini, kita akan membahas cara kerja ukuran object-fit dan background-size , kapan kita dapat menggunakannya, dan alasannya, bersama dengan beberapa kasus penggunaan praktis dan rekomendasi. Mari selami.

Kami tidak selalu dapat memuat gambar dengan ukuran berbeda untuk elemen HTML. Jika kita menggunakan lebar dan tinggi yang tidak proporsional dengan rasio aspek gambar, gambar mungkin dikompresi atau diregangkan. Itu tidak baik, dan itu dapat diselesaikan baik dengan object-fit untuk elemen img atau dengan menggunakan background-size .

Pertama, mari kita definisikan masalahnya. Perhatikan gambar berikut:

Foto yang terlihat bagus dan gambar yang diperas sebagai perbandingan
Foto tampan yang terjepit saat digunakan dalam komponen kartu. (Pratinjau besar)

Mengapa ini terjadi?

Gambar akan memiliki rasio aspek, dan browser akan mengisi kotak yang berisi gambar tersebut. Jika rasio aspek gambar berbeda dari lebar dan tinggi yang ditentukan untuknya, maka hasilnya akan berupa gambar yang diperas atau diregangkan.

Kita lihat ini pada gambar berikut:

Foto yang terlihat bagus dan gambar yang dibentangkan sebagai perbandingan
Rasio aspek gambar berbeda dari kotak yang berisi, dan gambar akan melebar. (Pratinjau besar)

Solusinya

Kami tidak selalu perlu menambahkan gambar dengan ukuran berbeda ketika rasio aspek gambar tidak sejajar dengan lebar dan tinggi elemen yang memuatnya. Sebelum masuk ke solusi CSS, saya ingin menunjukkan kepada Anda bagaimana kami biasa melakukan ini di aplikasi pengeditan foto:

Contoh gambar dengan tepi atas dan bawah terpotong dalam topeng
Pertama, kita akan memusatkan gambar secara vertikal, lalu klip di topeng. Ini mempertahankan rasio aspek gambar dan mencegahnya terjepit. (Pratinjau besar)

Sekarang setelah kita memahami cara kerjanya, mari masuk ke cara kerjanya di browser. ( Peringatan spoiler: Lebih mudah! )

Kesesuaian object-fit CSS

Properti object-fit mendefinisikan bagaimana konten dari elemen yang diganti seperti img atau video harus diubah ukurannya agar sesuai dengan wadahnya. Nilai default untuk object-fit adalah fill , yang dapat mengakibatkan gambar terjepit atau diregangkan.

Mari kita membahas nilai-nilai yang mungkin.

Lebih banyak setelah melompat! Lanjutkan membaca di bawah ini

Kemungkinan Nilai untuk object-fit

object-fit: contain

Dalam hal ini, gambar akan diubah ukurannya agar sesuai dengan rasio aspek wadahnya. Jika rasio aspek gambar tidak cocok dengan wadah, itu akan menjadi kotak surat.

kesesuaian objek: mengandung
Saat menggunakan object-fit: contain , gambar akan diberi kotak surat atau diubah ukurannya. (Pratinjau besar)

object-fit: cover

Di sini, gambar juga akan diubah ukurannya agar sesuai dengan rasio aspek wadahnya, dan jika rasio aspek gambar tidak cocok dengan wadahnya, maka akan dipotong agar sesuai.

kesesuaian objek: penutup
Saat menggunakan object-fit: cover , gambar akan dipotong agar pas atau diubah ukurannya. (Pratinjau besar)

object-fit: fill

Dengan ini, gambar akan diubah ukurannya agar sesuai dengan rasio aspek wadahnya, dan jika rasio aspek gambar tidak cocok dengan wadahnya, gambar akan diperas atau diregangkan. Kami tidak menginginkan itu.

kesesuaian objek: isi
Saat menggunakan object-fit: fill , gambar akan diperas, diregangkan, atau diubah ukurannya. (Pratinjau besar)

object-fit: none

Dalam hal ini, gambar tidak akan diubah ukurannya sama sekali, tidak diregangkan atau diperas. Ini berfungsi seperti nilai cover , tetapi tidak menghormati rasio aspek wadahnya.

kesesuaian objek: tidak ada
Saat menggunakan object-fit: none , gambar tidak akan diubah ukurannya jika dimensinya tidak sama. (Pratinjau besar)

Selain object-fit , kami juga memiliki properti object-position , yang bertanggung jawab untuk memposisikan gambar di dalam wadahnya.

Kemungkinan Nilai Untuk object-position

Properti object-position bekerja mirip dengan properti background-position CSS:

pusat posisi objek, kiri, kanan
Sebagian besar waktu, nilai default digunakan (yaitu `center` atau `50% 50%`). (Pratinjau besar)

Kata kunci top dan bottom juga berfungsi ketika rasio aspek kotak yang berisi lebih besar secara vertikal:

posisi objek atas dan bawah
Membandingkan object-position: top (kiri) dan object-position: bottom (kanan). (Pratinjau besar)

background-size CSS

Dengan background-size , perbedaan pertama adalah bahwa kita berurusan dengan latar belakang, bukan elemen HTML ( img ).

Kemungkinan Nilai untuk background-size

Nilai yang mungkin untuk background-size adalah auto , contain , dan cover .

background-size: auto

Dengan auto , gambar akan tetap pada ukuran defaultnya:

ukuran latar belakang: otomatis
Ingatlah bahwa ukuran default terkadang dapat menghasilkan gambar buram (jika terlalu kecil). (Pratinjau besar)

background-size: cover

Di sini, gambar akan diubah ukurannya agar sesuai dengan wadah. Jika rasio aspek tidak sama, maka gambar akan disamarkan agar pas.

ukuran latar belakang: sampul
Saat menggunakan background-size: cover , pastikan untuk mempertimbangkan rasio aspek gambar. (Pratinjau besar)

background-size: contain

Dalam hal ini, gambar akan diubah ukurannya agar sesuai dengan wadah. Jika rasio aspek tidak aktif, maka gambar akan menjadi kotak surat seperti yang ditunjukkan pada contoh berikut:

ukuran latar belakang: mengandung
background-size: contain mengubah ukuran gambar agar sesuai dengan wadah. (Pratinjau besar)

Adapun background-position , ini mirip dengan cara kerja object-position . Satu-satunya perbedaan adalah bahwa posisi default object-position berbeda dari background-position .

Kapan Tidak Menggunakan object-fit atau background-size

Jika elemen atau gambar diberi ketinggian tetap dan memiliki background-size: cover atau object-fit: cover diterapkan padanya, akan ada titik di mana gambar akan terlalu lebar, sehingga kehilangan detail penting yang mungkin memengaruhi cara pengguna melihat gambar.

Perhatikan contoh berikut di mana gambar diberi ketinggian tetap:

 .card__thumb { height: 220px; }
Contoh gambar terlalu lebar karena memiliki tinggi tetap, dan wadah kartu terlalu lebar
Gambar di sebelah kanan terlalu lebar karena memiliki ketinggian yang tetap sedangkan wadah kartu terlalu lebar. (Pratinjau besar)

Jika wadah kartu terlalu lebar, maka akan menghasilkan apa yang kita lihat di sebelah kanan (gambar yang terlalu lebar). Itu karena kami tidak menentukan rasio aspek.

Hanya ada satu dari dua perbaikan untuk ini. Yang pertama adalah menggunakan padding hack untuk membuat rasio intrinsik.

 .card__thumb { position: relative; padding-bottom: 75%; height: 0; } .card__thumb img { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

Perbaikan kedua adalah menggunakan properti CSS aspect-ratio baru. Dengan menggunakannya, kita dapat melakukan hal berikut:

 .card__thumb img { aspect-ratio: 4 / 3; }

Catatan : Saya sudah menulis tentang properti aspect-ratio secara rinci jika Anda ingin mempelajarinya: "Mari Belajar Tentang Rasio Aspek Dalam CSS".

Gunakan Kasus Dan Contoh

Avatar Pengguna

Kasus penggunaan yang sempurna untuk object-fit: cover adalah avatar pengguna. Rasio aspek yang diizinkan untuk avatar sering kali berbentuk persegi. Menempatkan gambar dalam wadah persegi dapat mendistorsi gambar.

Avatar pengguna tanpa kesesuaian objek dan dengan kesesuaian objek: penutup
Perbandingan avatar pengguna tanpa object-fit dan dengan object-fit: cover . (Pratinjau besar)
 .c-avatar { object-fit: cover; }

Daftar Logo

Daftar klien bisnis itu penting. Kami akan sering menggunakan logo untuk tujuan ini. Karena logo akan memiliki ukuran yang berbeda, kami membutuhkan cara untuk mengubah ukurannya tanpa mendistorsinya.

Untungnya, object-fit: contain adalah solusi yang baik untuk itu.

 .logo__img { width: 150px; height: 80px; object-fit: contain; }
Daftar logo: Airbnb, Domino's Pizza, Apple Pay, Amazon
Menggunakan object-fit: contain dapat membantu kami mengubah ukuran logo klien tanpa mendistorsinya. (Pratinjau besar)

Gambar Mini artikel

Ini adalah kasus penggunaan yang sangat umum. Penampung untuk gambar mini artikel mungkin tidak selalu memiliki gambar dengan rasio tinggi lebar yang sama. Masalah ini harus diperbaiki oleh sistem manajemen konten (CMS) sejak awal, tetapi tidak selalu.

 .article__thumb { object-fit: cover; }
Thumbnail artikel
Menyesuaikan thumbnail artikel dengan sedikit bantuan dari object-fit: cover . (Pratinjau besar)

Latar Belakang Pahlawan

Dalam kasus penggunaan ini, keputusan apakah akan menggunakan elemen img atau latar belakang CSS akan bergantung pada hal berikut:

  • Apakah gambar itu penting? Jika CSS dinonaktifkan karena alasan tertentu, apakah kita ingin pengguna melihat gambarnya?
  • Atau apakah tujuan gambar itu hanya dekoratif?

Berdasarkan jawaban kami, kami dapat memutuskan fitur mana yang akan digunakan. Jika gambar itu penting :

Gunakan kasus dengan latar belakang pahlawan
Anggaplah gambar itu penting, karena ini adalah situs web yang berhubungan dengan makanan. (Pratinjau besar)
 <section class="hero"> <img class="hero__thumb" src="thumb.jpg" alt="" /> </section>
 .hero { position: relative; } .hero__thumb { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

Jika gambarnya dekoratif , kita bisa menggunakan background-image :

 .hero { position: relative; background-image: linear-gradient(to top, #a34242, rgba(0,0,0,0), url("thumb.jpg"); background-repeat: no-repeat; background-size: cover; }

CSS lebih pendek dalam hal ini. Pastikan bahwa teks apa pun yang ditempatkan di atas gambar dapat dibaca dan diakses.

Menambahkan Latar Belakang ke Gambar Dengan object-fit: contain

Tahukah Anda bahwa Anda dapat menambahkan warna latar belakang ke img ? Kami akan mendapat manfaat dari itu ketika juga menggunakan object-fit: contain .

Dalam contoh di bawah ini, kami memiliki kisi-kisi gambar. Jika rasio aspek gambar dan wadah berbeda, warna latar belakang akan muncul.

 img { object-fit: contain; background-color: #def4fd; }
Menambahkan warna latar belakang ke gambar dengan objek-fit: berisi
Kita dapat menggunakan object-fit: contain untuk menambahkan warna latar belakang ke gambar. (Pratinjau besar)

Elemen Video

Pernahkah Anda membutuhkan video sebagai latar belakang? Jika demikian, maka Anda mungkin ingin mengambil lebar dan tinggi penuh dari induknya.

 .hero { position: relative; background-color: #def4fd; } .hero__video { position: aboslute; left: 0; top: 0; width: 100%; height: 100%; }
Sosok di mana videonya tidak menutupi latar belakang pahlawan
Nilai object-fit default untuk elemen video adalah contain . Seperti yang Anda lihat di sini, video tidak menutupi latar belakang pahlawan, meskipun memiliki position: absolute , width: 100% , dan height: 100% . (Pratinjau besar)

Untuk membuatnya sepenuhnya menutupi lebar dan tinggi induknya, kita perlu mengganti nilai default object-fit :

 .hero__video { /* other styles */ object-fit: cover; }
Gambar di mana video menutupi lebar dan tinggi penuh dari induknya.
Sekarang video mencakup lebar dan tinggi penuh dari induknya. (Pratinjau besar)

Kesimpulan

Seperti yang telah kita lihat, ukuran object-fit dan background-size sangat berguna untuk menangani rasio aspek gambar yang berbeda. Kami tidak akan selalu memiliki kendali atas pengaturan dimensi yang sempurna untuk setiap gambar, dan di situlah kedua fitur CSS ini bersinar.

Pengingat ramah tentang implikasi aksesibilitas dari memilih antara elemen img dan latar belakang CSS: Jika gambarnya murni dekoratif, pilih latar belakang CSS. Jika tidak, img lebih cocok.

Saya harap Anda menemukan artikel ini bermanfaat. Terima kasih telah membaca.