İki satır içi bloğu aynı satır üzerinde sola ve sağa hizalayın


113

İki satır içi bloğu nasıl hizalayabilirim ki biri solda, diğeri sağda aynı satırda olacak şekilde? Bu neden bu kadar zor? Bunu başarmak için aralarındaki boşluğu tüketebilecek LaTeX'in dolgusu gibi bir şey var mı?

Yüzer sayı kullanmak istemiyorum çünkü satır içi bloklarla taban çizgilerini sıralayabilirim. Ve pencere her ikisi için çok küçük olduğunda, satır içi bloklarla metin hizalamasını merkeze değiştirebilirim ve bunlar birbirinin üzerine ortalanır. Göreli (üst) + Mutlak (öğe) konumlandırma, kayan konumların yaptığı gibi aynı sorunlara sahiptir.

HTML5:

<header>
    <h1>Title</h1>
    <nav>
        <a>A Link</a>
        <a>Another Link</a>
        <a>A Third Link</a>
    </nav>
</header>

Css:

header {
    //text-align: center; // will set in js when the nav overflows (i think)
}

h1 {
    display: inline-block;
    margin-top: 0.321em;
}

nav {
    display: inline-block;
    vertical-align: baseline;
}

Birbirlerinin yanıbaşındalar, ama ben navsağda olmasını istiyorum .

bir diyagram


1
AFAIK bunu çözmenin tek yolu şamandıralar veya mutlak konumlandırma kullanmaktır. Navigasyonda kenar boşluğunu kullanarak aynı temel konumu elde edebilirsiniz.
powerbuoy

Sadece margin-top ve floats kullanın. Bunu ya da mutlak konumlandırma olmadan yapmak mümkün değil.
jdhartley

Görüntü portunun boyutuna bağlı olarak css'yi değiştirmek için css medya sorgularını kullanın. Her iki kullanabilir position: absoluteveinline-block
elclanrs

Yanıtlar:


147

Düzenleme: Bu soruyu cevapladığımdan bu yana 3 yıl geçti ve sanırım daha modern bir çözüme ihtiyaç var, mevcut olanı yapsa da :)

1. Flexbox

Açık farkla en kısa ve en esnek olanıdır. display: flex;Üst kapsayıcıya uygulayın ve alt öğelerinin yerleşimini şu şekilde ayarlayın justify-content: space-between;:

.header {
    display: flex;
    justify-content: space-between;
}

Çevrimiçi olarak buradan görülebilir - http://jsfiddle.net/skip405/NfeVh/1073/

Bununla birlikte, flexbox desteğinin IE10 ve daha yeni olduğunu unutmayın. IE 9 veya daha eski sürümleri desteklemeniz gerekiyorsa aşağıdaki çözümü kullanın:

2. text-align: justifyTekniği burada kullanabilirsiniz .

.header {
    background: #ccc; 
    text-align: justify; 

    /* ie 7*/  
    *width: 100%;  
    *-ms-text-justify: distribute-all-lines;
    *text-justify: distribute-all-lines;
}
 .header:after{
    content: '';
    display: inline-block;
    width: 100%;
    height: 0;
    font-size:0;
    line-height:0;
}

h1 {
    display: inline-block;
    margin-top: 0.321em; 

    /* ie 7*/ 
    *display: inline;
    *zoom: 1;
    *text-align: left; 
}

.nav {
    display: inline-block;
    vertical-align: baseline; 

    /* ie 7*/
    *display: inline;
    *zoom:1;
    *text-align: right;
}

Çalışma örneği burada görülebilir: http://jsfiddle.net/skip405/NfeVh/4/ . Bu kod, IE7 ve üstünden çalışır

HTML'deki satır içi blok öğeler boşlukla ayrılmamışsa, bu çözüm işe yaramaz - bkz. Örnek http://jsfiddle.net/NfeVh/1408/ . Javascript ile içerik eklediğinizde bu bir durum olabilir.

IE7'yi umursamıyorsak, basitçe star-hack özelliklerini atlayın. İşaretlemenizi kullanan çalışma örneği burada - http://jsfiddle.net/skip405/NfeVh/5/ . Sadece header:afterparçayı ekledim ve içeriği gerekçelendirdim.

afterSözde eleman ile eklenen fazladan boşluk sorununu çözmek font-sizeiçin, ana eleman için 0'ı ayarlama ve alt elemanlar için 14px demek için geri sıfırlama gibi bir hile yapılabilir . Bu numaranın çalışan örneği burada görülebilir: http://jsfiddle.net/skip405/NfeVh/326/


1
Yine de afişin daha uzun olmasını engellemenin bir yolu var mı? Bunun nasıl çalıştığını anlıyorum, bu yüzden olmadığını varsayıyorum.
mk12

1
İçeriğinizi javascript ile oluşturuyorsanız, bu çözümün yalnızca öğeler arasında boşluk varsa işe yarayacağını unutmayın. Sol / sağ öğeler arasına bir metin düğümü eklemeniz gerekecek, aksi takdirde her ikisi de sola yapışacaktır.
Stephen Nelson

1
Kodunuzu buraya da yapıştırır mısınız? Dış yerlere olan bağlantıların bir noktada ölme alışkanlığı vardır ve bu olursa, aksi takdirde faydalı olan bu cevap aniden işe yaramaz hale gelir.
VEYA Mapper

5
@ ValerioColtrè Boş alanın bu yaklaşımla ilgili en (ve muhtemelen, tek!) Can sıkıcı şey olduğuna katılıyorum. Açıkça yönetmek font-sizeoldukça istenmeyen bir durumdur. Farklı bir çözüm öneriyorum. .header:afterDekoratörün, eşit bir yükseklik satırı eklediğine dikkat edin font-size. Neyse ki bunun ne kadar olduğunu biliyoruz. Aynen öyle 1em! Yani, kurtarmaya negatif marjlar ! Bu keman nasıl olduğunu gösteriyor .
Domi

1
@ skip405 Not: sarmalayıcı öğesinde (başlık) satır yüksekliğini 0 olarak ayarlamak ve sözde elemanın dikey hizalamasını sabitlemek (dikey hizalama: üst, diyelim) fazladan boşluk sorununu çözebilir. Elbette, ana elemanlarda satır yüksekliğini yeniden ayarlamamız gerekiyor, ancak çoğu durumda daha kolay olabilir. jsfiddle.net/bencergazda/3gL8153n/7
bencergazda

5

@ Skip405'in cevabından yararlanarak, bunun için bir Sass karışımı yaptım:

@mixin inline-block-lr($container,$left,$right){
    #{$container}{        
        text-align: justify; 

        &:after{
            content: '';
            display: inline-block;
            width: 100%;
            height: 0;
            font-size:0;
            line-height:0;
        }
    }

    #{$left} {
        display: inline-block;
        vertical-align: middle; 
    }

    #{$right} {
        display: inline-block;
        vertical-align: middle; 
    }
}

3 parametre kabul eder. Kap, sol ve sağ eleman. Örneğin, soruya uyması için şu şekilde kullanabilirsiniz:

@include inline-block-lr('header', 'h1', 'nav');

3

Şamandıra kullanmak istemiyorsanız, gezinme bölümünüzü kaydırmanız gerekecek:

<header>
<h1>Title</h1>
<div id="navWrap">
<nav>
    <a>A Link</a>
    <a>Another Link</a>
    <a>A Third Link</a>
</nav>
</div>
</header>

... ve biraz daha spesifik css ekleyin:

header {
//text-align: center; // will set in js when the nav overflows (i think)
width:960px;/*Change as needed*/
height:75px;/*Change as needed*/
}

h1 {
display: inline-block;
margin-top: 0.321em;
}

#navWrap{
position:absolute;
top:50px; /*Change as needed*/
right:0;
}

nav {
display: inline-block;
vertical-align: baseline;
}

Biraz daha yapman gerekebilir ama bu bir başlangıç.


1

Ekran çok küçükken işleri ortalamak için JavaScript kullanıyorsanız (başlığınıza ilişkin yorumunuza göre), neden JavaScript ile kayan / kenar boşluklarını geri almayasınız ve kayan ve kenar boşluklarını normal şekilde kullanmayasınız.

Hatta kullandığınız JavaScript miktarını azaltmak için CSS medya sorgularını bile kullanabilirsiniz.


Sanırım henüz bunu düşünmüyordum, bu şekilde daha kolay olacak gibi görünüyordu. Ama görünüşe göre değil. Javascript'ten sonraki satıra atlayarak nav'a nasıl bağlanacağıma dair herhangi bir ipucu var mı?
mk12

Ahh, bunun için medya sorgularını kullanabilirim! Bunların yeniden boyutlandırmada değil, yalnızca başlangıçta kullanıldığını sanıyordum. Teşekkürler.
mk12

1

Sanırım buna olası bir çözüm kullanmak display: table:

.header {
  display: table;
  width: 100%;
  box-sizing: border-box;
}

.header > * {
  display: table-cell;
}

.header > *:last-child {
  text-align: right;  
}

h1 {
  font-size: 32px;
}

nav {
  vertical-align: baseline;
}

JSFiddle: http://jsfiddle.net/yxxrnn7j/1/



0

Orada ebeveynlerin sol orta ve sağında gösteriliyor. 3 öğeden daha fazlasına sahipseniz, onlar için nth-child () kullanın.

görüntü açıklamasını buraya girin

HTML örneği:

<body>
    <ul class="nav-tabs">
        <li><a  id="btn-tab-business" class="btn-tab nav-tab-selected"  onclick="openTab('business','btn-tab-business')"><i class="fas fa-th"></i>Business</a></li>
        <li><a  id="btn-tab-expertise" class="btn-tab" onclick="openTab('expertise', 'btn-tab-expertise')"><i class="fas fa-th"></i>Expertise</a></li>
        <li><a  id="btn-tab-quality" class="btn-tab" onclick="openTab('quality', 'btn-tab-quality')"><i class="fas fa-th"></i>Quality</a></li>
    </ul>
</body>

CSS örneği:

.nav-tabs{
  position: relative;
  padding-bottom: 50px;
}

.nav-tabs li {
  display: inline-block;  
  position: absolute;
  list-style: none;
}
.nav-tabs li:first-child{
  top: 0px;
  left: 0px;
}
.nav-tabs li:last-child{
  top: 0px;
  right: 0px;
}
.nav-tabs li:nth-child(2){
  top: 0px;
  left: 50%;
  transform: translate(-50%, 0%);
}

-1

float: right ve h1 float: left verin ve clear: ikisinin arkasına bir eleman koyun.


8
" Şamandıra kullanmak istemiyorum "
powerbuoy

@powerbuoy komik sonunda float'larla çözümü seçti, değil mi?
Itay Moav -Malimovka

@ İtalya: Sadece mümkün olan tek yol olduğunu düşündüğüm için - kabul edilen cevabımı değiştirdim.
mk12

-1

Her iki öğe için de kullanın

display: inline-block;

'nav' öğesi kullanımı için

float: right;

2
Şamandıra için sargı kullanılamaz.
Ievgen Naida
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.