CSS, kayan div'leri dikey olarak hizalayın


90

Yan yana duran 2 div içeren bir div (#wrapper) var.

Sağ div'in dikey olarak hizalanmasını istiyorum. Dikey hizalamayı denedim: ana sarmalayıcımda ortayı denedim ama çalışmıyor. Beni deli ediyor!

Umarım birisi yardım edebilir.

http://cssdesk.com/LWFhW

HTML:

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS:

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}

Yanıtlar:


67

Yüzen öğeler konusunda hiç şansınız yok. Dikey hizalamaya uymazlar,

display:inline-blockbunun yerine ihtiyacınız var :

http://cssdesk.com/2VMg8

DİKKAT


display: inline-block;Öğeler arasındaki beyaz boşluğu gerçek beyaz boşluk olarak yorumladığından dikkatli olun . Yaptığı gibi görmezden display: blockgelmez.

Bunu tavsiye ederim:

Set font-sizeiçeren elemanının 0(sıfır) ve reset font-sizeelemanları böylece gibi içinde gerekli değere

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

Burada bir gösterime bakın: http://codepen.io/HerrSerker/pen/mslay


CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  

# Sarıcı yüksekliği sabitse bu işe yaramaz. # Right-div , sarmalayıcı öğesine göre değil , # left-div'e göre ortalanır . ( öznitelik kümesine sahip inline-blockbir satır içi gibi davranmasını sağlar )imgalign
Costa

@Costa Olması gereken yol bu, bence.
yunzen

ne şekilde olması gerektiği önemli değil, bir kayan öğe kullanmanız GEREKEN birçok durum vardır ve CSS'de bir şeyler yapmanın her zaman bir yolu vardır. her zaman. en basit durumda, kayan metnin dikey hizalaması: jsbin.com/UWeB/1/edit
vsync

11
ancak çözümünüz de işe yaramayacak, çünkü sadece kayar nokta kullanmamaya karar veremezsiniz ... asıl mesele, kayar sayıları kullanırken bir şekilde dikey hizalamaktır.
vsync

2
Demek istediğim, bazen satır içi engellemenin bir seçenek olmadığı ve Google'dan bu sayfaya gelebilecek diğerlerine yardım etmek için bir kullanım durumu sağlamasıydı. Kaba olmaya gerek yoktu.
Jamie Barker

21

Bunu ekran tablosu ve ekran tablo hücresi ile oldukça kolay bir şekilde yapabilirsiniz.

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

DÜZENLEME: Sizin için CSS Masasında gerçekten hızlı bir şekilde uğraştı - http://cssdesk.com/RXghg

BAŞKA BİR DÜZENLEME: Flexbox'ı kullanın. Bu işe yarayacak ancak oldukça modası geçmiş - http://www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}

1
Merhaba SpaceBeers. Sağ div'in taşmasını gizlediğim için öneriniz benim için çalışmıyor (kodu css masasına ekledim). Çözümünüzle taşma gizli değil, div genişliğini artırıyor ...
Marc

11

Bunun eski bir soru olduğunun farkındayım, ancak kayan dikey hizalama sorununa bir çözüm göndermenin faydalı olacağını düşündüm.

Yüzen olmasını istediğiniz içeriğin etrafında bir sarmalayıcı oluşturarak, içeriğinizi sarmalayıcı içinde dikey olarak hizalamak için :: after veya :: before sözde seçicileri kullanabilirsiniz. Bu içeriğin boyutunu, hizalamayı etkilemeden istediğiniz kadar ayarlayabilirsiniz. Sadece yakalamak sargı% 100 dolma yüksekliği olmasıdır kendi kap.

http://jsfiddle.net/jmdrury/J53SJ/

HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}

Neyin peşinde olduğunuzu bilmiyorum, ancak centeredsınıfı sildikten ve bu CSS'den birçok gereksiz şeyi temizledikten sonra , dikey hizalamayı hala iyi yapıyor, sadece (biçimlendirme kaybı için üzgünüm! ...):div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz.


3

Şamandıra kullanmaktan kaçınmak için elimden geleni yapıyorum ... ama - gerektiğinde, aşağıdaki satırları kullanarak dikey olarak ortaya hizalıyorum:

position: relative;
top: 50%;
transform: translateY(-50%);

-1

Değişikliklerimin tek dezavantajı, belirli bir div yüksekliğinizin olması ... Bunun sizin için bir sorun olup olmadığını bilmiyorum.

http://cssdesk.com/kyPhC


1
Merhaba Sean. Teşekkürler ama esnek bir çözüm kullanmaya çalışıyorum ve bu tür bir çözümden kaçınmayı umuyorum ...
Marc
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.