Görüntünün yanındaki metni dikey olarak hizalamak istiyor musunuz?


Yanıtlar:


2252

Aslında, bu durumda oldukça basittir: görüntüye dikey hizalama uygulayın. Hepsi tek bir satırda olduğundan, metin değil, hizalamak istediğiniz görüntüdür.

<!-- moved "vertical-align:middle" style from span to img -->
<div>
  <img style="vertical-align:middle" src="https://placehold.it/60x60">
  <span style="">Works.</span>
</div>

FF3'te test edilmiştir.

Artık bu tür bir düzen için flexbox'ı kullanabilirsiniz.

.box {
   display: flex;
   align-items:center;
}
<div class="box">
    <img src="https://placehold.it/60x60">
    <span style="">Works.</span>
</div>


188
"Her şey tek bir satırda olduğundan, gerçekten metin değil, hizalamak istediğiniz görüntüdür." - Hayır, görüntü olduğu yerde iyi. Metnin hizalanmasını istiyoruz. Görüntü değil. - Bunun işe yaradığını görüyorum (bazı durumlarda, örneğin: resimde "şamandıra: sol" kullanmıyorsanız ...), ancak metni fiziksel olarak dikey ortaya taşımak için tuhaf ve sezgisel değil bunun yerine resmin yanındaki bir niteliği uygulamak zorunda kalır.
BrainSlugs83

35
@ BrainSlug83 Kesinlikle tuhaf değil ama yeni gelenlerin bu şekilde nasıl açıldığını görebiliyorum. Varsayılan olarak metin satır tabanına bir resim yerleştirilir. Tek yaptığınız, görüntünün metne göre iliştirildiği yere hareket etmektir. Float: left işlevine gelince, bunu görüntüyü ve metni içeren blokta veya metnin kendisinde yapmalısınız.
jamesrom

14
@ BrainSlugs83 Karşı sezgisel olarak görülebileceğini kabul etti. Biraz zihinsel bir değişim gerektirir, çünkü CSS'ye göre yapmanız gereken şey görüntüyü metne ortalamaktır. Görüntünün metni değil.
Greg Pettit

6
spanYazı tipi boyutunu artırırsanız çalışmaz . Cevabımı gör .
Mori

2
Ancak görüntü boyutunu daha küçük bir boyuta (gibi width:16px;height:16px) ayarlarsanız, görüntünün çok düşük olacağını görebilirsiniz ...
Matthieu Charbonnier

340

Dikey hizalama için bazı basit teknikler:

Tek satır dikey hizalama: orta

Bu kolaydır: metin öğesinin satır yüksekliğini kabınkine eşit olacak şekilde ayarlayın

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

Çok satırlı dikey hizalama: alt

Bir iç div'i kabına göre kesinlikle yerleştirin

<div style="position:relative;width:30px;height:60px;">
  <div style="position:absolute;bottom:0">This is positioned on the bottom</div>
</div>

Çok satırlı dikey hizalama: orta

<div style="display:table;width:30px;height:60px;">
  <div style="display:table-cell;height:30px;">This is positioned in the middle</div>
</div>

Eski IE sürümlerini desteklemeniz gerekiyorsa <= 7

Bunun kartta doğru bir şekilde çalışmasını sağlamak için CSS'yi biraz kesmek zorunda kalacaksınız. Neyse ki, lehimize çalışan bir IE hatası var. Ayar top:50%kabın üzerine ve top:-50%iç div üzerinde, aynı sonucu elde edebilirsiniz. İkisini IE'nin desteklemediği başka bir özelliği kullanarak birleştirebiliriz: gelişmiş CSS seçicileri.

<style type="text/css">
  #container {
    width: 30px;
    height: 60px;
    position: relative;
  }
  #wrapper > #container {
    display: table;
    position: static;
  }
  #container div {
    position: absolute;
    top: 50%;
  }
  #container div div {
    position: relative;
    top: -50%;
  }
  #container > div {
    display: table-cell;
    vertical-align: middle;
    position: static;
  }
</style>

<div id="wrapper">
  <div id="container">
    <div><div><p>Works in everything!</p></div></div>
  </div>
</div>

Değişken konteyner yüksekliği dikey hizalama: orta

Bu çözüm, transform: translateYözelliği kullandığı için diğer çözümlerden biraz daha modern bir tarayıcı gerektirir . ( http://caniuse.com/#feat=transforms2d )

Bir öğeye aşağıdaki 3 CSS satırının uygulanması, üst öğenin yüksekliğine bakılmaksızın öğeyi dikey olarak üst öğesi içinde ortalar:

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

15
display:tableVe display:table-cellCSS seçicilerinin IE7 ve aşağıda, tabii ki, dışında büyük iş. Saçlarımı birkaç saat yırttıktan sonra, hala IE7- kullanan kimseyle başa çıkmam gerekmediğine karar verdim.
banncee

2
display:tableçeşitli tarayıcılarda bazı sınırlamalar vardır (IE11'de max-height, öğe bir tablo hücresinin içindeyse çalışmaz), bu nedenle bazı kenar durumlarda, tablo hücrelerini kullanarak dikey olarak hizalamak iyi bir fikir değildir.
jahu

97

Yaptığınız değişiklik divbir esnek kaba:

div { display:flex; }


Artık tüm içeriğin hizalamalarını ortalamak için iki yöntem var:

Yöntem 1:

div { align-items:center; }

DEMO


Yöntem 2:

div * { margin-top:auto; margin-bottom:auto; }

DEMO


Farklı genişlik ve yükseklik değerlerini imgve farklı yazı tipi boyutu değerlerini deneyin ve spanher zaman kabın ortasında kaldıklarını göreceksiniz.


Metni görüntülerin yanında veya arasında (sayfada yatay olarak) ortalamak için, ayrıca eklemeniz justify-content: center;ve boşluk bırakmanız (<br/> etiketleri kullanmadan) da amanız gerekebilir padding: 1em;. Modern tarayıcı geliştiricileri için harika bir güncelleme.
CSS

Bu iyi çalıştı. Diğer cevapların her birini denedim ve bir dereceye kadar çalışırken benim için işe yaramadı. Hizalamak için yaklaşık 3 satır metin vardı ve bu cevap mükemmel çalıştı. Thanks @Mori
semaj0

87

vertical-align: middleMükemmel ortalanması için her iki öğeye de başvurmanız gerekir.

<div>
  <img style="vertical-align:middle" src="http://lorempixel.com/60/60/">
  <span style="vertical-align:middle">Perfectly centered</span>
</div>

Kabul edilen cevap , simgeyi yanındaki metnin x yüksekliğinin yarısı kadar ortalar ( CSS özelliklerinde tanımlandığı gibi ). Metinde üstte veya altta öne çıkan yükselenler veya alçalmalar varsa, bu yeterince iyi olabilir, ancak biraz görünebilir:

ortalanmış simge karşılaştırması

Solda metin hizalı değil, sağda yukarıda gösterildiği gibi. Bu makalede dikey hizalama hakkında canlı bir demo bulunabilir .

vertical-align: topSenaryoda neden işe yaradığını kimse konuştu mu? Sorudaki görüntü muhtemelen metinden daha uzundur ve bu nedenle çizgi kutusunun üst kenarını tanımlar. vertical-align: topsonra span öğesinde sadece satır kutusunun en üstüne yerleştirir.

Arasındaki davranış temel fark, vertical-align: middleve topkutunun taban çizgisine göre (ki tüm dikey hizalamalar yerine getirmek için gerekli olan her yerde yerleştirilir ve bu sayede oldukça hisseder ilk hareket elemanlarının olduğu tahmin edilemez ) ve satır kutusunun dış sınırları için ikinci nispi (ki daha somut).


1
Üst işleri ve alt işleri fark ettim ama orta değil. Temel olarak "orta", üst ve alt arasında yarım olarak tanımlanmaz. Daha çok, "metinden daha uzun olduğunda, her iki yolu da eşit olarak çıkarın" anlamına gelir. Ve burada dikey hizalamaya ihtiyacınız yok: metnin ortası, sadece görüntü.
Curtis

61

Kabul edilen cevap kullanılan teknik yalnızca tek çizgili metin (çalışır demo ) değil, çok satırlı metin ( demo ) - orada belirtildiği gibi.

Çok çizgili bir metni bir görüntüye dikey olarak ortalamak gerekirse, işte birkaç yol ( Bu CSS-Tricks makalesinden esinlenen Yöntem 1 ve 2 )

Yöntem # 1: CSS tabloları ( FIDDLE ) (IE8 + ( caniuse ))

CSS:

div {
    display: table;
}
span {
    vertical-align: middle;
    display: table-cell;
}

Yöntem # 2: Kaptaki sözde öğe ( FIDDLE ) (IE8 +)

CSS:

div {
   height: 200px; /* height of image */
}

div:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -0.25em; /* Adjusts for spacing */
}

img {
    position: absolute;
}

span {
  display: inline-block;
  vertical-align: middle;
  margin-left: 200px;  /* width of image */
}

Yöntem # 3: Flexbox ( FIDDLE ) ( caniuse )

CSS (Yukarıdaki keman satıcı önekleri içerir):

div {   
    display: flex; 
    align-items: center;    
}
img {
    min-width: 200px; /* width of image */
}

3
Görüntü metinden daha büyükse (yükseklik olarak) yöntemler iyi çalışır. Ancak görüntü daha küçükse, sonuncusu hariç hepsi ne yazık ki başarısız oluyor
Thomas

28

Bu kod IE ve FF'de çalışır:

<div>
  <img style="width:auto; height:auto;vertical-align: middle;">
  <span>It does work on all browsers</span>
</div>

19

Çünkü line-heightbunun çalışması için div yüksekliğine ayarlamanız gerekir


2
Satır yüksekliğini 30 piksel olarak ayarlamayı denedim ve hala çalışmıyor.
sam

12

Temel olarak, CSS3'e inmeniz gerekecek.

-moz-box-align: center;
-webkit-box-align: center;

11

Kayıt için, hizalama "komutları" bir SPAN üzerinde çalışmamalıdır, çünkü satır düzeyinde bir etikettir, blok düzeyinde bir etiket değildir. Hizalama, kenar boşluğu, dolgu vb. Satır içi etiket üzerinde çalışmaz çünkü satır içi nokta metin akışını bozmaz.

CSS, HTML etiketlerini iki gruba ayırır: satır içi ve blok düzeyi. Arama "css blok vs satır içi" ve harika bir makale ortaya çıkıyor ...

http://www.webdesignfromscratch.com/html-css/css-block-and-inline/

(Temel CSS ilkelerini anlamak, bu kadar can sıkıcı olmamasının anahtarıdır)


2
text-alignve vertical-align(üzerindeki uygulama haricinde, tdeski amacıyla elemanları) özel yöneliktir inlineve inline-blockelementler ( span, imgvs.).
Kevin Peno

11

line-height:30pxMetin için görüntüyle hizalanacak şekilde yayılma alanı için kullanın :

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

11

Yapabileceğiniz başka bir şey, metnin line-heightiçindeki görüntülerin boyutuna ayarlanmasıdır <div>. Ardından görüntülerivertical-align: middle;

Bu gerçekten en kolay yol.


3
İçeriğiniz birden çok satıra yayılırsa bunun düzgün çalışmadığını unutmayın.
Ahmad Alfy

ve neden sadece satır yüksekliği değil:% 100?
Jean Paul AKA el_vete

8

İle bir çözüm görmedim marginBu cevapların hiçbirinde henüz , işte bu soruna benim çözümüm.

Bu çözüm yalnızca görüntünüzün genişliğini biliyorsanız çalışır.

HTML

<div>
    <img src="https://placehold.it/80x80">
    <span>This is my very long text what should align. This is my very long text what should align.</span>
</div>

CSS

div {
  overflow:hidden;
}
img {
   width:80px
   margin-right:20px;
   display:inline-block;
   vertical-align:middle;
}
span {
   width:100%;
   margin-right:-100px;
   padding-right:100px;
   display:inline-block;
   vertical-align:middle;
   box-sizing:border-box;
   -moz-box-sizing:border-box;
   -webkit-box-sizing:border-box;
}

1
İşte kesin çözüm. Çok satırlı metinler için de çalışır ... Yukarıda çok satırlılar için uygun değildir.
efirat

6
background:url(../images/red_bullet.jpg) left 3px no-repeat;

Yerine genellikle 3px kullanıyorum top. Bu değeri artırarak / azaltarak, görüntü istenen yüksekliğe değiştirilebilir.


Görüntü boyutunun bilinmediği veya dinamik olduğu durumlarda yardımcı olmaz.
Dan

6

Bu yayılma özelliklerini yazın

span{
    display:inline-block;
    vertical-align:middle;
}

Özellik özelliğini display:inline-block;kullandığınızda kullanın.vertical-align


6

Resmi özelliği inline elementkullanarak ayarlayabilirsinizdisplay

<div>
  <img style="vertical-align: middle; display: inline;" src="https://placehold.it/60x60">
  <span style="vertical-align: middle; display: inline;">Works.</span>
</div>


3

Örneğin, jQuery mobile'daki bir düğmede, görüntüye bu stili uygulayarak biraz değiştirebilirsiniz:

.btn-image {
    vertical-align:middle;
    margin:0 0 3px 0;
}

2

Çok satırlı çözüm:

http://jsfiddle.net/zH58L/6/

<div style="display:table;width:30px;height:160px;">
    <img style="display:table-cell;width:30px;height:60px;padding:50px" src='...' />
    <div style="display:table-cell;height:30px;vertical-align:middle">
      Multiline text centered vertically
    </div>
</div>
<!-- note: img (height + 2x padding) must be equal to root div height -->

Tüm tarayıcılarda ve ie9 + 'da çalışır


2

Kafa karıştırıcı olabilir, katılıyorum. Tablo özelliklerini kullanmayı deneyin. Bu basit CSS hilesini, modals'ı web sayfasının ortasına yerleştirmek için kullanıyorum. Geniş tarayıcı desteğine sahiptir:

<div class="table">
    <div class="cell">
        <img src="..." alt="..." />
        <span>It works now</span>
    </div>
</div>

ve CSS kısmı:

.table { display: table; }
.cell { display: table-cell; vertical-align: middle; }

İstediğiniz gibi çalışması için görüntü ve tablo kabının boyutunu ayarlamanız ve ayarlamanız gerektiğini unutmayın. Zevk almak.


0

Öncelikle satır içi CSS hiç tavsiye edilmez, gerçekten HTML'nizi bozar.

Görüntü ve açıklığı hizalamak için basitçe yapabilirsiniz vertical-align:middle.

.align-middle {
  vertical-align: middle;
}
<div>
  <img class="align-middle" src="https://i.stack.imgur.com/ymxaR.png">
  <span class="align-middle">I'm in the middle of the image! thanks to CSS! hooray!</span>
</div>


2
Satır içi CSS kullanmak için birçok iyi neden vardır. Tepki: Örneğin JS'deki CSS .
jlyonsmith

0

Neden navigasyonunuzun tarayıcısında oluşturulmadığından emin değilim, ancak normalde görüntü ve ortalanmış bir metin içeren bir başlık görüntülemeye çalışırken böyle bir snippet kullanıyorum, umarım yardımcı olur!

https://output.jsbin.com/jeqorahupo

            <hgroup style="display:block; text-align:center;  vertical-align:middle;  margin:inherit auto; padding:inherit auto; max-height:inherit">

            <header style="background:url('http://lorempixel.com/30/30/') center center no-repeat; background-size:auto; display:inner-block; vertical-align:middle; position:relative; position:absolute; top:inherit; left:inherit; display: -webkit-box; display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;-webkit-flex-align: center;-ms-flex-align: center;-webkit-align-items: center;align-items: center;">

            <image src="http://lorempixel.com/60/60/" title="Img title" style="opacity:0.35"></img>
                    http://lipsum.org</header>
                    </hgroup>

-4

Muhtemelen bunu istersiniz:

<div>
   <img style="width:30px; height:30px;">
   <span style="vertical-align:50%; line-height:30px;">Didn't work.</span>
</div>

Diğerlerinin önerdiği gibi, vertical-alignresmi deneyin :

<div>
   <img style="width:30px; height:30px; vertical-align:middle;">
   <span>Didn't work.</span>
</div>

CSS sinir bozucu değil. Sadece belgeleri okumuyorsunuz . P


6
Ve eğer görüntü yüksekliği dinamikse? Vidalıyım :( PS, CSS için dokümantasyon mevcut olması onu sinir bozucu veya kasıtsız yapmıyor.
sam

Anlamsız ve sezgisel mi demek istiyorsun? Görüntünüzün yüksekliğinin sorunuzda hiç dinamik olup olmadığını belirtmediniz, bu yüzden sabit yüksekliğin yapışacağınız şey olduğunu varsaydım.
Strager

2
Bu konuda sam ile birlikteyim. Öğelerin img yüksekliği ne olursa olsun ortalanması gerektiğini varsaydım. Sanırım hepimiz biraz soğumaya dayanabiliriz.
Michael Haren
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.