CSS görüntüyü yeniden boyutlandırmaya zorla ve en boy oranını koru


577

Görüntülerle çalışıyorum ve en boy oranlarıyla ilgili bir sorunla karşılaştım.

<img src="big_image.jpg" width="900" height="600" alt="" />

Gördüğünüz olarak heightve widthzaten belirtilmiştir. Resimler için CSS kuralı ekledim:

img {
  max-width:500px;
}

Ama big_image.jpgalıyorum width=500ve height=600. En boy oranlarını korurken görüntüleri yeniden boyutlandırılacak şekilde nasıl ayarlayabilirim.

Yanıtlar:


774

img {
  display: block;
  max-width:230px;
  max-height:95px;
  width: auto;
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<img width="400" height="400" src="http://i.stack.imgur.com/aEEkn.png">

Bu, belirtilen alan için çok büyükse görüntünün küçülmesini sağlar (olumsuz olarak görüntüyü büyütmez).


11
Bunun, kaplarına sığacak şekilde görüntüleri büyütecek bir sürümü var mı? Otomatik olarak genişlik / yüksekliğe sahip sayılar olarak maksimum genişlik / maksimum yüksekliği denedim, ancak yukarıda belirtildiği gibi, görüntüyü büyütmeyecek. Ayrıca min-width / min-height kullanmayı denedim. Kombinasyonu doğru anlayamıyorum. Bu konteynere koymak istediğim görüntü ne olursa olsun, bunu elde etmek için görüntüyü daraltmayı veya büyütmeyi içeriyor olsun, en boy oranını değiştirmeden mümkün olan maksimum boyutta görüntülenmesini istiyorum.
Dee2000

7
Görünüşe göre: blok artık gerekli.
actimel

3
Soru hakkında bir <img>genişlik ve yükseklik içeren olduğunu düşünüyorum ve !importantbu etiket genişliği / yükseklik bilgilerini atlatmak için kullanmanız gerektiğini düşünüyorum .
Alexis Wilke

18
@AlexisWilke CSS kuralları html özniteliklerini geçersiz kılar. !importantGerek yok.
Jargs

5
Chrome'da kullanmak, benim için bile çalışmıyor! Önemli
Ray

266

Bu sorunla oldukça zorlandım ve sonunda bu basit çözüme ulaştım:

object-fit: cover;
width: 100%;
height: 250px;

Genişliği ve yüksekliği ihtiyaçlarınıza uyacak şekilde ayarlayabilirsiniz; nesne sığdırma özelliği kırpma işlemini sizin için yapar.

Şerefe.


44
object-fitharika, harika bir ipucu! Herkes IE uyumluluğunu merak ederse bazı iyi çoklu dolgu kütüphaneleri vardır.
sofly

7
Güzel, aklında bulunsun bu IE için çalışmıyor olsa
guival

1
SAMSUNG Signage Display WebApp'larında geçerli değildir.
MAR

3
Mevcut en iyi çözüm
Cynthia Sanchez

10
Ayrıca object-fit: containbir genişlik veya yükseklik de kullanabilir ve belirleyebilirsiniz!
Broper

236

Aşağıdaki çözümler , ana kutu genişliğine bağlı olarak görüntünün ölçeklendirilmesine ve ölçeklendirilmesine izin verecektir .

Tüm görüntülerin yalnızca gösterim amacıyla sabit genişliği olan bir üst kabı vardır . Üretimde, bu ana kutunun genişliği olacaktır.

En İyi Uygulama (2018):

Bu çözüm, tarayıcıya resmi maksimum kullanılabilir genişlikte oluşturmasını ve yüksekliği bu genişliğin yüzdesi olarak ayarlamasını söyler.

.parent {
  width: 100px;
}

img {
  display: block;
  width: 100%;
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<div class="parent">
  <img width="400" height="400" src="https://placehold.it/400x400">
</div>

Meraklısı Çözüm:

Daha zarif bir çözümle, görüntüyü boyutundan bağımsız olarak kırpabilir ve kırpmayı telafi etmek için bir arka plan rengi ekleyebilirsiniz.

.parent {
  width: 100px;
}

.container {
  display: block;
  width: 100%;
  height: auto;
  position: relative;
  overflow: hidden;
  padding: 34.37% 0 0 0; /* 34.37% = 100 / (w / h) = 100 / (640 / 220) */
}

.container img {
  display: block;
  max-width: 100%;
  max-height: 100%;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
<p>This image is originally 640x220, but should get resized by the CSS:</p>
<div class="parent">
  <div class="container">
    <img width="640" height="220" src="https://placehold.it/640x220">
  </div>
</div>

Dolgu belirten çizgi için, görüntünün en boy oranını hesaplamanız gerekir, örneğin:

640px (w) = 100%
220px (h) = ?

640/220 = 2.909
100/2.909 = 34.37%

Böylece, üst dolgu =% 34.37.


1
Çalışır, ancak maksimum genişlik olmalıdır: çoğu kullanımda genişlik yerine% 100.
Dudeist

!importantBurada gerekli olduğunu sanmıyorum .
16'da Flimm

1
Üst öğe 100 piksele ayarlandığında. Bu nasıl yanıt verecek?
Remi

@Remi bu gösteri amaçlıdır. Cevabın üstüne bir açıklama ekledim.
Aternus

@Flimm daha önce uyumluluk sorunları için kullanıldı, 2016'da bu artık gerekli değil.
Aternus

64

Arka plan boyutu özelliği yalnızca> = 9'dur, ancak bu sizin için uygunsa, bir div kullanabilir background-imageve ayarlayabilirsiniz background-size: contain:

div.image{
    background-image: url("your/url/here");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
}

Şimdi div boyutunuzu istediğiniz gibi ayarlayabilirsiniz ve sadece görüntü en boy oranını korumakla kalmaz, aynı zamanda div içinde hem dikey hem de yatay olarak merkezileştirilir. Divs etiketin kendisinde width / height özelliğine sahip olmadığından css'deki boyutları ayarlamayı unutmayın.

Bu yaklaşım setecs cevabından farklıdır, bunu kullanarak görüntü alanı sabit olacak ve sizin tarafınızdan tanımlanacaktır (div boyutuna ve görüntü en boy oranına bağlı olarak boş boşlukları yatay veya dikey olarak bırakarak), setecs cevabı size tam olarak ölçeklenmiş görüntünün boyutu (boş boşluk olmadan).

Düzenleme: MDN arka plan boyutu belgelerine göre IE8'de özel bir filtre bildirimi kullanarak arka plan boyutu özelliğini simüle edebilirsiniz:

Internet Explorer 8 arka plan boyutu özelliğini desteklemese de, standart olmayan -ms-filter işlevini kullanarak bazı işlevlerini taklit etmek mümkündür:

-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='path_relative_to_the_HTML_file', sizingMethod='scale')";

2
nihayet en boy oranını korurken bir görüntüyü en üst düzeye çıkarmak için sadece bir CSS çözümü, teşekkürler. 9'dan önceki IE'nin önemsiz olduğu şanslı.
humanityANDpeace

2
Harika bir çözüm, teşekkürler! Ayrıca,
div'ı

Bu doğru cevap olmalı. Bu çözümü seviyorum. Oranlarınızı korur ve anlaşılması kolaydır.
skolind

1
Bu programlı olarak doğru bir cevap olsa da, eğer bir görüntü bu şekilde "önemliyse" SEO öldürmediğiniz için img nitelikleriniz yoktur.
fat_mike

Harika! Bu dört çözümün hepsinde hem portre hem de manzara görüntülerinin yanı sıra görüntünün portre ve manzara kapları (örn. Pencere boyutuna bağlı olarak değişir) için ve ek olarak IE11'de de çalışan bu çözümlerden tekiydi. bir gereklilik. Teşekkür ederim!
cupiqi09

53

Buradaki bazı cevaplara çok benzer, ancak benim durumumda bazen daha uzun, bazen daha büyük görüntüler vardı.

Bu stil, tüm görüntülerin mevcut tüm alanı kullandığından, oranı koruduğundan ve kesmediğinden emin olmak için bir cazibe gibi çalıştı:

.img {
   object-fit: contain;
   max-width: 100%;
   max-height: 100%;
   width: auto;
   height: auto;
}

object-fitbenim için çalışıyor tüm tarayıcıda çalışıyor mu?
Murtuza Zabuawala

.imgEbeveyn veya görüntü üzerinde bir sınıf mı ? Hem portre hem de manzara görüntüleri için örnek bir jsfiddle yapabilir misiniz?
Adrian

19

"Height" özelliğini kaldırın.

<img src="big_image.jpg" width="900" alt=""/>

Her ikisini de belirterek görüntünün en boy oranını değiştirmiş olursunuz. Sadece birini ayarlamak yeniden boyutlandıracak, ancak en boy oranını koruyacaktır.

İsteğe bağlı olarak, büyük boyutları kısıtlamak için:

<img src="big_image.jpg" width="900" alt="" style="max-width:500px; height:auto; max-height:600px;"/>

Tüm görüntülere yapamam - zaten birçok html dosyasına yerleştirilmiş birçok görüntü var
moonvader

2
Tamam. img {maksimum genişlik: 500 piksel; yüksekliği: otomatik; maks. yükseklik: 600 piksel;}
el Dude

1
Bu yorum gibi yararlı bilgiler yayınınıza eklenmelidir. Böylece ne bulduğunuzu hemen görebiliriz.
Bram Vanroy

2
Etiketteki heightözniteliği atlamanın dezavantajı img, tarayıcının görüntüyü indirmeden önce görüntünün ne kadar yer kaplayacağını hesaplayamamasıdır. Bu, sayfanın oluşturulmasını yavaşlatır ve daha fazla "atlama" ya yol açabilir.
16'da Flimm

11

Sadece css'nize ekleyin, Orijinal oranı koruyarak otomatik olarak küçülür ve genişler.

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

2
Bu, belirli bir piksel değeri yerine kullanılması dışında setec'in cevabı ile aynı cevaptır 100%.
16'da Flimm

5
display: block;gereksizdir.
16'da Flimm

Bu mükemmel ve her boyutta ve
Le Droid

8

Orada olan görüntüler için boy oranını korumak için standart bir yolu olduğunu width, heightve max-widthbirlikte belirtilmiş.

Bu yüzden görüntüleri yüklerken sayfanın "sıçramasını" belirtmeye widthve heightönlemeye ya da max-widthgörüntüler için boyutlar kullanmaya ve belirtmemeye zorlanıyoruz .

Yalnızca width(olmadan height) belirtmek genellikle anlamlı değildir, ancak stil sayfanıza heightbenzer bir kural ekleyerek HTML özelliğini geçersiz kılmayı deneyebilirsiniz IMG {height: auto; }.

Ayrıca bkz. İlgili Firefox hatası 392261 .


teşekkür ederim IE, Opera, FF ve Chrome'un modern sürümlerinde çalışır. diğer tarayıcılarla test etmek için biraz zamana ihtiyacım var.
moonvader

7
!importantCSS'de kullanmayın . Sonunda size musallat olmak için geri gelecek bir kesmek.
Automatico

1
!importantBurada bile ihtiyacınız yok.
16'da Flimm

8

İşte bir çözüm:

img {
   width: 100%;
   height: auto;
   object-fit: cover;
}

Bu, görüntünün her zaman tüm ebeveyni kapsadığından (aşağı ve yukarı doğru) ve aynı en boy oranını koruduğundan emin olur.


5

Resim kapsayıcı etiketinizin CSS sınıfını şu şekilde ayarlayın image-class:

<div class="image-full"></div>

ve bunu CSS stil sayfanıza ekleyin.

.image-full {
    background: url(...some image...) no-repeat;
    background-size: cover;
    background-position: center center;
}

5

Görüntüyü belirli bir en boy oranına sahip olmaya zorlarken, duyarlı bir görüntüyü korumak için aşağıdakileri yapabilirsiniz:

HTML:

<div class="ratio2-1">
   <img src="../image.png" alt="image">
</div>

Ve SCSS:

.ratio2-1 {
  overflow: hidden;
  position: relative;

  &:before {
    content: '';
    display: block;
    padding-top: 50%; // ratio 2:1
  }

  img {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
  }
}

Bu, yazarların yüklediği görüntünün boyutuna bakılmaksızın belirli bir en boy oranını uygulamak için kullanılabilir.

Http://codepen.io/Kseso/pen/bfdhg adresindeki @Kseso'ya teşekkürler . Daha fazla oran ve çalışan bir örnek için bu URL'yi kontrol edin.


Bunu dairelerle çalıştığı için seviyorum border-radius. Ama ne yazık ki, görüntüyü kırpıyor ve denediğim kadarıyla div'daki görüntü için bir sınır yapmakla pek iyi değil.
Jake

4

Görüntüyü tam boyuta sığdırmak için çok fazla kod yazmanıza gerek yoktur. Çok basit

img{
    width: 200px;
    height: auto;
    object-fit: contain; /* Fit logo in the image size */
        -o-object-fit: contain; /* Fit logo fro opera browser */
    object-position: top; /* Set logo position */
        -o-object-position: top; /* Logo position for opera browser */
    }
<img src="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png" alt="Logo">


4

https://jsfiddle.net/sot2qgj6/3/

Sabit genişlik yüzdesine sahip , ancak sabit genişlik pikseline sahip olmayan bir görüntü koymak istiyorsanız cevap aşağıdadır .

Ve bu, farklı ekran boyutlarıyla uğraşırken faydalı olacaktır .

Püf noktaları

  1. Kullanma padding-topgenişliği yüksekliği ayarlamak için kullanılır.
  2. position: absoluteDolgu alanına görüntü koymak için kullanılır .
  3. Kullanılması max-height and max-widthemin olmak için görüntü olmaz ebeveyn elemanı üzerinde.
  4. kullanarak display:block and margin: autogörüntüyü ortalamak için.

Ben de keman içindeki hilelerin çoğunu yorumladım.


Bunun gerçekleşmesi için başka yollar da buluyorum. Html gerçek bir görüntü olmayacaktır, bu yüzden ben html "img" eleman gerektiğinde ben şahsen üst cevap perfer.

arka planı kullanarak basit css http://jsfiddle.net/4660s79h/2/

arka plan resmi üst kelime ile http://jsfiddle.net/4660s79h/1/

mutlak konum kullanma kavramı buradan http://www.w3schools.com/howto/howto_css_aspect_ratio.asp


Orijinal soruda belirtildiği gibi "yükseklik ve genişlik zaten belirtilmişse" bu işe yaramaz. Genişlik ve yüksekliği zorlamak ve sonra en boy oranına göre görüntüyü büyütmek / daraltmak istediğiniz zamanlar vardır.
Adrian

3

Bunu kullanabilirsiniz:

img { 
    width: 500px; 
    height: 600px; 
    object-fit: contain; 
    position: relative; 
    top: 50%; 
    transform: translateY(-50%); 
}

2

Bunun gibi bir div oluşturabilirsiniz:

<div class="image" style="background-image:url('/to/your/image')"></div>

Ve stil vermek için bu css kullanın:

height: 100%;
width: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain; // this can also be cover

Bu, div öğesini üst öğesinin% 100 genişliğine kadar genişletir, ancak görüntünün en boy oranını korumaz.
David Ball

Onu denedin mi? İşi jsfiddle.net/zuysj22w aldım . Davanızı gösterebilir misiniz? @DavidBall
Chun Yang

Bu Hoffmann'ın cevabına benzer bir çözüm .
16'da Flimm

2

Duyarlı bir yaklaşım için en iyi uygulamanın Viewport birimlerini ve min / max özelliklerini aşağıdaki gibi kullanmasını öneriyorum :

img{
  display: block;
  width: 12vw;
  height:12vw;
  max-width:100%;
  min-width:100px;
  min-height:100px;
  object-fit:contain;
}

1

Bu, belirtilen alan için çok büyükse görüntünün küçülmesini sağlar (olumsuz olarak görüntüyü büyütmez).

Setec çözümü, otomatik modda "Sığacak Şekilde Küçült" için uygundur. Ancak, 'otomatik' moda sığacak şekilde en iyi şekilde genişletmek için, önce alınan görüntüyü geçici tanıtıcıya koymanız gerekir. ekran bloğunuz),

$(".temp_image").attr("src","str.jpg" ).load(function() { 
    // callback to get actual size of received image 

    // define to expand image in Height 
    if(($(".temp_image").height() / $(".temp_image").width()) > display_aspect_ratio ) {
        $(".image").css('height', max_height_of_box);
        $(".image").css('width',' auto');
    } else { 
        // define to expand image in Width
        $(".image").css('width' ,max_width_of_box);
        $(".image").css('height','auto');
    }
    //Finally put the image to Completely Fill the display area while maintaining aspect ratio.
    $(".image").attr("src","str.jpg");
});

Bu yaklaşım, alınan görüntüler ekran kutusundan daha küçük olduğunda kullanışlıdır. Boyut ve bant genişliğinden tasarruf etmek için Büyük ekran Kutunuzu doldurmak üzere bunları genişletilmiş sürümleri yerine sunucunuzda Orijinal Küçük boyutta kaydetmeniz gerekir.


Her ne kadar soru yazısı yazılmadıysa da, OP'nin sadece bir CSS çözümü aradığını şiddetle ima ettiğini düşünüyorum.
16'da Flimm

0

img {
  max-width: 80px; /* Also works with percentage value like 100% */
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<img width="400" height="400" src="https://i.stack.imgur.com/aEEkn.png">

<p>Let's say the author of the HTML deliberately wants
  the height to be half the value of the width,
  this CSS will ignore the HTML author's wishes, which may or may not be what you want:
</p>
<img width="400" height="200" src="https://i.stack.imgur.com/aEEkn.png">


0

Dikey hizalama için sözde bir öğe kullanmaya ne dersiniz? Bu daha az kod bir atlıkarınca için ama her sabit boyutlu konteyner üzerinde çalışıyor sanırım. En boy oranını koruyacak ve en kısa boyut için üst / alt veya sol / yazma üzerine @ gri-koyu çubuklar ekleyecektir. Bu arada, görüntü yatay olarak metin hizalaması ile ve dikey olarak sözde eleman tarafından ortalanır.

    > li {
      float: left;
      overflow: hidden;
      background-color: @gray-dark;
      text-align: center;

      > a img,
      > img {
        display: inline-block;
        max-height: 100%;
        max-width: 100%;
        width: auto;
        height: auto;
        margin: auto;
        text-align: center;
      }

      // Add pseudo element for vertical alignment of inline (img)
      &:before {
        content: "";
        height: 100%;
        display: inline-block;
        vertical-align: middle;
      }
    }

0

Tam ekran sunum:

img[data-attribute] {height: 100vh;}

Görünüm bağlantı noktası yüksekliği görüntüden büyükse görüntünün farka göre doğal olarak bozulacağını unutmayın.


-1

Sonunda bunun en iyi çözümün kolay ve basit olduğunu düşünüyorum :

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

1
Bu çözümün neden yardımcı olduğunu kısaca açıklar mısınız? (Sadece bir cümle yeterlidir.)
Aenadon

Görüntü en yüksek oranını korurken, maksimum genişlik ve maksimum yükseklik konteynırdan daha büyük olmasını önleyecektir
Uknow
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.