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 ...
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 ...
Yanıtlar:
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:
Şimdi bu süslü duyarlı kareleri nasıl yapacağımızı görelim!
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%
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!
Yatay olarak:
Bu oldukça kolaydır, sadece eklemeniz text-align:center
gerekir .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 .square
veya .content
div üzerinde kullanamayız çünkü çatışır, position:absolute;
bu nedenle .content
div 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:
* { box-sizing: border-box; }
.content div içindeki yüksekliği ve genişliği% 100 olarak ayarlamanız gerekir. :)
justify-content: center; align-items: center; flex-flow: column nowrap;
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>
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
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.
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