Wednesday, September 3, 2014

Membuat Agar Tinggi Kontainer Mengikuti Tinggi Latar Gambarnya yang Responsif/Adaptif

Problem in Fluid Container with Fluid Background Image

Saya agak kesulitan untuk menemukan istilah yang tepat untuk menyatakan “latar gambar yang ukurannya bisa menyesuaikan diri dengan kontainer setiap kali ukuran kontainer berubah”, jadi Saya sebut saja sebagai ‘responsif’ atau ‘adaptif’, meskipun istilah tersebut sebenarnya kurang tepat. Istilah fluid lebih tepat.

Ketika kita ingin membuat sebuah gambar menjadi fluid, kita bisa mengeset lebar gambar tersebut ke dalam satuan persen dan tinggi gambar sebagai auto untuk menjaga agar ukuran tingginya tetap proporsional:

img {
  width:100%;
  height:auto;
}

Lihat Demo

Bagaimana dengan latar gambar? Kita bisa menggunakan properti background-size dengan nilai cover atau 100% auto. Hanya saja, di sini masalahnya adalah kita tidak bisa membuat tinggi kontainer mengikuti tinggi latar gambar setiap kali lebar kontainer berubah:

div {
  background:transparent url('path/to/image.jpg') no-repeat 50% 0;
  background-size:100% auto;
  height:615px;
}

Lihat Demo

Rasio Ukuran Tinggi Proporsional

Ada sebuah metode yang bisa digunakan untuk membuat tinggi kontainer gambar bisa mengikuti tinggi latar gambar yang ada di dalamnya (di belakangnya), yaitu dengan cara mengeset ukuran tinggi kontainer menjadi 0 dan menentukan nilai sebuah sisi padding vertikal dalam satuan persen untuk menciptakan ukuran tinggi kontainer palsu. Nilainya berupa hasil perbandingan antara tinggi gambar dengan lebar gambar dalam bentuk persen. Perhitungannya seperti ini:

Rasio = (Tinggi / Lebar * 100) + '%';

Atau jika diterjemahkan ke dalam bahasa yang sederhana adalah: “Tinggi proporsional X adalah sama dengan sekian persen dari lebarnya.”

Saya menggunakan gambar dengan ukuran lebar 800 piksel dan tinggi 615 piksel pada halaman demo, jadi:

Rasio Tinggi = (615 / 800 * 100) + '%';
Rasio Tinggi = 76.875%;
div {
  background:transparent url('path/to/image.jpg') no-repeat 50% 0;
  background-size:100% auto;
  height:0; /* Set tinggi kontainer menjadi `0` */
  padding-bottom:76.875%; /* Gunakan `padding` untuk menciptakan dimensi tinggi */
}

Lihat Demo

Catatan: Jika Anda telah menerapkan CSS Universal Box-Sizing, Saya sarankan Anda untuk menambahkan properti box-sizing dengan nilai content-box pada kontainer untuk mengembalikan logika box-model ke keadaan semula. Meskipun ketika Saya coba tanpa menambahkan properti itu sebenarnya tidak ada masalah. Ini cuma untuk memantapkan saja:

div {
  background:transparent url('path/to/image.jpg') no-repeat 50% 0;
  background-size:100% auto;
  height:0;
  padding-bottom:76.875%;
  box-sizing:content-box;
}

Menambahkan Konten ke dalam Kontainer

Anda memerlukan sebuah elemen tambahan untuk diposisikan sebagai elemen absolute karena kontainer yang sekarang sudah tidak memiliki ruang lagi (tinggi kontainer sekarang adalah 0 piksel):

HTML

<div class="container">
  <div class="container-content">Konten di sini…</div>
</div>

CSS

.container {
  background:transparent url('path/to/image.jpg') no-repeat 50% 0;
  background-size:100% auto;
  height:0;
  padding-bottom:76.875%;
  box-sizing:content-box;
  position:relative;
}

.container-content {
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  left:0;
  overflow:auto;
}

Lihat Demo

Labels: , ,

16 Comments:

At Wednesday, September 3, 2014 at 1:16:00 PM GMT+7, Blogger Taufik said...

berarti bisa dong di terapkan pada bagian komentar, oke dah terima kasih mas..... mo di praktek in...

 
At Friday, September 5, 2014 at 8:50:00 AM GMT+7, Blogger Rdk said...

ok mas, terima kasih tutorialnya ...

 
At Monday, September 8, 2014 at 10:58:00 PM GMT+7, Blogger you said...

Ini juga bisa diterapkan buat img didalam posting blog kan mas. Saya terapkan dan berhasil.

 
At Wednesday, September 10, 2014 at 8:23:00 PM GMT+7, Blogger Arlina said...

kalau saya biasa pakai ini

#sample img {background-size:cover;background-position:center center;background-attachment:fixed;}

 
At Sunday, September 21, 2014 at 7:03:00 PM GMT+7, Blogger David said...

Menurut saya yang responsiv adaptiv itu ga boleh content-box musti tetap border-box; Bagaimana jika element itu diset padding 9999px. Mungkin bakal horizontal scroll, kan udah nge-lawan judulnya yang bilang responsif adaptif

 
At Monday, September 22, 2014 at 4:13:00 PM GMT+7, Blogger Taufik Nurrohman said...

Satuan piksel tidak memakai rasio, satuan piksel tidak adaptif, satuan piksel tidak fluid. Mungkin yang kamu maksud itu ada di kasus yang lain seperti: kolom responsif sama tinggi.

 
At Monday, October 27, 2014 at 8:56:00 PM GMT+7, Blogger Mr.Randy said...

ulasan yang bagus bang, saya suka ketmu masalah begini btw klau misalnya lebarnya bukan 800 dan tingginya bukn 615 apa harus diganti lagi paddingnya? maksudnya apa harus dibuat media handle nya?

 
At Saturday, November 1, 2014 at 3:23:00 PM GMT+7, Blogger binkbenk said...

pusing bang lihat kodenya...
maklum lagi belajar....

 
At Friday, November 7, 2014 at 6:29:00 AM GMT+7, Blogger Arlina said...

ini solusi untuk image lightbox yang saya gunakan, makasih sudah berbagi

 
At Monday, November 10, 2014 at 2:13:00 PM GMT+7, Anonymous Anonymous said...

wah ternyata begitu toh caranya, makasih Mas Taufik tutorialnya, sangat membantu \o/

 
At Tuesday, November 25, 2014 at 6:33:00 PM GMT+7, Blogger Unknown said...

wah, kayaknya bagus juga untuk diterapkan.
terimakasih mas udah mau ngeshare tutor bermanfaat seperti ini.
salam kenal juga ya mas!! :D

 
At Thursday, December 18, 2014 at 9:39:00 PM GMT+7, Blogger obatherbalalami said...

thanks buat tuts2nya :p

 
At Sunday, December 21, 2014 at 6:25:00 PM GMT+7, Blogger Unknown said...

MenarikMas Tutorialnya sangat bermanfaat

 
At Monday, December 14, 2015 at 10:43:00 AM GMT+7, Blogger Unknown said...

masih belum tertalu memamhami secara mendetail mas..

 
At Wednesday, January 13, 2016 at 8:42:00 AM GMT+7, Blogger Unknown said...

makasih buat artikelnya sungguh bermanfaat saya masih belajarr

 
At Wednesday, September 7, 2016 at 11:02:00 PM GMT+7, Blogger Unknown said...

makaih mas, izin belajar di blog ini. :)

 

Post a Comment

<< Home