Bir görüntüyü (img) bir div içine nasıl sığdırabilir ve en boy oranını nasıl koruyabilirim?


136

Ben 48x48 div var ve içinde bir img öğesi var, ben herhangi bir bölümü kaybetmeden div içine sığdırmak istiyorum, bu arada oranı tutulur, html ve css kullanarak ulaşılabilir mi?

Yanıtlar:


70

Css yazarken resmin boyutunu bilmiyorsanız kırpmayı önlemek için JavaScript kullanmanız gerekir.

HTML ve 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%;
}

Bir JavaScript Kitaplığı kullanıyorsanız kitaplığından yararlanmak isteyebilirsiniz.


2
Michael'ın cevabı çok daha basit ve Javascript kullanmıyor. Tarayıcı uyumluluğu hakkında bir fikrim yok.
weberc2

3
Hayır, Michael'ın yanıtı, görüntü div'den daha büyük olduğu sürece işe yarar. Resmin, resim boyutuyla ilgili div değerini doldurmasını istiyorsanız (ve resim boyutunu önceden bilmiyorsanız, bunu yaparsınız), bu yol.
Rémy DAVID

2
Maksimum yükseklik kullanamazdınız:% 100; maksimum genişlik: 100%; dakika-genişliği: 100%; min-yükseklik:% 100 ve aynı sonucu elde? Dürüst bir soru.
Daniel Casserly

Hayır, bunu yaparak genişliği ve yüksekliği% 100 olmaya zorlarsınız, böylece görüntü en boy oranını değiştirirsiniz.
gztomas

görüntü tarayıcıda önbelleğe alındığında onload çağrılmaz, bu nedenle yalnızca görüntü ilk kez yüklendiğinde çalışır.
Redtopia

314

max-height:100%; max-width:100%;Div içindeki görüntü için kullanın .


4
@ZoveGames JS olmayan tarayıcılar? 2010 Yahoo istatistikleri ortalama% 1.3 göstermektedir. Bence a. muhtemelen bugün daha düşük ve b. programmers.stackexchange.com/questions/26179/…
EasyCo

5
Benim için çalışmıyor ... Görüntüyü kendi boyutunun% 100'ü yapar (örneğin: 300 piksel genişliğinde bir görüntü için 300 piksel genişliğinde).
Tomáš Zato - Monica'yı yeniden başlat

1
Bunun neden olduğu Windows üzerinde Chrome'a ​​özgü bazı hatalar var. Potansiyel olarak bazı smoothscroll eklentileriyle kötü etkileşimlerim var. Fare içinde overflow:scrollbüyük bir görüntü bulunan bir divın üzerinde olsa bile, vücudu kaydırmaya çalışır. Meraklı. Daha da garip: Max'in çözümü aslında onu düzeltir. Gerçekten CSS'den bıktım. Eskiden güçlü ve havalıydı. Şimdi uygulamalar sadece buggy tutarsızlığından sonra buggy tutarsızlığı üretmektedir.
Steven Lu

21
yalnızca görüntüyü ölçeklendirirken çalışır. küçük bir resmi daha büyük bir kaba sığdırmak istiyorsanız, bu işe yaramaz
Yossi Shasho

2
Görüntünün orijinal en boy oranını korumaz.
7sααc t ի ε βöss

78

Ne yazık ki maksimum genişlik + maksimum yükseklik görevimi tam olarak kapsamıyor ... Bu yüzden başka bir çözüm buldum:

Ölçekleme sırasında Görüntü oranını kaydetmek içinobject-fit CSS3 özelliklerini de kullanabilirsiniz .

Yararlı makale: Görüntü en boy oranlarını CSS3 ile kontrol etme

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

Kötü haber: IE desteklenmiyor ( Kullanabilir miyim )


6
Bu cevap olarak işaretlenmelidir .. "nesne-uyum" mükemmel çalıştı.
7sααc t ի ε βöss

İşin garibi, bunun için destek 8.0 değil iOS 8.1'de tanıtıldı.
ray

2
object-fit: cover; benim için çalıştı. Burada: stackoverflow.com/questions/9071830/…
Deke

1
Görüntünün ortalanmak yerine sol üstte olmasını istiyorsanız, 0 0 nesne konumunu da kullanmanız gerekir.
Chris Rae

Bu, görüntü en boy oranını korurken ekranı dolduran duyarlı bir görüntü arka planı oluşturmak için benim için çalışan tek cevaptı.
Ray Li

39

Yalnızca CSS kullanma:

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

ölçek
büyütmez

17

HTML

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

CSS

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

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

Bu, görüntünün boyutunu divCSS'de ayarlanmış olan üst öğesini dolduracak şekilde genişleyecektir .


2
Ekleme height: 100%, bu görüntü oranını çarpıtır - OP oranı korumak istiyor.
casablanca

OP'nin ne anlama geldiğinden emin değilim ama orada oranı doğru tutmayacak mısınız?
Trufa

oranı korumak için ne yapabilirim? Yüksekliği silersem:% 100 görüntü kırpılır.
Bin Chen

7

Bunu çalıştırmak için çok fazla sorunum vardı, bulduğum her çözüm işe yaramadı.

Div ekranını esneyecek şekilde ayarlamam gerektiğini fark ettim, bu yüzden temelde bu benim CSS'm:

div{
display: flex;
}

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

Resimlerim bu çözümle Chrome Sürüm 61
Yevgeniy Afanasyev

Belki div'inizde bir maksimum yükseklik / yükseklik veya genişlik ayarlanmış olabilir ve bu da görüntünüzün bozulmasına neden olur.
Bartho Bernsmann

Tam olarak benim açımdan .. <div class = "w"> üzerinde genişlik ve yüksekliği ayarladığınız için
görüntü bozuluyor

Örneğiniz için ... Resminizde benzer bir şey aradığınıza inanıyorum CSS: height: auto; genişlik:% 100;
Bartho Bernsmann

görev, görüntüyü bir div'a sığdırmaktı, div'ın boyutlara ve görüntünün yalnızca en boy oranına sahip olduğu anlamına gelir. Yüksekliği bir değere ayarlamam gerekiyor, aksi takdirde soru koşulları yanı sıra resmim de bozulacak. Lütfen JS kemanına bir göz atın ve çalışması için gerekli olduğunu düşündüğünüzü değiştirin. Teşekkürler.
Yevgeniy Afanasyev

6

CSS'yi deneyin:

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

3

Benim için aşağıdaki CSS çalıştı (Chrome, Firefox ve Safari'de test edildi).

Birlikte çalışan birden çok şey var:

  • max-height: 100%;, max-width: 100%;Ve height: auto;, width: auto;en boy oranı tutarak birinci% 100'de boyut hangisi img ölçek yapmak
  • position: relative;kapta ve position: absolute;çocukta img'in sol üst köşesini kapta top: 50%;ve left: 50%;ortada
  • transform: translate(-50%, -50%); img'yi boyutunun yarısı kadar sola ve yukarıya doğru hareket ettirir, böylece img'i kapta ortalar

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

Fotoğrafı arka plan resmi olarak ayarlamak, bize boyut ve yerleşim üzerinde daha fazla kontrol sağlayacak ve img etiketini farklı bir amaca hizmet edecek şekilde bırakacak ...

Aşağıda, div öğesinin fotoğrafla aynı en boy oranına sahip olmasını istiyorsak, placeholder.png, photo.jpg ile aynı en boy oranına sahip küçük şeffaf bir görüntüdür. Fotoğraf kare ise 1 piksel x 1 piksel yer tutucu, fotoğraf video küçük resmi ise 16x9 yer tutucu vb.

Soruya özgü olarak, divın kare oranını korumak için 1x1 yer tutucu kullanın background-sizeve fotoğrafın en boy oranını korumak için arka plan resmi kullanın .

Kullandığım background-position: center center;fotoğraf div ortasına yerleştirilir böylece. (Fotoğrafı dikey merkezde veya altta hizalamak, img etiketindeki fotoğrafla çirkinleşir.)

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>

Fazladan bir http isteğinden kaçınmak için yer tutucu resmi bir veri: URL'ye dönüştürün .

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

0

daha yeni bir sürüm için "img-fluid" sınıfını kullanabilirsiniz, yani Bootstrap v4 .

ve Bootstrap v3 gibi eski sürümler için "img-Responsive" sınıfını kullanabilir .

Kullanım : -

img etiketi: -

class = "img-akışkan"

src = "..."


0

İşte bütün bir JavaScript yaklaşımı. Görüntüyü doğru şekilde oturana kadar aşamalı olarak ölçeklendirir. Her başarısız olduğunda ne kadar küçüleceğini seçersiniz. Bu örnek, her başarısız olduğunda% 10 küçültür:

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);
});

Doğrudan kopyalayıp yapıştırmaktan çekinmeyin.


0

Benim için işe yarayan şuydu:

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

görüntülerin div dışına çıkmasını önlemek için inline-flex gerekiyordu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.