Duyarlı karelerin ızgarası


170

Duyarlı karelerle nasıl düzen oluşturacağımı merak ediyorum . Her bir kare dikey ve yatay olarak hizalanmış içeriğe sahip olacaktır . Özel örnek aşağıda gösterilmektedir ...

içerikli duyarlı kareler


Büyük cevapları olan soruların, yığın akışının nasıl olması gerektiği konusunda gerçekten bilgiç bir bakış açısına sahip insanlar tarafından rastgele kapatılmasından nefret ediyorum. İyi, kabul edilmiş, onaylanmamış cevapları varsa ... neden kapattınız ??? Karışıklık nerede olacak? Tabii, kendi "duyarlı kareler ızgarası" açıklamak için biraz veya çok fazla gerekebilir, ama bu 400 yaşında bir cevap ile 7 yaşında, 160 + bir soru. Tekrar oy kullanıyorum.
leinaD_natipaC

Yanıtlar:


416

Sen yapabilir kareler duyarlı ızgara Düşey ve yatay olarak birlikte merkezli içeriği yalnızca CSS . Nasıl adım adım bir süreçte açıklayacağım, ancak ilk önce neler başarabileceğinize dair 2 demo var:

Duyarlı 3x3 kare ızgara 3x3 ızgarada duyarlı kare görüntüler

Şimdi bu süslü duyarlı kareleri nasıl yapacağımızı görelim!



1. Duyarlı karelerin yapılması:

Elemanları kare (veya başka bir en / boy oranı) tutmak için hile yüzde kullanmaktır padding-bottom.
Yan not: üst dolgu veya üst / alt kenar boşluğunu da kullanabilirsiniz, ancak öğenin arka planı görüntülenmez.

Üst dolgu ana elemanın genişliğine göre hesaplandığından ( referans için bkz. MDN ), elemanın yüksekliği genişliğine göre değişecektir. Artık en boy oranını genişliğine göre koruyabilirsiniz .
Bu noktada şunları kodlayabilirsiniz:

HTML :

 <div></div>

CSS

div {
    width: 30%;
    padding-bottom: 30%; /* = width for a square aspect ratio */
}

Burada a, basit bir düzen, örneğin yukarıdaki kodu kullanılarak 3 * 3 kare ızgara.

Bu teknikle, başka bir en boy oranı yapabilirsiniz, burada en boy oranına ve% 30 genişliğe göre alt dolgu değerlerini veren bir tablo.

 Aspect ratio  |  padding-bottom  |  for 30% width
------------------------------------------------
    1:1        |  = width         |    30%
    1:2        |  width x 2       |    60%
    2:1        |  width x 0.5     |    15%
    4:3        |  width x 0.75    |    22.5%
    16:9       |  width x 0.5625  |    16.875%




2. Karelere içerik ekleme

Doğrudan karelerin içine içerik ekleyemediğiniz için (yüksekliklerini genişletecek ve kareler artık kareler olmayacak) içlerinde alt öğeler oluşturmanız (bu örnek için div kullanıyorum) position: absolute;ve içeriği içine koymanız gerekir . Bu, içeriği akıştan çıkaracak ve karenin boyutunu koruyacaktır.

position:relative;Ana div'leri eklemeyi unutmayın , böylece mutlak çocuklar ebeveynlerine göre nispeten konumlandırılır / boyutlandırılır.

3x3 kareler ızgarasına biraz içerik ekleyelim:

HTML :

<div class="square">
    <div class="content">
        .. CONTENT HERE ..
    </div>
</div>
... and so on 9 times for 9 squares ...

CSS :

.square {
    float:left;
    position: relative;
    width: 30%;
    padding-bottom: 30%; /* = width for a 1:1 aspect ratio */
    margin:1.66%;
    overflow:hidden;
}

.content {
    position:absolute;
    height:80%; /* = 100% - 2*10% padding */
    width:90%; /* = 100% - 2*5% padding */
    padding: 10% 5%;
}

SONUÇ <- güzelleştirmek için bazı biçimlendirme ile!



3. içeriği merkezi

Yatay olarak:

Bu oldukça kolaydır, sadece eklemeniz text-align:centergerekir .content.
SONUÇ

Dikey hizalama

Bu ciddi bir hal alıyor! Hile kullanmak

display:table;
/* and */
display:table-cell;
vertical-align:middle;

ancak div display:table;üzerinde .squareveya .contentdiv üzerinde kullanamayız çünkü çatışır, position:absolute;bu nedenle .contentdiv içinde iki çocuk yaratmamız gerekir . Kodumuz aşağıdaki gibi güncellenecektir:

HTML :

<div class="square">
    <div class="content">
        <div class="table">
            <div class="table-cell">
                ... CONTENT HERE ...
            </div>
        </div>
    </div>
</div>
... and so on 9 times for 9 squares ...

CSS:

.square {
    float:left;
    position: relative;
    width: 30%;
    padding-bottom : 30%; /* = width for a 1:1 aspect ratio */
    margin:1.66%;
    overflow:hidden;
}

.content {
    position:absolute;
    height:80%; /* = 100% - 2*10% padding */
    width:90%; /* = 100% - 2*5% padding */
    padding: 10% 5%;
}
.table{
    display:table;
    height:100%;
    width:100%;
}
.table-cell{
    display:table-cell;
    vertical-align:middle;
    height:100%;
    width:100%;
}




Şimdi bitirdik ve buradaki sonuca bir göz atabiliriz:

CANLI FULLSCREEN SONUCU

burada düzenlenebilir keman



2
@ d.raev evet. Yüzde dolgu ve kenar boşlukları ebeveynin genişliğine göre hesaplanır. Dolgu geliştiricisi
-TR/

4
Bu harika. Sadece diğerleri için bir uyarı: eğer kullanıyorsanız * { box-sizing: border-box; }.content div içindeki yüksekliği ve genişliği% 100 olarak ayarlamanız gerekir. :)
Rob Flaherty

2
marj değerinin arkasındaki analiz nedir? 5x5 ızgara ayarlamak istersem ne olur?
kiwi1342

2
@ kiwi1342 bir satırdaki tüm kenar boşluklarının + tüm genişliklerin toplamı % 100'e eşit olmalıdır. Böylece 5x5 ızgara için, öğelerin her iki tarafında% 1 kenar boşluklarıyla% 18 genişlik kullanabilirsiniz.
web-tiki

1
Fantastik. Sadece bir adım yukarı: Yatay ve dikey olarak ortalamak için .content'i bir flexbox yapınjustify-content: center; align-items: center; flex-flow: column nowrap;
NonameSL

15

Ekran genişliğine göre kareleri duyarlı hale getiren vw (görünüm genişliği) birimlerini kullanabilirsiniz.

Bunun kısa bir maketi:

html,
body {
  margin: 0;
  padding: 0;
}
div {
  height: 25vw;
  width: 25vw;
  background: tomato;
  display: inline-block;
  text-align: center;
  line-height: 25vw;
  font-size: 20vw;
  margin-right: -4px;
  position: relative;
}
/*demo only*/

div:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  height: inherit;
  width: inherit;
  background: rgba(200, 200, 200, 0.6);
  transition: all 0.4s;
}
div:hover:before {
  background: rgba(200, 200, 200, 0);
}
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>


4
Kullanımı margin-left: -4px;kullanmayın margin-right:-4px. Mincharspace'deki tutarsızlıkla uğraşmayın, ancak bir sarıcı üst yazı tipi boyutunu 0 olarak ayarlayın ve alt öğelere sıfır 1rem(göreceli em) olarak ayarlayın
Roko C. Buljan

9

Kabul edilen cevap harika, ancak bununla yapılabilir flexbox.

BEM sözdizimi ile yazılan ve her satırda 1-10 sütun görüntülenmesini sağlayan bir ızgara sistemi .

Son satır eksikse (örneğin, satır başına 5 hücre göstermeyi seçerseniz ve 7 öğe varsa), sondaki öğeler yatay olarak ortalanır. Sondaki öğelerin yatay hizalamasını kontrol etmek için sınıfın altındaki justify-contentözelliği değiştirmeniz yeterlidir .square-grid.

.square-grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.square-grid__cell {
  background-color: rgba(0, 0, 0, 0.03);
  box-shadow: 0 0 0 1px black;
  overflow: hidden;
  position: relative;
}

.square-grid__content {
  left: 0;
  position: absolute;
  top: 0;
}

.square-grid__cell:after {
  content: '';
  display: block;
  padding-bottom: 100%;
}

// Sizes  Number of cells per row

.square-grid__cell--10 {
  flex-basis: 10%;
}

.square-grid__cell--9 {
  flex-basis: 11.1111111%;
}

.square-grid__cell--8 {
  flex-basis: 12.5%;
}

.square-grid__cell--7 {
  flex-basis: 14.2857143%;
}

.square-grid__cell--6 {
  flex-basis: 16.6666667%;
}

.square-grid__cell--5 {
  flex-basis: 20%;
}

.square-grid__cell--4 {
  flex-basis: 25%;
}

.square-grid__cell--3 {
  flex-basis: 33.333%;
}

.square-grid__cell--2 {
  flex-basis: 50%;
}

.square-grid__cell--1 {
  flex-basis: 100%;
}

Keman: https://jsfiddle.net/patrickberkeley/noLm1r45/3/

Bu, FF ve Chrome'da test edilmiştir.


3
Yine de, yüksekliği düzeltmek için dolgu tabanını kullanıyorsunuz, bu yüzden aslında kabul edilenle aynı cevap. Tek fark, karenin ızgara değil nasıl yapıldığıdır.
extempl

0

Bu çözümü farklı rasyonların duyarlı kutuları için kullanıyorum:

HTML:

<div class="box ratio1_1">
  <div class="box-content">
            ... CONTENT HERE ...
  </div>
</div>

CSS:

.box-content {
  width: 100%; height: 100%;
  top: 0;right: 0;bottom: 0;left: 0;
  position: absolute;
}
.box {
  position: relative;
  width: 100%;
}
.box::before {
    content: "";
    display: block;
    padding-top: 100%; /*square for no ratio*/
}
.ratio1_1::before { padding-top: 100%; }
.ratio1_2::before { padding-top: 200%; }
.ratio2_1::before { padding-top: 50%; }
.ratio4_3::before { padding-top: 75%; }
.ratio16_9::before { padding-top: 56.25%; }

Demoyu JSfiddle.net'te görün


2
cevabınız hakkında daha fazla bilgi vermeniz faydalı olabilir ... hatta bir JSFiddle
Wavesailor
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.