Bu düzeni elde etmek için aşağıda beş seçenek bulunmaktadır:
- CSS Konumlandırma
- Görünmez DOM Öğeli Flexbox
- Görünmez Sözde Öğeli Flexbox
- Flexbox ile
flex: 1
- CSS Izgara Düzeni
Yöntem 1: CSS Konumlandırma Özellikleri
Uygulamak position: relative
Esnek konteynere .
position: absolute
D öğesine uygulayın .
Şimdi bu ürün kesinlikle esnek kabın içine yerleştirildi.
Daha spesifik olarak, D öğesi belge akışından kaldırılır, ancak en yakın konumlandırılmış atanın sınırları içinde kalır .
CSS ofset özelliklerini kullanın top
ve right
pozisyona bu öğe taşımak.
li:last-child {
position: absolute;
top: 0;
right: 0;
background: #ddd;
}
ul {
position: relative;
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
li {
display: flex;
margin: 1px;
padding: 5px;
background: #aaa;
}
p {
text-align: center;
margin-top: 0;
}
span {
background-color: aqua;
}
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>true center</span></p>
Bu yöntemin bir uyarısı , bazı tarayıcıların mutlak şekilde konumlandırılmış esnek bir öğeyi normal akıştan tamamen kaldırmayabileceğidir. Bu, hizalamayı standart olmayan, beklenmedik bir şekilde değiştirir. Daha fazla ayrıntı: Kesinlikle konumlandırılmış esnek öğe, IE11'de normal akıştan çıkarılmaz
Yöntem 2: Esnek Otomatik Kenar Boşlukları ve Görünmez Esnek Öğe (DOM öğesi)
Kenar boşluklarının bir kombinasyonu ileauto
ve yeni, görünmez bir esnek öğe düzen elde edilebilir.
Yeni esnek öğe, öğe D ile aynıdır ve karşı uca (sol kenar) yerleştirilir.
Daha spesifik olarak, esnek hizalama boş alanın dağıtımına dayandığından, yeni öğe, üç orta kutuyu yatay olarak ortalanmış tutmak için gerekli bir dengelemedir. Yeni öğe, mevcut D öğesi ile aynı genişlikte olmalıdır, aksi takdirde ortadaki kutular tam olarak ortalanmaz.
Yeni öğe ile görünümden kaldırılır visibility: hidden
.
Kısacası:
D
Öğenin bir kopyasını oluşturun .
- Listenin başına yerleştirin.
- Kullanım esnemesine
auto
tutmak için kenar boşluklarını A
, B
ve C
her ikisi ile, merkezli D
elemanları her iki uçtan eşit dengeyi oluşturarak.
- Uygula
visibility: hidden
kopya içinD
li:first-child {
margin-right: auto;
visibility: hidden;
}
li:last-child {
margin-left: auto;
background: #ddd;
}
ul {
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
li {
display: flex;
margin: 1px;
padding: 5px;
background: #aaa;
}
p { text-align: center; margin-top: 0; }
span { background-color: aqua; }
<ul>
<li>D</li><!-- new; invisible spacer item -->
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>true center</span></p>
Yöntem 3: Esnek Otomatik Kenar Boşlukları ve Görünmez Esnek Öğe (sözde öğe)
Bu yöntem # 2'ye benzer, ancak anlamsal olarak daha temiz ve genişliği D
bilinmelidir.
- İle aynı genişlikte bir sözde eleman oluşturun
D
.
- İle kabın başlangıcına yerleştirin
::before
.
- Esnek kullanım
auto
tutmaya marjları A
, B
ve C
sözde ve birlikte mükemmel merkezli D
elemanları her iki ucundan da eşit dengeyi oluşturarak.
ul::before {
content:"D";
margin: 1px auto 1px 1px;
visibility: hidden;
padding: 5px;
background: #ddd;
}
li:last-child {
margin-left: auto;
background: #ddd;
}
ul {
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
li {
display: flex;
margin: 1px;
padding: 5px;
background: #aaa;
}
p { text-align: center; margin-top: 0; }
span { background-color: aqua; }
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>true center</span></p>
Yöntem 4: flex: 1
Sol ve sağ öğelere ekleyin
Yukarıdaki Yöntem # 2 veya # 3 ile başlayarak, eşit dengeyi korumak için sol ve sağ öğeler için eşit genişlik konusunda endişelenmek yerine, yalnızca her birini verin flex: 1
. Bu, ikisini de kullanılabilir alanı tüketmeye zorlar ve böylece ortadaki öğeyi ortalar.
Daha sonra display: flex
içeriklerini hizalamak için tek tek öğeler ekleyebilirsiniz .
Bu yöntemi şununla kullanmak hakkında min-height
NOT : Şu anda Chrome, Firefox, Edge ve muhtemelen diğer tarayıcılarda, kısaltma kuralı şunaflex: 1
ayrılıyor:
flex-grow: 1
flex-shrink: 1
flex-basis: 0%
Bu yüzde birimi (%) ile flex-basis
zaman nedenleri bu yöntem kırmak için min-height
kap üzerinde kullanılır. Bunun nedeni, genel bir kural olarak, çocuklar üzerindeki yüzde yüksekliklerinin, üst öğe üzerinde açık bir height
özellik ayarı gerektirmesidir .
Bu, 1998 yılına kadar uzanan eski bir CSS kuralıdır ( CSS Seviye 2 ) ve birçok tarayıcıda bir dereceye kadar hala yürürlüktedir. Tüm ayrıntılar için buraya ve buraya bakın .
İşte user2651804 tarafından yorumlarda yayınlanan sorunun bir örneği :
#flex-container {
display: flex;
flex-direction: column;
background: teal;
width: 150px;
min-height: 80vh;
justify-content: space-between;
}
#flex-container>div {
background: orange;
margin: 5px;
}
#flex-container>div:first-child {
flex: 1;
}
#flex-container::after {
content: "";
flex: 1;
}
<div id="flex-container">
<div>very long annoying text that will add on top of the height of its parent</div>
<div>center</div>
</div>
Çözüm, yüzde birimini kullanmamaktır. Deneyin px
ya da hiç bir şey yapmayın ( bu, belli başlı tarayıcılardan en azından bazılarının herhangi bir nedenle bir yüzde birimi eklemesine rağmen , spesifikasyonun aslında önerdiği şeydir ).
#flex-container {
display: flex;
flex-direction: column;
background: teal;
width: 150px;
min-height: 80vh;
justify-content: space-between;
}
#flex-container > div {
background: orange;
margin: 5px;
}
/* OVERRIDE THE BROWSER SETTING IN THE FLEX PROPERTY */
#flex-container > div:first-child {
flex: 1;
flex-basis: 0;
}
#flex-container::after {
content: "";
flex: 1;
flex-basis: 0;
}
/* OR... JUST SET THE LONG-HAND PROPERTIES INDIVIDUALLY
#flex-container > div:first-child {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
#flex-container::after {
content: "";
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
*/
<div id="flex-container">
<div>very long annoying text that will add on top of the height of its parent</div>
<div>center</div>
</div>
Yöntem # 5: CSS Izgara Düzeni
Bu, en temiz ve en etkili yöntem olabilir. Mutlak konumlandırmaya, sahte öğelere veya diğer bilgisayar korsanlığına gerek yoktur.
Birden çok sütun içeren bir ızgara oluşturun. Ardından, öğelerinizi orta ve son sütunlara yerleştirin. Temel olarak, ilk sütunu boş bırakın.
ul {
display: grid;
grid-template-columns: 1fr repeat(3, auto) 1fr;
grid-column-gap: 5px;
justify-items: center;
}
li:nth-child(1) { grid-column-start: 2; }
li:nth-child(4) { margin-left: auto; }
/* for demo only */
ul { padding: 0; margin: 0; list-style: none; }
li { padding: 5px; background: #aaa; }
p { text-align: center; }
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>| true center |</span></p>