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?

Bin Chen
sumber

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.

Thomas
sumber
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.

Michael
sumber
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 )

Andrii Verbytskyi
sumber
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%;
}
Max
sumber
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.

alex
sumber
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%;
}
Bartho Bernsmann
sumber
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;
}
Faisal
sumber
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%);
}
VSchlattinger
sumber
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,..."/>
Pengembang web
sumber
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 = "..."

Saurabh Sheorain
sumber
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.

Pantai Jared
sumber
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.

Nomad77
sumber