CSS ızgara sarma


126

Medya sorgularını kullanmadan CSS ızgara sargısı yapmak mümkün mü?

Benim durumumda, bir ızgaraya yerleştirilmesini istediğim deterministik olmayan sayıda öğem var ve bu ızgaranın sarılmasını istiyorum. Flexbox'ı kullanarak işleri güvenli bir şekilde yerleştiremiyorum. Ben de bir dizi medya sorgusundan kaçınmak istiyorum.

İşte bazı örnek kodlar :

.grid {
  display: grid;
  grid-gap: 10px;
  grid-auto-flow: column;
  grid-template-columns: 186px 186px 186px 186px;
}

.grid > * {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Ve işte bir GIF resmi:

Gördüğüm şeyin GIF resmi

Bir yan not olarak, eğer biri bana benim gibi tüm öğelerin genişliğini belirlemekten nasıl kaçınabileceğimi söyleyebilirse grid-template-columnsbu harika olur. Çocukların kendi genişliklerini belirlemesini tercih ederim.


2
grid-template-columns: auto auto auto auto;bu durumda çalışıyor mu? =)
Jakub Chlebowicz

Yanıtlar:


219

Gösterimin tekrar numarası olarak ya auto-fillda kullanın .auto-fitrepeat()

repeat( [ <positive-integer> | auto-fill | auto-fit ] , <track-list> )

auto-fill

Tüm auto-filltekrarlama sayısı olarak verilmektedir ızgara kap ilgili eksende belirli bir boyut veya maksimum boyuta sahipse, o zaman tekrar sayısı ızgara da ızgara kabı taşmasına neden mümkün olan en büyük pozitif bir tamsayıdır.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Izgara, kabını taşmadan mümkün olduğu kadar çok izi tekrarlayacaktır.

Otomatik doldurmayı yineleme () gösteriminin yineleme numarası olarak kullanma

Bu durumda, yukarıdaki örnek verildiğinde (resme bakın) , ızgara kabına taşmadan sadece 5 yol sığabilir. Gridimizde sadece 4 öğe vardır, bu nedenle beşincisi kalan alan içinde boş bir iz olarak oluşturulur.

Kalan alanın geri kalanı, parça # 6, açık ızgarayı sonlandırır. Bu, başka bir parkur yerleştirmek için yeterli alan olmadığı anlamına gelir.


auto-fit

auto-fitAnahtar kelime aynı şekilde davranır auto-fillsonra olması dışında ızgara öğesi yerleştirme algoritması kalan alan içinde herhangi bir boş parça ile çöktü edilecektir 0.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Izgara, kabını taşmadan mümkün olduğu kadar çok izi tekrarlayacaktır, ancak boş izler daraltılacaktır 0.

Daraltılmış bir iz, sabit bir iz boyutlandırma işlevine sahip olarak değerlendirilir 0px.

Otomatik sığdırmayı yineleme () gösteriminin yineleme numarası olarak kullanma

auto-fillResim örneğinden farklı olarak , boş beşinci parça daraltılır ve açık ızgara 4. öğeden hemen sonra sona erer.


auto-fill vs auto-fit

İkisi arasındaki fark, minmax()işlev kullanıldığında belirgindir .

Kullanım minmax(186px, 1fr)öğeleri değiştiği 186pxiçin 186pxartı ızgara kap içinde kalan boşluk bir kısmı.

Kullanırken auto-fill, boş izler yerleştirmek için yer kalmadığında öğeler büyüyecektir.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Kullanırken auto-fit, öğeler kalan alanı dolduracak şekilde büyüyecektir çünkü tüm boş parçalar daraltılmıştır 0px.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>


Oyun alanı:

CodePen

Otomatik doldurma izlerini inceleme

otomatik doldurma


Otomatik sığdırma izlerinin incelenmesi

otomatik sığdırma


3
Bir sonraki satırda olanları ortalamanın bir yolu var mı?
kentcdodds

Tıpkı esnek kutuda yaptığınız gibi, display: grideleman kullanımı üzerinejustify-content: center
Spittal

Sevgili @Ricky Nasıl yapılır, böylece minmax'ın ilk özelliği, örn. repeat(auto-fill, minmax(186px, 1fr));piksel değildir, ancak div'in içinde metin olduğu sürece?
mesqueeb

1
@mesqueeb Mümkün değil, kesin bir boyuta ihtiyaç var. Daha fazla ayrıntı için bu cevaba bakabilirsiniz.
Ricky

1
Bir sonraki satıra gitmesi gerektiğinde, yalnızca bir yerine iki öğenin aşağı inmesini sağlamanın bir yolu var mı? Yani 4'ten 2'ye 1 gibi ve 4'ten 3'e 2'ye 1 yok mu?
sammiepls

16

İşlevin içinde auto-fitveya auto-filliçinde olmak istiyorsunuz repeat():

grid-template-columns: repeat(auto-fit, 186px);

minmax()Esnek sütun boyutlarına izin vermek için ayrıca a kullanırsanız, ikisi arasındaki fark belirgin hale gelir :

grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));

Bu, sütunlarınızın 186 pikselden konteynerin tüm genişliği boyunca uzanan eşit genişliğe sahip sütunlara kadar esnek olmasına olanak tanır. auto-fillgenişliğe sığacak kadar sütun oluşturacaktır. Örneğin, beş sütun sığıyorsa, yalnızca dört ızgara öğeniz olmasına rağmen beşinci bir boş sütun olacaktır:

Buraya resim açıklamasını girin

Kullanılması auto-fitgereken her türlü adımı senin germe, boş sütunlar önleyecektir yerine:

Buraya resim açıklamasını girin


7

Şunları arıyor olabilirsiniz auto-fill:

grid-template-columns: repeat(auto-fill, 186px);

Demo: http://codepen.io/alanbuchanan/pen/wJRMox

Mevcut alanı daha verimli kullanmak için minmax, kullanabilir ve autoikinci argüman olarak geçebilirsiniz :

grid-template-columns: repeat(auto-fill, minmax(186px, auto));

Demo: http://codepen.io/alanbuchanan/pen/jBXWLR

Boş sütunları istemiyorsanız, auto-fityerine kullanabilirsiniz auto-fill.


2
Bir sonraki satırda olanları ortalamanın bir yolu var mı?
kentcdodds

3

Ben de benzer bir durum yaşadım. Yaptıklarının yanı sıra, sol veya sağda boş sütunlara izin vermeden sütunlarımı konteynerde ortalamak istedim:

.grid { 
    display: grid;
    grid-gap: 10px;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, minmax(200px, auto));
}

Yeniden "onlar için boş sütunlar için izin vermezken," : Ne demek Do "boş sütunlar izin vermezken, ya onlar için" ( hiççokya )? Veya "onlar için boş sütunlar izin vermezken," (olmadan hiç )? Veya başka bir şey (hesaplamıyor gibi görünüyor)?
Peter Mortensen

1

İşte benim girişimim. Kabartmak için üzgünüm, kendimi ekstra yaratıcı hissediyordum.

Yöntemim div, sabit boyutları olan bir ebeveyndir . Gerisi sadece bu div'in içindeki içeriğe uygun şekilde uyuyor.

Bu , görüntü oranından bağımsız olarak görüntüleri yeniden ölçeklendirecektir . Sert kırpma da olmayacak .

body {
    background: #131418;
    text-align: center;
    margin: 0 auto;
}

.my-image-parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    line-height: 300px; /* Should match your div height */
    text-align: center;
    font-size: 0;
}

/* Start demonstration background fluff */
    .bg1 {background: url(https://unsplash.it/801/799);}
    .bg2 {background: url(https://unsplash.it/799/800);}
    .bg3 {background: url(https://unsplash.it/800/799);}
    .bg4 {background: url(https://unsplash.it/801/801);}
    .bg5 {background: url(https://unsplash.it/802/800);}
    .bg6 {background: url(https://unsplash.it/800/802);}
    .bg7 {background: url(https://unsplash.it/802/802);}
    .bg8 {background: url(https://unsplash.it/803/800);}
    .bg9 {background: url(https://unsplash.it/800/803);}
    .bg10 {background: url(https://unsplash.it/803/803);}
    .bg11 {background: url(https://unsplash.it/803/799);}
    .bg12 {background: url(https://unsplash.it/799/803);}
    .bg13 {background: url(https://unsplash.it/806/799);}
    .bg14 {background: url(https://unsplash.it/805/799);}
    .bg15 {background: url(https://unsplash.it/798/804);}
    .bg16 {background: url(https://unsplash.it/804/799);}
    .bg17 {background: url(https://unsplash.it/804/804);}
    .bg18 {background: url(https://unsplash.it/799/804);}
    .bg19 {background: url(https://unsplash.it/798/803);}
    .bg20 {background: url(https://unsplash.it/803/797);}
/* end demonstration background fluff */

.my-image {
    width: auto;
    height: 100%;
    vertical-align: middle;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
}
<div class="my-image-parent">
    <div class="my-image bg1"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg2"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg3"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg4"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg5"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg6"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg7"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg8"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg9"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg10"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg11"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg12"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg13"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg14"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg15"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg16"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg17"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg18"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg19"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg20"></div>
</div>

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.