CSS ile div'in en boy oranını koruyun


1058

divPencerenin genişliği değiştikçe genişliğini / yüksekliğini değiştirebilecek bir oluşturmak istiyorum .

En boy oranını korurken yüksekliğin genişliğe göre değişmesine izin verecek herhangi bir CSS3 kuralı var mı?

Bunu JavaScript ile yapabileceğimi biliyorum, ancak yalnızca CSS kullanmayı tercih ederim.

en boy oranını pencerenin genişliğine göre bölme



2
Bu soru ve cevaplara çok geç geldim, ama yorum yapmalıyım. Her ne kadar çok disiplinli olsa da ve sorunun herkesin "tek CSS" talebini karşılamak için elinden gelenin en iyisini yapmaya yanıt veren herkesin SO kuralları dahilinde olmasına rağmen, sayfanın alt kısmındaki user007'nin yanıtı dışında , hayır- açık bir söz: sadece güvenilir CSS çözümü yok, bu sorun Javascript gerektirir. Bu sayfaya gelen bir acemi, ampul sönmeden önce bir takım artı / eksilerden diğerine geçmek için değerli zaman harcayabilir: Yalnızca CSS yapmaz.
Theo d'Or

1
En boy oranlarını önizlemeyi ve hesaplamayı kolaylaştıran küçük bir araç yazdım, aspectrat.io . Ayrıca, projelerinize kopyalayıp yapıştırabileceğiniz uygun CSS / Sass / Less kodunu oluşturur. Umarım insanlar bunu faydalı bulur.
Ryan Hefner

bu örneğe bakın: w3schools.com/howto/howto_css_aspect_ratio.asp ..... bu işe yaradı
Cristian Agudelo 28:18

1
Bu soru ayarı içindir yüksekliğine dayalı genişliği . Aksine ihtiyacınız varsa, CSS Üzerinden Yüksekliğe Göre Ayar Eleman Genişliğini kontrol edin .
John Mellor

Yanıtlar:


1353

Bunun için <div>yüzde değeri olan bir sarıcı oluşturun padding-bottom:

div {
  width: 100%;
  padding-bottom: 75%;
  background: gold; /** <-- For the demo **/
}

/* demonstration purposed only : non-essential */
.demoWrapper {
  padding: 10px;
  background: white;
  box-sizing: border-box;
  resize: horizontal;
  border: 1px dashed;
  overflow: auto;
  max-width: 100%;
  height: calc(100vh - 16px);
}
<div class="demoWrapper">
  <div></div>
</div>

<div>Yüksekliği, kabının genişliğinin% 75'ine eşit bir yüksekliğe neden olacaktır (4: 3 en boy oranı).

Bu, dolgu için:

Yüzde, oluşturulan kutunun içeren bloğun genişliğine göre hesaplanır [...] (kaynak: w3.org , benimki vurgu)

Diğer en boy oranları ve% 100 genişlik için dolgu alt değerleri:

aspect ratio  | padding-bottom value
--------------|----------------------
    16:9      |       56.25%
    4:3       |       75%
    3:2       |       66.66%
    8:5       |       62.5%

Div içerisine içerik yerleştirme:

Div'ın en boy oranını korumak ve içeriğinin esnemesini önlemek için, kesinlikle konumlandırılmış bir çocuk eklemeniz ve sarma makinesinin kenarlarına şu şekilde germeniz gerekir:

div.stretchy-wrapper {
  position: relative;
}

div.stretchy-wrapper > div {
  position: absolute;
  top: 0; bottom: 0; left: 0; right: 0;
}

İşte bir demo ve daha ayrıntılı bir demo


29
@schellmax, dolgu% 'sinin geçerli elemanın genişliğine göre hesaplanmasıdır, burada% yükseklik, ana elemanın yüksekliğine göre hesaplanır. Ayrıca, mutlak pozisyonlar, dolgu alanını içeren bir elemanın dış kabına göre hesaplanır. Daha fazla bilgi için Google "CSS Kutu Modeli"
Anson Kao

11
Bu iç içe geçmiş gibi görünmüyor. İlk düzeyde çalışır, ancak div sürdürme en boy oranının içinde aynı şeyi yapmaya çalışırken, dolgu alt yüzdesi ebeveynin genişliğine uygulanır gibi görünür. Burada, % 25'lik .stretchy-wrap.onethird dolgu tabanının aslında ebeveyn genişliğinin% 25'i olduğu bir örnek . Birisi bunu açıklayabilir mi?
Misterparker

4
Tamamen sahane. Yüksekliği% 100 olarak sabitlemek istediğinizde bu tekniğin işe yaramayacağı beni öldürüyor. @Misterparker, teknik aynı referansa göre yapılan genişlik ve dolgu hesaplamalarına dayanır; örneğinizde olduğu gibi% 100'den küçük bir genişliği kullanamazsınız.
steveluscher

2
@Misterparker Evet, yüzde dolgusu üst öğenin genişliği ile orantılı olarak hesaplanır. Cevabımda bir düzenlemede yayınladığım daha ayrıntılı örneğe bakın. Güncellenmiş demo'm, sizin konuştuğunuz gibi 'iç ​​içe bir moda' gösteriyor.
Web_Designer

3
bunun işe yaradığını kanıtlamış olması beni bunun SO'da görülen en iyi cevap olduğuna ikna etmek için yeterli. adamımdan bağırıyorum @Web_Designer

411

vw birimler:

Birimin vwhem genişliği hem de yüksekliği için birimleri kullanabilirsiniz . Bu, görünüm alanı genişliğine bağlı olarak öğenin en boy oranının korunmasını sağlar.

vw: görünümün genişliğinin 1 / 100'ü. [ MDN ]

Alternatif olarak, aynı zamanda kullanabilir vhgörünüm yüksekliği, ya da vmin/ vmax(tartışma görüntü alanı boyutları daha az / daha fazla kullanımı burada ).

Örnek: 1: 1 en boy oranı

div {
  width: 20vw;
  height: 20vw;
  background: gold;
}
<div></div>

Diğer en boy oranları için, elemanın genişliğine göre yükseklik değerini hesaplamak için aşağıdaki tabloyu kullanabilirsiniz:

aspect ratio  |  multiply width by
-----------------------------------
     1:1      |         1
     1:3      |         3
     4:3      |        0.75
    16:9      |       0.5625

Örnek: 4x4 kare bölmeli ızgara

body {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}
div {
  width: 23vw;
  height: 23vw;
  margin: 0.5vw auto;
  background: gold;
}
<div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div>

İşte bu demo ile bir Keman ve burada dikey ve yatay merkezli içeriği ile duyarlı bir kareler ızgarası yapmak için bir çözüm .


Vh / vw birimleri için tarayıcı desteği IE9 + dır.


14
Bu kabul edilen cevap olmalı. Belki şimdi değil, gelecekte. vw birimleri artık çoğu tarayıcıda desteklenmektedir .
Ağustos

3
@vivekmaharajh her iki teknik de iyidir, her birinin kendi artıları ve eksileri vardır. Birini veya diğerini kullanmak büyük ölçüde duruma bağlıdır.
web-tiki

11
@ web-tiki, haklısın. Bir sorunla karşılaştım - öğenin genişliğinin görünüm alanının genişliği ile orantılı olduğunu varsayar, bu 1) sabit genişlik olukları gibi şeyleriniz varsa veya 2) maksimum genişlik ayarlamanız varsa böyle olmaz bazı öğeleriniz için.
Vivek Maharajh

1
Belki sadece Chrome v47beta, ancak div'ı ayarladığımda width:50%ve height:50vwyükseklik genişlikten biraz daha uzun olduğunda, tam olarak 1: 1 oranında değil. Herhangi bir fikir?
thdoan

2
@ 10basetom normal bir davranıştır. vw birimleri kaydırma çubuğu genişliğini içerirken% genişlik içermez. Yükseklik ve genişlik arasındaki fark, tarayıcıya bağlı olarak farklı olan kaydırma çubuğunun boyutuna bağlı olacaktır.
web-tiki

26

Bunu CSS kullanarak yapmanın bir yolunu buldum, ancak kendi web sitenizin akışına bağlı olarak değişebileceğinden dikkatli olmalısınız. Web sitemin bir akışkan genişliği bölümünde sabit bir en boy oranı ile video gömmek için yaptım.

Bunun gibi gömülü bir videonuz olduğunu varsayalım:

<object>
     <param ... /><param ... />...
     <embed src="..." ...</embed>
</object>

Daha sonra bunu "video" sınıfına sahip bir div içine yerleştirebilirsiniz. Bu video sınıfı, büyük olasılıkla web sitenizdeki akışkan öğesi olacaktır, öyle ki, kendi başına doğrudan yükseklik kısıtlamaları yoktur, ancak tarayıcıyı yeniden boyutlandırdığınızda, web sitesinin akışına göre genişliğinde değişecektir. Bu, muhtemelen videonun belirli bir en boy oranını korurken gömülü videonuzu içeri almaya çalıştığınız öğedir.

Bunu yapmak için, "video" sınıf div içindeki gömülü nesnenin önüne bir görüntü koymak.

!!! Önemli olan kısım, görüntünün korumak istediğiniz doğru en boy oranına sahip olmasıdır. Ayrıca, görüntünün boyutunun, düzeninize bağlı olarak, videonun beklediğiniz en küçük boyutta (veya AR'yi koruduğunuz her şeyin) kadar küçük olduğundan emin olun. Bu, yüzde yeniden boyutlandırıldığında görüntünün çözünürlüğündeki olası sorunları önler. Örneğin, 3: 2 en boy oranını korumak istiyorsanız, yalnızca 3 piksele 2 piksellik bir resim kullanmayın. Bazı durumlarda işe yarayabilir, ancak test etmedim ve muhtemelen kaçınmak iyi bir fikir olacaktır.

Büyük olasılıkla, web sitenizin akışkan öğeleri için tanımlanan bunun gibi bir minimum genişliğe sahip olmalısınız. Değilse, tarayıcı penceresi çok küçük olduğunda öğelerin kesilmesini veya örtüşmesini önlemek için bunu yapmak iyi bir fikirdir. Bir noktada bir kaydırma çubuğuna sahip olmak daha iyidir. Bir web sayfasının alması gereken en küçük genişlik ~ 600 piksel civarında (sabit genişlikli sütunlar dahil) bir yerdedir, çünkü telefon dostu sitelerle uğraşmadıkça ekran çözünürlükleri daha küçük olmaz. !!!

Tamamen şeffaf bir png kullanıyorum, ancak doğru yaparsanız bunun önemli olduğunu düşünmüyorum. Bunun gibi:

<div class="video">
     <img class="maintainaspectratio" src="maintainaspectratio.png" />
     <object>
          <param ... /><param ... />...
          <embed src="..." ...</embed>
     </object>
</div>

Şimdi aşağıdakine benzer bir CSS ekleyebilmeniz gerekir:

div.video { ...; position: relative; }
div.video img.maintainaspectratio { width: 100%; }
div.video object { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; }
div.video embed {width: 100%; height: 100%; }

Ayrıca, genellikle kopyala / yapıştır gömme koduyla gelen nesne ve gömme etiketlerindeki açık yükseklik veya genişlik bildirimlerini kaldırdığınızdan emin olun.

Çalışma şekli, video sınıfı öğesinin konum özelliklerine ve istediğiniz öğenin belirli bir en boy oranını korumasına bağlıdır. Bir öğede yeniden boyutlandırıldığında görüntünün uygun en boy oranını koruma yönteminden yararlanır. Video sınıfı öğesinde başka ne varsa, genişliğini / yüksekliğini görüntü tarafından ayarlanan video sınıfı öğesinin% 100'üne zorlayarak dinamik görüntü tarafından sağlanan gayrimenkulden tam olarak yararlanmasını söyler.

Çok havalı, ha?

Kendi tasarımınızla çalışmasını sağlamak için biraz oynamak zorunda kalabilirsiniz, ancak bu aslında benim için şaşırtıcı derecede iyi çalışıyor. Genel konsept orada.


17

Elliot bana bu çözüme ilham verdi - teşekkürler:

aspectratio.png benim durumumda 30x10 piksel, tercih edilen en boy oranına sahip tamamen şeffaf bir PNG dosyasıdır.

HTML

<div class="eyecatcher">
  <img src="/img/aspectratio.png"/>
</div>

CSS3

.eyecatcher img {
  width: 100%;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  background-image: url(../img/autoresized-picture.jpg);
}

Lütfen dikkat: background-size hedef tarayıcılarınızla çalışmayabilecek bir css3 özelliğidir. Birlikte çalışabilirliği kontrol edebilirsiniz (fe on caniuse.com ).


14

Web_Designer'ın cevabına eklemek için, içerdiği öğenin<div> genişliğinin% 75'i kadar bir yüksekliğe (tamamen alt dolgudan oluşur) sahip olacaktır . İşte iyi bir özet: http://mattsnider.com/css-using-percent-for-margin-and-padding/ . Bunun neden böyle olması gerektiğinden emin değilim, ama böyle.

Div'inizin% 100 dışında bir genişlik olmasını istiyorsanız, genişliği ayarlamak için başka bir sarma divına ihtiyacınız vardır:

div.ar-outer{
    width: 60%; /* container; whatever width you want */
    margin: 0 auto; /* centered if you like */
}
div.ar {
    width:100%; /* 100% of width of container */
    padding-bottom: 75%; /* 75% of width of container */
    position:relative;
}
div.ar-inner {
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
}

Cihaz çözünürlüğüne bağlı olarak farklı bir logo dosyası sunmak için CSS medya sorgularını kullanmama izin vermek için yakın zamanda Elliot'un görüntü numarasına benzer bir şey kullandım, ancak yine <img>de doğal olarak yaptığı gibi orantılı olarak ölçeklendirdim (logoyu arka plan görüntüsü olarak şeffaf bir .png olarak ayarladım doğru en boy oranıyla). Ancak Web_Designer'ın çözümü bana bir http isteği kaydeder.


Harika bir çözüm. Benim durumumda DOM'a yerleştirirken "doğal" görüntü boyutunu biliyorum ve tarayıcı görüntüleri yüklediğinde daha fazla kaydırma yapılmasını önlemek için uygun yükseklikte bir görüntü yer tutucusuna sahip olmam gerekiyor. .Ar-dış Ben piksel olarak görüntü genişliği var, .ar ben gerçek görüntü en boy oranından hesaplanan dolgu alt var. Ar-içi yerine görüntünün kendisi var (<img>). Ancak, üst, alt, sol ve sağ yerine genişliği% 100 olarak ayarlamak zorunda kaldım. MaxWidth değerini ar-dış olarak ayarladığımda, üst öğe küçük olduğunda görüntü güzel bir şekilde ölçeklenir, ancak doğal boyutundan daha büyük bir boyuta ölçeklenmez.
Mi-La

13

Burada w3schools.com'da belirtildiği ve kabul edilen bu cevapta bir şekilde tekrarlandığı gibi, değerler yüzde olarak dolduruluyor (vurgu mayın):

Dolguyu içeren öğenin genişliğinin yüzdesi olarak belirtir

Ergo, 16: 9 en boy oranını koruyan duyarlı bir DIV'nin doğru örneği aşağıdaki gibidir:

CSS

.parent {
    position: relative;
    width: 100%;
}
.child {
    position: relative;
    padding-bottom: calc(100% * 9 / 16);
}
.child > div {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

HTML

<div class="parent">
    <div class="child">
        <div>Aspect is kept when resizing</div>
    </div>
</div>

JSFiddle'da demo


13

@ Web-tiki zaten kullanmanın bir yolunu gösterdiğinden vh/ vw, ayrıca ekranda ortalamanın bir yoluna ihtiyacım var, burada 9:16 portre için bir snippet kodu var .

.container {
  width: 100vw;
  height: calc(100vw * 16 / 9);
  transform: translateY(calc((100vw * 16 / 9 - 100vh) / -2));
}

translateYbu merkezi ekranda tutacaktır. calc(100vw * 16 / 9)9/16 için beklenen yükseklik. (100vw * 16 / 9 - 100vh)taşma yüksekliğidir, bu yüzden yukarı çekin overflow height/2onu ekranda ortada tutacaktır.

Manzara için ve 16: 9'u sakla ,

.container {
  width: 100vw;
  height: calc(100vw * 9 / 16);
  transform: translateY(calc((100vw * 9 / 16 - 100vh) / -2));
}

9/16 oranı kolayca değiştirilebilir, önceden tanımlanmasına gerek yoktur . 100:56.25Veya 100:75Önce yüksekliği sağlamak istiyorsanız, genişliği ve yüksekliği değiştirmelisiniz, örneğin height:100vh;width: calc(100vh * 9 / 16)9:16 portre için.

Farklı ekran boyutlarına uyum sağlamak isterseniz,

  • arka plan boyutu kapak / içerir
    • Yukarıdaki stil içermeye benzer, genişliğe bağlıdır: yükseklik oranı.
  • nesneye uygun
    • img / video etiketi için cover / içerir
  • @media (orientation: portrait)/@media (orientation: landscape)
    • Oranı değiştirmek portrait/ landscapeiçin medya sorgusu .

11

Bu, kabul edilen cevapta bir gelişmedir:

  • Sarıcı div değerleri yerine sözde öğeler kullanır
  • En boy oranı, üst öğesi yerine kutunun genişliğini temel alır
  • İçerik daha uzun olduğunda kutu dikey olarak gerilir

.box {
  margin-top: 1em;
  margin-bottom: 1em;
  background-color: #CCC;
}

.fixed-ar::before {
  content: "";
  float: left;
  width: 1px;
  margin-left: -1px;
}
.fixed-ar::after {
  content: "";
  display: table;
  clear: both;
}

.fixed-ar-16-9::before {
  padding-top: 56.25%;
}
.fixed-ar-3-2::before {
  padding-top: 66.66%;
}
.fixed-ar-4-3::before {
  padding-top: 75%;
}
.fixed-ar-1-1::before {
  padding-top: 100%;
}

.width-50 {
  display: inline-block;
  width: 50%;
}
.width-20 {
  display: inline-block;
  width: 20%;
}
<div class="box fixed-ar fixed-ar-16-9">16:9 full width</div>
<hr>
<div class="box fixed-ar fixed-ar-16-9 width-50">16:9</div>
<hr>
<div class="box fixed-ar fixed-ar-16-9 width-20">16:9</div>
<div class="box fixed-ar fixed-ar-3-2 width-20">3:2</div>
<div class="box fixed-ar fixed-ar-4-3 width-20">4:3</div>
<div class="box fixed-ar fixed-ar-1-1 width-20">1:1</div>
<hr>
<div class="box fixed-ar fixed-ar-16-9 width-20">16:9</div>
<div class="box fixed-ar fixed-ar-16-9 width-50">16:9</div>


kutunun dikey gerilmesini nasıl devre dışı bırakabilirim? Kesinlikle bir germe div en boy oranını korumaz
florian

İçerik beklenen yükseklikten daha uzunsa, kutu dikey olarak gerilir. Bu fikir en iyi, video ve görüntüler gibi ebeveyn boyutlarına uyacak şekilde genişletilebilen içerikle kullanılır.
Salman A

10

Ben tökezledi akıllı çözümü kullanarak <svg>ve display:grid.

Izgara öğesi, hangisinin yüksekliği ayarladığını belirtmeye gerek kalmadan iki (veya daha fazla) öğeyle aynı alanı işgal etmenizi sağlar. Bu, kutudan çıktıkça daha uzun olanın oranı ayarladığı anlamına gelir .

Bu, içeriğin "tüm oranı" doldurmaya yetecek kadar uzun olmayacağını bildiğiniz gibi kullanabileceğiniz anlamına gelir ve içeriği yalnızca bu alana yerleştirmenin bir yolunu arıyorsunuz (yani her iki yönde de kullanmak için display:flex; align-items:center; justify-content:center).
Hemen hemen şeffaf kullanarak aynı şey <img>ile display:blockharicinde ve önceden belirlenmiş oran <svg>daha hafif ve değiştirmek için oldukça kolaydır (eğer gerektiğinde, duyarlı olacak oranını değiştirmek için).

<div class="ratio">
  <svg viewBox="0 0 1 1"></svg>
  <div>
    I'm square
  </div>
</div>
.ratio {
  display: grid;
}
.ratio > * {
  grid-area: 1/1/1/1;
}

Tek yapmanız gereken <svg>s oranını değiştirmek :

  • <svg viewBox="0 0 4 3"></svg>
  • <svg viewBox="0 0 16 9"></svg>

Çalıştığını görün:


İçerik öğesinin daha uzun olduğunda oranı ayarlamasına izin verilmeyen bir çözüme ihtiyacınız varsa (taşma gizli veya otomatik olarak), position:relativeızgarada ve position:absolute; height:100%; overflow-y: auto;içerikte ayarlamanız gerekir . Misal:


9

Çözümlerinize dayanarak biraz hile yaptım:

Bunu kullandığınızda, HTML kodunuz yalnızca

<div data-keep-ratio="75%">
    <div>Main content</div>
</div>

Bu şekilde kullanmak için: CSS:

*[data-keep-ratio] {
    display: block;
    width: 100%;
    position: relative;
}
*[data-keep-ratio] > * {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
}

ve js (jQuery)

$('*[data-keep-ratio]').each(function(){ 
    var ratio = $(this).data('keep-ratio');
    $(this).css('padding-bottom', ratio);
});

Ve buna sahipseniz sadece data-keep-ratioyükseklik / genişliğe attr ayarladınız ve hepsi bu.


3
Kullanmanız gereken data-keep-ratiodeğil keep-ratiove kullanma 's değeri elde$(this).data('keep-ratio');
Robert

kodunuz şu anda çalışıyor ve belki de sonsuza dek çalışacak, ancak standart değil ve tarayıcılar gelecekte her zaman desteklemeyi durdurabilir
Robert

1
Burada JS kullanmak kötü haberlere neden olur!
Amir Hossein Ahmadi

8

Bir svg kullanabilirsiniz. Konteyner / ambalaj konumunu göreceli hale getirin, svg'yi statik olarak konumlandırılmış olarak yerleştirin ve daha sonra kesinlikle konumlandırılmış içerik koyun (üst: 0; sol: 0; sağ: 0; alt: 0;)

16: 9 oranlı örnek:

image.svg: (src ile satır içine alınabilir)

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 9" width="16" height="9"/>

CSS:

.container {
  position: relative;
}
.content {
  position: absolute;
  top:0; left:0; right:0; bottom:0;
}

HTML:

<div class="container">
  <img style="width: 100%" src="image.svg" />
  <div class="content"></div>
</div>

Satır içi svg'nin işe yaramadığını unutmayın, ancak svg'yi kodlayabilir ve img src özniteliğine şu şekilde gömebilirsiniz:

<img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%209%22%20width%3D%2216%22%20height%3D%229%22%2F%3E" style="width: 100%;" />

7

SCSS benim durumumda en iyi çözüm; bir veri özelliği kullanarak:

[data-aspect-ratio] {
    display: block;
    max-width: 100%;
    position: relative;

    &:before {
        content: '';
        display: block;
    }

    > * {
        display: block;
        height: 100%;
        left: 0;
        position: absolute;
        top: 0;
        width: 100%;
    }
}
[data-aspect-ratio="3:1"]:before {
    padding-top: 33.33%;
}
[data-aspect-ratio="2:1"]:before {
    padding-top: 50%;
}
[data-aspect-ratio="16:9"]:before {
    padding-top: 56.25%;
}
[data-aspect-ratio="3:2"]:before {
    padding-top: 66.66%;
}
[data-aspect-ratio="4:3"]:before {
    padding-top: 75%;
}
[data-aspect-ratio="1:1"]:before {
    padding-top: 100%;
}
[data-aspect-ratio="3:4"]:before {
    padding-top: 133.33%;
}
[data-aspect-ratio="2:3"]:before {
    padding-top: 150%;
}
[data-aspect-ratio="9:16"]:before {
    padding-top: 177.77%;
}
[data-aspect-ratio="1:2"]:before {
    padding-top: 200%;
}
[data-aspect-ratio="1:3"]:before {
    padding-top: 300%;
}

Örneğin :

<div data-aspect-ratio="16:9"><iframe ...></iframe></div>

kaynak


15
Sadece FYI ... Tam olarak aynı şeyi (öznitelik seçicileri kullanarak) düz CSS kullanarak aynı miktarda satırda yapabilirsiniz. [data-aspect-ratio]Özellik seçici CSS size sunulmaktadır.
rnevius

6

Çoğu yanıt çok güzel olsa da, çoğunun zaten doğru boyutta bir görüntüye sahip olması gerekir ... Diğer çözümler yalnızca genişlik için çalışır ve mevcut yüksekliğe dikkat etmez, ancak bazen içeriği belirli bir yüksekliğe sığdırmak da istersiniz .

Tamamen taşınabilir ve yeniden boyutlandırılabilir bir çözüm getirmek için onları bir araya getirmeye çalıştım ... Hile, bir görüntünün otomatik ölçeklendirilmesi için kullanmaktır, ancak önceden oluşturulmuş bir görüntü veya herhangi bir form kullanmak yerine bir satır içi svg öğesi kullanmaktır. ikinci HTTP isteği ...

div.holder{
  background-color:red;
  display:inline-block;
  height:100px;
  width:400px;
}
svg, img{
  background-color:blue;
  display:block;
  height:auto;
  width:auto;
  max-width:100%;
  max-height:100%;
}
.content_sizer{
  position:relative;
  display:inline-block;
  height:100%;
}
.content{
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  right:0;
  background-color:rgba(155,255,0,0.5);
}
<div class="holder">
  <div class="content_sizer">
    <svg width=10000 height=5000 />
    <div class="content">
    </div>
  </div>
</div>

SVG'nin genişlik ve yükseklik özelliklerinde büyük değerler kullandığım, çünkü sadece küçülebileceği için beklenen maksimum boyuttan daha büyük olması gerektiğine dikkat edin. Örnek div oranını 10: 5 yapar


4

Sadece bir fikir ya da hack.

div {
  background-color: blue;
  width: 10%;
  transition: background-color 0.5s, width 0.5s;
  font-size: 0;
}

div:hover {
  width: 20%;
  background-color: red;
}
  
img {
  width: 100%;
  height: auto;
  visibility: hidden;
}
<div>
  <!-- use an image with target aspect ratio. sample is a square -->
  <img src="http://i.imgur.com/9OPnZNk.png" />
</div>


Bu sadece bir CSS çözümü değildir ... Şimdi, bir sözde öğede base64 kodlu bir görüntü kullanırsanız, bu harika bir çözüm olurdu.
rnevius

1
Gerçekten sadece CSS çözümü yok. HTML, web'in temel bileşenidir. Sorunun amacının belki de kaynak / işleme kaydetmek için JS kullanmaktan kaçınmak olduğuna inanıyorum.
orlland

Sahte öğenin çalışıp çalışmadığından emin değilim. Bu çözümün çalışması için en boy oranını korumak için img öğesinin özelliğini kullandım.
orlland

Güzel, ancak yalnızca genişlik değiştiğinde bir yükseklik hesaplar. Her iki şekilde de yapmalı, bu yüzden yüksekliği azalttığımda genişlik de yeniden hesaplanıyor. Aksi takdirde işe yaramaz ..
29mega

4

diyelim ki 2 div var dış div bir kap ve iç oranını korumak için ihtiyacınız olan herhangi bir öğe olabilir (img veya bir youtube iframe veya her neyse)

html şöyle görünür:

<div class='container'>
  <div class='element'>
  </div><!-- end of element -->

"eleman" oranını korumanız gerektiğini varsayalım

oran => 4 ila 1 veya 2 ila 1 ...

css şöyle görünüyor

.container{
  position: relative;
  height: 0
  padding-bottom : 75% /* for 4 to 3 ratio */ 25% /* for 4 to 1 ratio ..*/

}

.element{
  width : 100%;
  height: 100%;
  position: absolute; 
  top : 0 ;
  bottom : 0 ;
  background : red; /* just for illustration */
}

% olarak belirtildiğinde dolgu, yüksekliğe değil genişliğe göre hesaplanır. .. yani temelde sizin genişliğinizin yüksekliği her zaman buna göre hesaplanacaktır. oranını koruyacak.


4

Dikey veya yatay görünümde görünüm alanının içine bir kare sığdırmak istiyorsanız (olabildiğince büyük, ancak dışarıya yapışan hiçbir şey yoksa) vw/ vhyönünü portrait/ arasında kullanma arasında geçiş yapın landscape:

@media (orientation:portrait ) {
  .square {
    width :100vw;
    height:100vw;
  }
} 
@media (orientation:landscape) {
  .square {
    width :100vh;
    height:100vh;
  }
} 

4

imgBelirli bir en boy oranını dolduran bir etiketin olduğu çözümümü paylaşmak istiyorum . Ben kullanamadı backgroundçünkü CMS desteği eksikliği ve bu yüzden böyle bir stil etiketi kullanmayı tercih istemem: <img style="background:url(...)" />. Ayrıca, genişlik% 100'dür, bu nedenle bazı çözümlerde olduğu gibi sabit bir boyutta ayarlanması gerekmez. Duyarlı bir şekilde ölçeklendirilecek!

.wrapper {
  width: 50%;
}

.image-container {
  position: relative;
  width: 100%;
}

.image-container::before {
  content: "";
  display: block;
}

.image-container img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.ratio-4-3::before {
  padding-top: 75%;
}

.ratio-3-1::before {
  padding-top: calc(100% / 3);
}

.ratio-2-1::before {
  padding-top: 50%;
}
<div class="wrapper"> <!-- Just to make things a bit smaller -->
  <p>
  Example of an 4:3 aspect ratio, filled by an image with an 1:1 ratio.
  </p>
  <div class="image-container ratio-4-3"> <!-- Lets go for a 4:3 aspect ratio -->
    <img src="https://placekitten.com/1000/1000/" alt="Kittens!" />
  </div>
  <p>
  Just place other block elements around it; it will work just fine.
  </p>
</div>


3

Ben bu sorunu oldukça zaman geçirdim, bu yüzden bunun için bir JS çözüm yaptı. Bu, temel olarak domElement öğesinin yüksekliğini, belirttiğiniz orana göre öğenin genişliğine göre ayarlar. Aşağıdaki gibi kullanabilirsiniz:

<div ratio="4x3"></div>

Öğenin yüksekliğini ayarladığından, öğenin a display:blockveya olması gerektiğini lütfen unutmayın display:inline-block.

https://github.com/JeffreyArts/html-ratio-component


1
Her ne kadar ben görmedim veya kodunu denedim (zaten kendi var) Ben sadece güvenilir çözüm, bir JS komut dosyası sunmak için cevabınızı iptal ettim.
Theo d'Or

Soru özellikle Javascript gerektirmeyen bir çözüm istedi.
Flimm

2

Bunu SVG kullanarak yapabilirsiniz.

Bir duruma bağlıdır, ancak bazılarında gerçekten yararlıdır. Örnek olarak - background-imagesabit yüksekliği ayarlamadan ayarlayabilir veya <iframe>oran 16:9ve position:absolutebenzeri ile youtube gömmek için kullanabilirsiniz .

İçin 3:2oran seti viewBox="0 0 3 2"ve bu kadar.

Misal:

div{
    background-color:red
}
svg{
    width:100%;
    display:block;
    visibility:hidden
}

.demo-1{width:35%}
.demo-2{width:20%}
<div class="demo-1">
  <svg viewBox="0 0 3 2"></svg>
</div>

<hr>

<div class="demo-2">
  <svg viewBox="0 0 3 2"></svg>
</div>


2

Genişlik: 100 piksel ve Yükseklik: 50 piksel (yani, 2: 1) değerini korumak istediğinizi varsayalım.

.pb-2to1 {
  padding-bottom: calc(50 / 100 * 100%); // i.e., 2:1
}


1

Tuval öğesini kullanarak en boy oranını korumanın basit bir yolu.

Eylemde görmek için aşağıdaki div'i yeniden boyutlandırmayı deneyin.

Benim için bu yaklaşım en iyi sonucu verdi, bu yüzden onlardan da yararlanabilmek için başkalarıyla paylaşıyorum.

.cont {
  border: 5px solid blue;
  position: relative;
  width: 300px;
  padding: 0;
  margin: 5px;
  resize: horizontal;
  overflow: hidden;
}

.ratio {
  width: 100%;
  margin: 0;
  display: block;
}

.content {
  background-color: rgba(255, 0, 0, 0.5);
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  margin: 0;
}
<div class="cont">
  <canvas class="ratio" width="16" height="9"></canvas>
  <div class="content">I am 16:9</div>
</div>

Ayrıca dinamik yükseklik ile çalışır!

.cont {
  border: 5px solid blue;
  position: relative;
  height: 170px;
  padding: 0;
  margin: 5px;
  resize: vertical;
  overflow: hidden;
  display: inline-block; /* so the div doesn't automatically expand to max width */
}

.ratio {
  height: 100%;
  margin: 0;
  display: block;
}

.content {
  background-color: rgba(255, 0, 0, 0.5);
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  margin: 0;
}
<div class="cont">
  <canvas class="ratio" width="16" height="9"></canvas>
  <div class="content">I am 16:9</div>
</div>


yup bana yardımcı oldu, şimdi görüntü üst div yüksekliği ayarlamak için kullanabilirsiniz)
Alex

0

Yeni bir çözüm kullandım.

.squares{
  width: 30vw
  height: 30vw

Ana en boy oranına

.aspect-ratio
  width: 10vw
  height: 10vh

Ancak, bu tüm görünüm alanına göredir. Bu nedenle, görünüm alanı genişliğinin% 30'u olan bir div'e ihtiyacınız varsa, bunun yerine 30vw kullanabilirsiniz ve genişliği bildiğiniz için, calc ve vw birimini kullanarak bunları yükseklikte yeniden kullanırsınız.


7
Bu ikinci en yüksek puanlı cevabın ana hatlarıyla belirttiği gibi değil mi?
rnevius


-4

Tüm kap yapısı yüzdeye dayalıysa, bu varsayılan davranış olur, daha spesifik bir örnek verebilir misiniz?

Aşağıda, ana üst hiyerarşinizin tamamı% tabanlıysa, herhangi bir tarayıcı penceresi ayarlaması ek js / css olmadan çalışırsa, bu, mizanpajınızla ilgili bir olasılık değil mi?

<div style="width: 100%;">
   <div style="width: 50%; margin: 0 auto;">Content</div>
</div>

1
Orijinal sorudaki düzenlememe bakın. Bu tekniğin en boy oranını nerede tutacağını, yüksekliğinin değişmeyeceğini görmüyorum.
jackb
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.