Bagaimana cara memasukkan gambar (img) di dalam div dan mempertahankan rasio aspek?


140

Saya memiliki div 48x48 dan di dalamnya ada elemen img, saya ingin memasukkannya ke dalam div tanpa kehilangan bagian apa pun, sementara rasio disimpan, apakah dapat dicapai dengan menggunakan html dan css?

Jawaban:


73

Anda memerlukan beberapa JavaScript untuk mencegah pemotongan jika Anda tidak mengetahui dimensi gambar pada saat Anda menulis css.

HTML & JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

Jika Anda menggunakan Perpustakaan JavaScript, Anda mungkin ingin memanfaatkannya.


2
Jawaban Michael jauh lebih sederhana dan tidak menggunakan Javascript. Saya tidak tahu tentang kompatibilitas browser.
weberc2

3
Tidak, jawaban Michael berfungsi selama gambar lebih besar dari div. Jika Anda ingin gambar mengisi div mengenai ukuran gambar (dan, jika Anda tidak mengetahui ukuran gambar sebelumnya, Anda tahu), inilah cara yang harus dilakukan.
Rémy DAVID

2
Bisakah Anda tidak menggunakan max-height: 100%; lebar maks: 100%; min-width: 100%; min-height: 100% dan dapatkan hasil yang sama? Pertanyaan yang jujur.
Daniel Casserly

Tidak, dengan melakukan itu Anda memaksa lebar dan tinggi menjadi 100%, jadi Anda mengubah rasio aspek gambar.
gztomas

onload tidak akan dipanggil saat gambar di-cache di browser, jadi ini hanya akan berfungsi saat gambar dimuat untuk pertama kalinya.
Redtopia

317

Gunakan max-height:100%; max-width:100%;untuk gambar di dalam div.


4
@ZoveGames Non-JS diaktifkan peramban? Statistik Yahoo dari tahun 2010 menunjukkan rata-rata 1,3%. Saya pikir aman untuk mengasumsikan bahwa a. mungkin lebih rendah hari ini dan b. programmers.stackexchange.com/questions/26179/…
EasyCo

5
Ini tidak bekerja untuk saya ... Itu membuat gambar 100% dari ukurannya sendiri (mis .: lebar 300px untuk gambar yang sebenarnya lebarnya 300px).
Tomáš Zato - Kembalikan Monica

1
Ada beberapa bug khusus Chrome-on-Windows yang menyebabkan hal ini. Kemungkinan interaksi buruk dengan plugin smoothscroll tertentu yang saya miliki. Itu akhirnya mencoba untuk menggulir tubuh meskipun mouse berada di atas overflow:scrolldiv dengan gambar besar di dalamnya. Ingin tahu. Yang lebih aneh: solusi Max benar-benar memperbaikinya. Saya cukup muak dengan CSS, sungguh. Dulu kuat dan keren. Sekarang implementasi hanya menghasilkan inkonsistensi buggy setelah inkonsistensi buggy.
Steven Lu

21
hanya berfungsi saat memperkecil gambar. jika Anda ingin memasukkan gambar kecil ke dalam wadah yang lebih besar, ini tidak akan berhasil
Yossi Shasho

2
Rasio aspek asli gambar tidak dipertahankan.
Ĭsααc t ի ε βöss

80

Sayangnya max-width + max-height tidak sepenuhnya menutupi tugas saya ... Jadi saya telah menemukan solusi lain:

Untuk menyimpan rasio Gambar saat penskalaan, Anda juga dapat menggunakan properti object-fitCSS3.

Artikel yang berguna: Mengontrol rasio aspek gambar dengan CSS3

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

Berita buruk: IE tidak didukung ( Can I Use )


6
Ini harus ditandai sebagai jawaban .. "object-fit" bekerja dengan sempurna.
Ĭsααc t ի ε βöss

Anehnya, sepertinya dukungan untuk ini diperkenalkan di iOS 8.1, bukan 8.0.
ray

2
object-fit: cover; bekerja untuk saya. Di sini: stackoverflow.com/questions/9071830/…
Deke

1
Jika Anda ingin gambar berada di kiri atas daripada di tengah, Anda juga perlu menggunakan posisi objek 0 0.
Chris Rae

Ini adalah satu-satunya jawaban yang berhasil bagi saya untuk membuat latar belakang gambar responsif yang memenuhi layar dengan tetap mempertahankan rasio aspek gambar.
Ray Li

39

Hanya menggunakan CSS:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}

tidak meningkat
JFFIGK

17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

Ini akan membuat gambar mengembang untuk mengisi induknya, yang ukurannya diatur di divCSS.


2
Jangan tambahkan height: 100%, itu akan merusak rasio gambar - OP ingin mempertahankan rasio tersebut.
casablanca

Saya tidak yakin apa yang dimaksud OP tetapi di sana Anda tidak akan menjaga rasionya kan?
Trufa

apa yang dapat saya lakukan untuk menjaga rasio tersebut? Jika saya menghapus tinggi: 100% gambar akan dipotong.
Bin Chen

7

Saya mengalami banyak masalah agar ini berfungsi, setiap solusi yang saya temukan tampaknya tidak berhasil.

Saya menyadari bahwa saya harus mengatur tampilan div menjadi fleksibel, jadi pada dasarnya ini adalah CSS saya:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}

Gambar saya terdistorsi dengan solusi ini di Chrome Versi 61
Yevgeniy Afanasyev

Mungkin div Anda memiliki set max-height / height atau width, dan itu menyebabkan distorsi gambar Anda.
Bartho Bernsmann

Persis maksud saya .. Gambar terdistorsi karena Anda menyetel lebar dan tinggi pada <div class = "w">
Bartho Bernsmann

Sebagai contoh .. Saya yakin Anda sedang mencari sesuatu seperti pada gambar Anda CSS: height: auto; lebar: 100%;
Bartho Bernsmann

tugasnya adalah memasukkan gambar ke dalam div, ini menyiratkan bahwa div memiliki dimensi dan gambar hanya memiliki rasio aspek. Saya perlu mengatur ketinggian ke beberapa nilai, jika tidak, kondisi pertanyaan akan terdistorsi serta gambar saya. Silakan lihat biola JS dan ubah apa yang menurut Anda diperlukan untuk membuatnya berfungsi. Terima kasih.
Yevgeniy Afanasyev

7

Coba CSS:

img {
  object-fit: cover;
  height: 48px;
}

3

Bagi saya, CSS berikut berfungsi (diuji di Chrome, Firefox, dan Safari).

Ada beberapa hal yang bekerja bersama:

  • max-height: 100%;, max-width: 100%;dan height: auto;, width: auto;buat skala img ke dimensi mana pun yang pertama kali mencapai 100% dengan tetap mempertahankan rasio aspek
  • position: relative;di wadah dan position: absolute;di anak bersama-sama dengan top: 50%;dan left: 50%;tengah sudut kiri atas img di wadah
  • transform: translate(-50%, -50%); memindahkan img kembali ke kiri dan atas setengah ukurannya, sehingga memusatkan img di dalam container

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

Menyetel foto sebagai gambar latar belakang akan memberi kita kontrol lebih besar atas ukuran dan penempatan, membiarkan tag img memiliki tujuan yang berbeda ...

Di bawah, jika kita ingin div memiliki rasio aspek yang sama dengan foto, maka placeholder.png adalah gambar transparan kecil dengan rasio aspek yang sama seperti foto.jpg. Jika foto berbentuk persegi, itu adalah placeholder 1px x 1px, jika foto adalah gambar mini video, itu adalah placeholder 16x9, dll.

Khusus untuk pertanyaan, gunakan placeholder 1x1 untuk mempertahankan rasio persegi div, dengan gambar latar belakang yang digunakan background-sizeuntuk mempertahankan rasio aspek foto.

Saya dulu background-position: center center;jadi foto akan dipusatkan di div. (Menyejajarkan foto di tengah vertikal atau bawah akan menjadi jelek dengan foto di tag img.)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

Untuk menghindari permintaan http tambahan, ubah gambar placeholder menjadi data: URL .

<img src="data:image/png;base64,..."/>

0

Anda dapat menggunakan kelas "img-fluid" untuk versi yang lebih baru yaitu Bootstrap v4 .

dan dapat menggunakan kelas "img-responsive" untuk versi lama seperti Bootstrap v3 .

Penggunaan : -

img tag dengan: -

class = "img-fluid"

src = "..."


0

Berikut semua pendekatan JavaScript. Ini menskalakan gambar secara bertahap hingga pas dengan benar. Anda memilih berapa banyak untuk menyusutkannya setiap kali gagal. Contoh ini menyusut 10% setiap kali gagal:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

Jangan ragu untuk menyalin dan menempel secara langsung.


0

Apa yang berhasil bagi saya adalah:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

inline-flex diperlukan agar gambar tidak keluar dari div.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.