bir div içindeki öğeleri yan yana nasıl eşit olarak dağıtabilirim?


83

Bu bir menü içindir.
Örneğin, hepsinde biraz margin, max-width ve float (sol veya sağ) bulunan 3 açıklıklı bir div öğem var.
Sol taraftan başlayarak konumlandırılmış ve şöyle gidiyor:
[[span1][span2][span3] - lots of free space here].
Bunu şu şekilde eşitlemek istiyorum: Bunu
[[span1] - space - [span2] - space - [span3]]
CSS kullanarak nasıl yapabilirim? Bunun mümkün olmadığından şüpheliyim.
Bir menü öğesi eklediğimde veya çıkardığımda aynı stili korumasını istediğime dikkat edin.
HTML:

<div id="menu">
    <span class="menuitem"></span>
    <span class="menuitem"></span>
    <span class="menuitem"></span>
</div>

CSS:

#menu {
    ...
    width:800px;
}
.menuitem {
    display:block;
    float:left;
    margin-left:25px;
    position:relative;
    min-height:35px;
    max-width:125px;
    padding-bottom:10px;
    text-align:center;
}

1
<span>blok öğe değildir, widthmülk kabul etmemelidir
Marek Sebera

Gerçek kodu sağlayabilir misiniz?
Blazemonger

Yanıtlar:


96

'Eski günlerde' bir tablo kullanırdınız ve menü öğeleriniz, öğe sayısı için genişliğini açıkça belirtmek zorunda kalmadan eşit aralıklarla yerleştirilirdi.

IE 6 ve 7 için değilse (eğer endişeleniyorsanız), o zaman aynısını CSS'de de yapabilirsiniz.

<div class="demo">
    <span>Span 1</span>
    <span>Span 2</span>
    <span>Span 3</span>
</div>

CSS:

div.demo {
    display: table;
    width: 100%;
    table-layout: fixed;    /* For cells of equal size */
}
div.demo span {
    display: table-cell;
    text-align: center;
}

Öğe sayısını ayarlamak zorunda kalmadan.

Olmadan örnek table-layout:fixed- hücreler tam genişliğe eşit olarak dağıtılır, ancak genişlikleri içeriklerine göre belirlendiği için eşit boyutta olmaları gerekmez.

Örnek table-layout:fixed- hücreler, içeriklerine bakılmaksızın eşit boyuttadır. (Bu ekleme için yorumlarda @DavidHerse'e teşekkürler.)

İlk ve son menü öğelerinin sola ve sağa yaslanmış olmasını istiyorsanız, aşağıdaki CSS'yi ekleyebilirsiniz:

div.demo span:first-child {
    text-align: left;
}
div.demo span:last-child {
    text-align: right;
}

3
Bu yöntemle hücreler eşit olarak dağılmaz. Jsfiddle.net/hcrzx adresine bakın . Orta hücre diğer iki hücreden daha uzundur.
Susam Pal

1
@Susam: Doğru, hücrenin genişliği içeriğine göre belirlendiğinden (bir HTML tablosunda olduğu gibi) hücrelerin eşit boyutta olması gerekmez . Bununla birlikte, içeriklerine bağlı olarak ana öğenin tüm genişliği boyunca eşit olarak dağıtıldıkları için (eşit olarak değil) yine de eşit olarak dağıtılmış olarak tanımlanabileceklerini söyleyebilirim . İçeriği ne olursa olsun eşit büyüklükte hücreler istiyorsanız, o zaman betik bir çözüme ihtiyacınız olduğuna bahse girerim.
MrWhite

50

Haklı kullanabilirsiniz.

Bu, diğer yanıtlara benzer, ancak sol ve en sağdaki öğeler eşit aralıklarla yerleştirilmek yerine kenarlarda olacaktır - [a..b..c yerine a ... b ... c.]

<div class="menu">
    <span>1</span>
    <span>2</span>
    <span>3</span>
</div>

<style>
.menu {text-align:justify;}
.menu:after { content:' '; display:inline-block; width: 100%; height: 0 }
.menu > span {display:inline-block} 
</style>

Bir şey, her öğe arasında boşluk bırakmanız gerektiğidir. [Kemana bakın.]

Menü öğelerini satır içi blok olarak ayarlamanın iki nedeni vardır:

  1. Öğe varsayılan olarak bir blok seviyesi öğesiyse (bir gibi <li>), görüntü aynı satırda kalmak için satır içi veya satır içi blok olarak ayarlanmalıdır.
  2. Eleman birden fazla kelimeye ( <span>click here</span>) sahipse , her kelime satır içi olarak ayarlandığında eşit olarak dağıtılacaktır, ancak satır içi bloğa ayarlandığında yalnızca öğeler dağıtılacaktır.

JSFiddle'a bakın

DÜZENLEME:
Artık flexbox geniş bir desteğe sahip olduğuna göre (tümü IE dışı ve IE 10+), "daha iyi bir yol" var.
Yukarıdaki ile aynı eleman yapısını varsayarsak, ihtiyacınız olan tek şey:

<style>
    .menu { display: flex; justify-content: space-between; }
</style>

Dış elemanların da aralıklı olmasını istiyorsanız, sadece boşluk-arasında boşluk-etrafında geçiş yapın.
JSFiddle'a bakın


23

Birisi biraz farklı bir yaklaşım denemek isterse, FLEX'i kullanabilir.

HTML

<div class="test">
    <div>Div 1</div>
    <div>Div 2</div>
    <div>Div 3</div>
    <div>Div 4</div>
</div>

CSS

.test {
    display: flex;
    flex-flow: row wrap;
    justify-content: space-around;
}
.test > div {
    margin-top: 10px;
    padding: 20px;
    background-color: #FF0000;
}

İşte keman: http://jsfiddle.net/ynemh3c2/ ( Div'leri eklemeyi / kaldırmayı da deneyin)

İşte bunu öğrendiğim yer: https://css-tricks.com/snippets/css/a-guide- flexbox /


10

justify-content: space-betweenve display: flexihtiyacımız olan tek şey bu, ancak ilham için @Pratul'a teşekkürler!


Güzel cevap. İpucu: flex-wrap: wrapİçeriği etrafına sarmak için kullanın .
Suyash Gupta

8

Bunu yapmanın hızlı ve kolay yolu budur

<div>
    <span>Span 1</span>
    <span>Span 2</span>
    <span>Span 3</span>
</div>

css

div{
    width:100%;
}
span{
    display:inline-block;    
    width:33%;
    text-align:center;
}

Ardından ayarlamak widthait spanSahip sayısı için s.

Örnek: http://jsfiddle.net/jasongennaro/wvJxD/


1
sooo ... genişliği otomatik olarak ayarlamanın kolay bir yolu yok mu?
jurchiks

width: 33%;yaklaşık alabileceğiniz kadar yakındır, ancak alt öğelerin sayısına değil, üst kapsayıcıya bağlıdır. Alt öğelere (span) göre ayarlanmasını istiyorsanız, muhtemelen JavaScript ile oynamanız gerekecektir.
Shauna

doğru @Shauna. @jurchiks, widths sayısını spans sayısına göre otomatik olarak hesaplayabilirsiniz, ancak bu biraz js gerektirir. Menünüz sık sık değişmiyorsa, ayar yapmak widthsorun olmamalıdır.
Jason Gennaro

@ josh.trow. Benim için bütün gün yavaş geçti.
Jason Gennaro

@Jason - bunu zaten yaptım (PHP dışında; JS'yi yeterince iyi bilmiyorum, belki birisi bana bunu nasıl yapacağımı öğretebilir?). İyi görünüyor, ancak kenar boşlukları bir sorun haline geliyor.
jurchiks

1

Sadece id ile div'i #menuesnek kapsayıcı olarak şu şekilde görüntülemeniz gerekir :

#menu{
    width: 800px;
    display: flex;
    justify-content: space-between;
}

0

Bunu aşağıdaki css kombinasyonu ile yapmayı başardım:

text-align: justify;
text-align-last: justify;
text-justify: inter-word;

0

.container {
  padding: 10px;
}
.parent {
  width: 100%;
  background: #7b7b7b;
  display: flex;
  justify-content: space-between;
  height: 4px;
}
.child {
  color: #fff;
  background: green;
  padding: 10px 10px;
  border-radius: 50%;
  position: relative;
  top: -8px;
}
<div class="container">
  <div class="parent">
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
  </div>
</div>


-1

Satır içi blok öğeleri kullanılan tüm aralıkları yapın. Menü öğelerini içeren aralıklar listesinin altında% 100 genişlikte boş bir uzatma aralığı oluşturun. Ardından, yayılma alanlarını içeren div'i metin hizalı: yaslanmış yapın. Bu daha sonra satır içi blok öğelerini [menü öğeleriniz] eşit olarak dağıtmaya zorlar.

https://jsfiddle.net/freedawirl/bh0eadzz/3/

  <div id="container">

          <div class="social">
            <a href="#" target="_blank" aria-label="facebook-link">
            <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="twitter-link">
                <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="youtube-link">
                <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="pinterest-link">
                 <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="snapchat-link">
                <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="blog-link">
                 <img src="http://placehold.it/40x40">
            </a>

            <a href="#" aria-label="phone-link">
                 <img src="http://placehold.it/40x40">
            </a>
            <span class="stretch"></span>
          </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.