Görüntüyü CSS FlexBox Düzeninde Otomatik Olarak Yeniden Boyutlandırmak ve En Boy Oranını korumak mı?


99

Aşağıda gösterildiği gibi görünen CSS esnek kutu düzenini kullandım:

görüntü açıklamasını buraya girin

Ekran küçülürse şuna dönüşür:

görüntü açıklamasını buraya girin

Sorun, görüntülerin orijinal görüntüden en boy oranı korunarak yeniden boyutlandırılmamasıdır.

Ekran küçülürse görüntülerin yeniden boyutlandırılmasına izin vermek için saf CSS ve esnek kutu düzenini kullanmak mümkün müdür?

İşte benim html'im:

<div class="content">
  <div class="row"> 
    <div class="cell">
      <img src="http://i.imgur.com/OUla6mK.jpg"/>
    </div>
    <div class="cell">
      <img src="http://i.imgur.com/M16WzMd.jpg"/>
    </div>
  </div>
</div>

benim CSS'im:

.content {
    background-color: yellow;    
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

    background-color: red;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto; 

    padding: 10px;
    margin: 10px;

    background-color: green;
    border: 1px solid red;
    text-align: center;

}

Yanıtlar:


87

img {max-width:100%;}bunu yapmanın bir yolu. Sadece CSS kodunuza ekleyin.

http://jsfiddle.net/89dtxt6s/


3
Ekran küçülürse bunu yükseklik boyutu için yapmak da mümkün müdür?
2014

o kod düzeninde çok bağlıdır ediyorum @confile ama eklemeyi deneyebilirsiniz height:100%;için imgcss.
Omega

height: 100vhyapmazdı, değil height: 100%. Yükseklik için şekillendirme her zaman zordur.
gdbj

1
Bu neden doğru cevap olarak işaretlendi? Omega bunu tarayıcı varsayılan davranışına dönüştürmedi mi? jsfiddle.net/89dtxt6s/221
VeeK

74

Buraya çarpıtılmış görüntülerime bir cevap aramak için geldim. Operasyonun yukarıda ne aradığından tam olarak emin değilim, ancak eklemenin align-items: centerbenim için çözeceğini buldum. Dokümanları okurken, görüntüleri doğrudan esnetiyorsanız bunu geçersiz kılmak mantıklıdır, çünkü align-items: stretchvarsayılandır. Diğer bir çözüm, görüntülerinizi önce bir div ile sarmalamaktır.

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}

12
"Buraya çarpıtılmış resimlerime bir cevap aramak için geldim" Ben de aynı nedenle geldim ve çözümünüz bana yardımcı oldu (asıl çözüm olarak işaretlenen şey bana hiç yardımcı olmadı)
Wagner Danda da Silva Filho

bu da bana yardımcı oldu, biri bunun neden işe yaradığını açıklayabilir mi?
Jerry B. no.1 stajyer

Bu benim için doğru cevaptı. maksimum genişlik:% 100; yüksekliği düzeltmedi (yükseklik hala biraz gerilmişti). Benim durumumda align-items kullandım: flex-start; çünkü görüntünün kapta dikey olarak ortalanmasını istemiyordum, ancak varsayılan hizalama öğelerini geçersiz kıldığı için yine de çalıştı: stretch; Burada geçersiz kılmak için kullanabilirsiniz hizalamak-kalemleri için tüm emlak değerlerinin bir listesi: w3schools.com/cssref/css3_pr_align-items.asp
Kyle Vassella

Pek çok şey denedim, ama hizalama öğeleriniz: Hile yapan tek şey ebeveynin merkezidir .
Micros

Kabul edilen cevap bu olmalıdır. Align-content esnetme açısından benim için işe yaramadı, ancak hizalama öğeleri işe yarıyor, her ikisinin de farklı işlevleri var. Bu SE, ikisi arasındaki farkı temizler: stackoverflow.com/questions/27539262/…
John Ernest

45

Çok yeni ve basit CSS3 özelliğini denemek isteyebilirsiniz:

img { 
  object-fit: contain;
}

Resim oranını koruyor (arka plan resmi hilesi kullandığınızda olduğu gibi) ve benim durumumda aynı sorun için güzelce çalıştı.

Dikkatli olun, IE tarafından desteklenmiyor (destek ayrıntılarına buradan bakın ).


4
Lütfen ana nesnenin esnek olması gerektiğini unutmayın
Lokinou

Bunu denedim ve bir flex div içinde mükemmel çalıştı.
Rémy Kaloustian

6

background-sizeGörüntü boyutunu ayarlamak için seçeneklere bakmanızı öneririm .

Arka plan görüntüsü olarak ayarladıysanız, sayfada görüntünün olması yerine şunları ayarlayabilirsiniz:

background-size: contain

veya

background-size: cover

Bu seçenekler, görüntüyü ölçeklendirirken hem yüksekliği hem de genişliği hesaba katar. Bu, IE9'da ve diğer tüm yeni tarayıcılarda çalışacaktır.


3

İkinci görüntüde görüntünün kutuyu doldurmasını istiyormuşsunuz gibi görünüyor, ancak oluşturduğunuz örnek en boy oranını koruyor (evcil hayvanlar ince veya şişman değil normal görünüyor).

Bu resimleri örnek olarak photoshop'ladıysanız ya da ikincisi de "nasıl olması gerektiği" konusunda hiçbir fikrim yok (ilk örnek "gerekir" derken IS dediniz)

Her neyse, varsaymak zorundayım:

"Görüntüler en boy oranını koruyarak yeniden boyutlandırılmazsa" ve bana piksellerin en boy oranını SAKLAYAN bir görüntü gösterirseniz, "kırpma" alanının en boy oranını elde etmeye çalıştığınızı varsaymalıyım. yeşil) WILE piksellerin en boy oranını korur. Yani, resmi büyüterek ve kırparak hücreyi resimle doldurmak istiyorsunuz.

Bu sizin sorununuzsa, sağladığınız kod "sorununuzu" DEĞİL, başlangıç ​​örneğinizi yansıtmaktadır.

Önceki iki varsayım göz önüne alındığında, ihtiyacınız olan şey, kutunun yüksekliği dinamikse gerçek görüntülerle değil, arka plan görüntüleriyle başarılamaz. Ya "background-size: include" veya şu teknikleri kullanarak (istediğiniz herhangi bir yerde kırpmayı veya maksimum boyutları sınırlayan yüzdelerde akıllı dolgular): http://fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

Bunun resimlerle mümkün olmasının tek yolu, ikinci resminizi UNUTMAK ve hücrelerin sabit bir yüksekliğe sahip olması ve ŞİDDETLE, örnek resimlerinize bakılırsa, yüksekliğin aynı kalmasıdır!

Dolayısıyla, kabınızın yüksekliği değişmezse ve görsellerinizi kare tutmak istiyorsanız, görsellerin maksimum yüksekliğini bilinen değere (eksi dolgular veya kenarlıklar, kutunun kutu boyutlandırma özelliğine bağlı olarak) ayarlamanız yeterlidir. hücreler)

Bunun gibi:

<div class="content">
  <div class="row">    
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-2.jpg"/>
      </div>
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-7.jpg"/>
      </div>
    </div>
</div>

Ve CSS:

.content {
    background-color: green;
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    padding: 10px;
    border: solid 10px red;
    text-align: center;
    height: 300px;
    display: flex;
    align-items: center;
    box-sizing: content-box;
}
img {
    margin: auto;
    width: 100%;
    max-width: 300px;
    max-height:100%
}

http://jsfiddle.net/z25heocL/

Kodunuz geçersiz (açılış etiketleri, kapatmak yerine etiketlerdir, bu nedenle kardeşleri değil NESTED hücreleri çıkarırlar, resimlerinizin bir SCREENSHOT'ını hatalı kodun içinde kullandı ve esnek kutusu hücreleri değil, her iki örneği de bir sütunda tutuyor ( "satır" ayarladınız, ancak bir hücreyi diğerinin içine yerleştiren bozuk kod, esnekliğin içinde bir esneklikle sonuçlandı ve sonunda COLUMNS olarak çalışıyor. Neyi başarmak istediğiniz ve bu kodu nasıl oluşturduğunuz hakkında hiçbir fikrim yok, ama ben Ne istediğini tahmin ediyorum.

Görüntüyü ekledim: hücrelere de esnetin, böylece görüntü ortalanır (bence display: tabletüm bu işaretlemeyle burada da kullanılabilirdi)


Benim tarafımdan sorunun nasıl cevaplandığına dair en ufak bir fikriniz yok gibi görünüyor. Bu jsfiddle'daki tüm html ve css, sorgulayıcının (@confile) sağladığı şeydir. Sadece soruyu oku ve bunu göreceksin. Benim çözümüm basit bir css img satırı {max-width: 100%;} ve soruyu soran kişi bir yıl önce sorulan çözümü sağladığı için cevabımı kabul etti. Size en iyi dileklerimi sunarım, lütfen soruları doğru okumaya çalışın ve daha sonra buna göre cevap verin, teşekkürler.
Omega

0

HTML:

<div class="container">
    <div class="box">
        <img src="http://lorempixel.com/1600/1200/" alt="">
    </div>
</div>

CSS:

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: stretch;

  width: 100%;
  height: 100%;

  border-radius: 4px;
  background-color: hsl(0, 0%, 96%);
}

.box {
  border-radius: 4px;
  display: flex;
}

.box img {
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}

0

Esnek bir ızgarada farklı görüntüleri (boyutlar ve oranlar) bu şekilde işlerdim.

.images {
  display: flex;
  flex-wrap: wrap;
  margin: -20px;
}

.imagewrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  width: calc(50% - 20px);
  height: 300px;
  margin: 10px;
}

.image {
  display: block;
  object-fit: cover;
  width: 100%;
  height: 100%; /* set to 'auto' in IE11 to avoid distortions */
}
<div class="images">
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1000x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/500x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
</div>


-6

Oranı korumak için jquery veya vw kullanıyorum

jquery

function setSize() {
    var $h = $('.cell').width();
    $('.your-img-class').height($h);
}
$(setSize);
$( window ).resize(setSize); 

vw

 .cell{
    width:30vw;
    height:30vw;
}
.cell img{
    width:100%;
    height:100%;
}
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.