Div bloğunun içindeki CSS orta metni (yatay ve dikey)


862

( Ve ) diviçin bir kümem var ve içinde bazı metinler var.display:block90px heightwidth

Metnin ortada hem dikey hem de yatay olarak hizalanmasını istiyorum.

Denedim text-align:center, ancak yatay kısmı yapmıyor, bu yüzden denedim vertical-align:middle, ama işe yaramadı.

Herhangi bir fikir?


25
Yani text-align:center"dikey kısmı" yapmıyor musunuz?
nonopolarite

2
Sonunda, göreceli boyutlarda ve sabit yüksekliklerle çalışan bir çözüm buldum: stackoverflow.com/a/16195362/1301331
cirrus

3
Orta / orta elemanların nasıl ortalanacağını bilmek çok önemlidir. Aşağıdaki belge çok net bir resim vermiştir. w3.org/Style/Examples/007/center.en.html
shibualexis

Div'lerde nesneleri dikey, yatay veya her iki şekilde (orta CSS) ortalamak için iki basit yöntem şunlardır: stackoverflow.com/a/31977476/3597276
Michael Benjamin

Yanıtlar:


1385

Bir metin ve / veya resim satırı ise, yapılması kolaydır. Sadece kullan:

text-align: center;
vertical-align: middle;
line-height: 90px;       /* The same as your div height */

Bu kadar. Birden fazla satır olabilirse, o zaman biraz daha karmaşıktır. Ancak http://pmob.co.uk/ adresinde çözümler var . "Dikey hizalama" yı arayın.

Kesmek veya karmaşık div'ler eklemek eğiliminde oldukları için ... Bunu yapmak için genellikle tek hücreli bir tablo kullanıyorum ... mümkün olduğunca basit hale getirmek için.


2020 için güncelleme:

Internet Explorer 10 gibi daha önceki tarayıcılarda çalışmasını gerektirmedikçe, flexbox'ı kullanabilirsiniz. O olduğu yaygın tüm güncel büyük tarayıcılar tarafından desteklenen . Temel olarak, kabın ana ve çapraz ekseni boyunca merkezleme ile birlikte esnek bir konteyner olarak belirtilmesi gerekir:

#container {
  display: flex;
  justify-content: center;
  align-items: center;
}

Çocuk için "esnek öğe" olarak adlandırılan sabit bir genişlik belirtmek için:

#content {
  flex: 0 0 120px;
}

Örnek: http://jsfiddle.net/2woqsef1/1/

İçeriği daraltmak için, daha da basittir: flex: ...satırı esnek öğeden çıkarın ve otomatik olarak daraltılır.

Örnek: http://jsfiddle.net/2woqsef1/2/

Yukarıdaki örnekler, MS Edge ve Internet Explorer 11 dahil olmak üzere büyük tarayıcılarda test edilmiştir.

Özelleştirmeniz gereken bir teknik not: esnek öğenin içinde, bu esnek öğe esnek bir kap olmadığından, CSS'nin eski esnek olmayan kutusu beklendiği gibi çalışır. Ancak, mevcut esnek kaba ek bir esnek öğe eklerseniz, iki esnek öğe yatay olarak yerleştirilir. Dikey olarak yerleştirmek flex-direction: column;için esnek konteynere ekleyin . Esnek bir kap ve onun yakın alt öğeleri arasında böyle çalışır .

Merkezlemeyi yapmanın alternatif bir yöntemi vardır: centeresnek kabın ana ve çapraz eksenindeki dağılımı belirtmek yerine, bunun yerine margin: autodört yöndeki tüm fazladan yer kaplaması için esnek öğeyi ve eşit dağıtılmış kenar boşluklarını belirtmek esnek öğeyi her yöne ortalayacak. Bu, birden fazla esnek öğenin olması dışında çalışır. Ayrıca, bu teknik MS Edge üzerinde çalışır, ancak Internet Explorer 11 üzerinde çalışmaz.


2016/2017 Güncellemesi:

Daha yaygın olarak yapılabilir transformve Internet Explorer 10 ve Internet Explorer 11 gibi eski tarayıcılarda bile iyi çalışır.

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

Örnek: https://jsfiddle.net/wb8u02kL/1/

Genişliği küçültmek için:

Yukarıdaki çözüm, içerik alanı için sabit bir genişlik kullanmıştır. Büzülme ile sarılmış bir genişlik kullanmak için

position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

Örnek: https://jsfiddle.net/wb8u02kL/2/

Internet Explorer 10 desteği gerekiyorsa, flexbox çalışmaz ve yukarıdaki yöntem ve line-heightyöntem çalışır. Aksi takdirde, flexbox işi yapar.


58
Şimdi bunun display: table-celliçin bir mülk var, FYI. Bunu kullanarak eleman bir tablo hücresi gibi davranır ve sağlarvertical-align: middle;
Shauna

1
font:Bunlarla kullanıyorsanız , line-yüksekliğin önüne koyduğunuzdan emin olun`.
user1135469

4
Div <br/> öğeler içerdiğinde, bu amaçlandığı gibi çalışmayabilir.
Martin Meeser

7
% Olarak boyum ne olur?
CandleCoder

1
bu yaklaşımla metin metninin bir satırda olması gerekir, aksi takdirde ilk önce 90 pikselin altında ikinci satırınız olur.
Tomasz Mularczyk

454

2014'ten itibaren yaygın teknikler:


  • Yaklaşım 1 - transform translateX/ translateY:

    Burada Örnek / Tam Ekran Örneği

    In desteklenen tarayıcılar (çoğu), kullanabilirsiniz top: 50%/ left: 50%birlikte translateX(-50%) translateY(-50%)yatay elemanı ortalamak / dinamik dikey için.

    .container {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-50%);
    }

  • Yaklaşım 2 - Flexbox yöntemi:

    Burada Örnek / Tam Ekran Örneği

    In desteklenen tarayıcılar , set displayhedeflenen için elemanın flexve kullanım align-items: centerdikey merkezleme ve justify-content: centeryatay merkezleme için. Ek tarayıcı desteği için satıcı önekleri eklemeyi unutmayın ( örneğe bakın ).

    html, body, .container {
        height: 100%;
    }
    .container {
        display: flex;
        align-items: center;
        justify-content: center;
    }

  • Yaklaşım 3 - table-cell/ vertical-align: middle:

    Burada Örnek / Tam Ekran Örneği

    Bazı durumlarda, html/ bodyöğesinin yüksekliğinin olarak ayarlandığından emin olmanız gerekir 100%.

    Dikey hizalama için, ebeveyn elemanın set width/ heightetmek 100%ve ekleyin display: table. Sonra çocuk elemanı için, değiştirmek displayiçin table-cellve ekleyin vertical-align: middle.

    Yatay merkezleme için, text-align: centermetni ve diğer alt inlineöğeleri ortalamak için ekleyebilirsiniz . Alternatif olarak, margin: 0 autoöğenin blockdüz olduğunu varsayarak kullanabilirsiniz .

    html, body {
        height: 100%;
    }
    .parent {
        width: 100%;
        height: 100%;
        display: table;
        text-align: center;
    }
    .parent > .child {
        display: table-cell;
        vertical-align: middle;
    }

  • Yaklaşım 4 - Kesinlikle 50%yer değiştirme ile üstten yerleştirilmiş :

    Burada Örnek / Tam Ekran Örneği

    Bu yaklaşım, metnin bilinen bir yüksekliğe sahip olduğunu varsayar - bu örnekte 18px. Sadece öğeyi kesinlikle 50%üst öğeye göre üstten konumlandırın . margin-topBu durumda, öğenin bilinen yüksekliğinin yarısı olan negatif bir değer kullanın -9px.

    html, body, .container {
        height: 100%;
    }
    .container {
        position: relative;
        text-align: center;
    }
    .container > p {
        position: absolute;
        top: 50%;
        left: 0;
        right: 0;
        margin-top: -9px;
    }

  • Yaklaşım 5 - line-heightYöntem (En az esnek - önerilmez):

    Buraya Örnek

    Bazı durumlarda, üst elemanın sabit bir yüksekliği olacaktır. Dikey merkezleme için, tek yapmanız gereken line-heightalt öğe üzerinde üst öğenin sabit yüksekliğine eşit bir değer ayarlamaktır .

    - bu çözüm bazı durumlarda çalışsa da, 's değerinde metnin birden fazla satır varken o işe yaramaz belirterek böyle .

    .parent {
        height: 200px;
        width: 400px;
        text-align: center;
    }
    .parent > .child {
        line-height: 200px;
    }

Yöntem 4 ve 5 en güvenilir yöntem değildir. İlk 3'ten biriyle git.


8
Kapsamlı bir cevap için +1. Şahsen ilk yöntemi tercih ediyorum çünkü yöntem 2 daha az destek içeriyor ve table-cellmümkün olduğunca kaçınmayı seviyorum .
Harry

4
2. Flexbox yöntemi, .containers üst öğesi mutlaksa çalışan tek yöntemdir. 1. yöntemi ebeveyn. Mutlak .container nedeniyle küçültmek yapar ve 3. yöntemi .parent mutlak pozisyonu iken sadece işe yaramadı.
Jānis Gruzis

Flex, ipad krom tarayıcıda dikey ortalamalı çok satırlı metin için çalıştı.
bob

7
Flexbox yöntemi partinin en iyisidir.
rorykoehler

The kaydırılabilir olduğunda Yaklaşım1 benim için başarısız.
Vishal Gulati

78

Flexbox / CSS kullanma:

<div class="box">
    <p>&#x0D05;</p>
</div>

CSS:

.box{
    display: flex;
    justify-content: center;
    align-items: center;
}

Hızlı İpucu'ndan Alınan Öğeleri Dikey ve Yatay Ortalamanın En Kolay Yolu


4
Dikkat: IE'de çalışmaz. Eklemeniz gerekecek display: -ms-flexbox; -ms-flex-align: center; -ms-flex-pack: center.
Florian Wendelborn

metin gibi öğeler text-align:centeriçin ekleyin inline-.

Flexbox'ın IE 10 ve 11'de en azından kısmi desteğe sahip olduğunu ve caniuse'a göre kullanıcıların% 97'sinde çalıştığını unutmayın . Tarayıcı desteğinin artık buna karşı bir tartışma olduğunu düşünmüyorum.
Félix Gagnon-Grenier

28

display: table-cell;Bu div için CSS içeriğinize satır ekleyin .

Sadece tablo hücreleri desteklemektedir vertical-align: middle;, ancak div'a [tablo-hücre] tanımını verebilirsiniz ...

Canlı bir örnek burada: http://jsfiddle.net/tH2cc/

div{
    height: 90px;
    width: 90px;
    text-align: center;
    border: 1px solid silver;
    display: table-cell; // This says treat this element like a table cell
    vertical-align:middle; // Now we can center vertically like in a TD
}

1
positionMutlak veya sabitse bu çalışmaz . Bakınız: jsfiddle.net/tH2cc/1636
Aaron Mason

16

İçeriğini yatay ve dikey olarak ortalamak için bir kap için her zaman aşağıdaki CSS'yi kullanırım.

display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

Burada iş başında görün: https://jsfiddle.net/yp1gusn7/


3
^ standartlar neden önemlidir
Florian Wendelborn


16

Bu CSS sınıfını hedeflenen <div> öğesine verin:

.centered {
  width: 150px;
  height: 150px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  background: red; /* Not necessary just to see the result clearly */
}
<div class="centered">This text is centered horizontally and vertically</div>


2
Gerçekten, ve css ızgara da var :) Bu müfredatı öneririm .
Aminu Kano

9

Üst öğedekiflex özelliği kullanabilir ve özelliği alt öğelere divekleyebilirsiniz margin:auto:

.parent {
    display: flex;
    /* You can change this to `row` if you want the items side by side instead of stacked */
    flex-direction: column;
}

/* Change the `p` tag to what your items child items are */
.parent p {
    margin: auto;
}

flexBurada daha fazla seçenek görebilirsiniz : https://css-tricks.com/snippets/css/a-guide-to-flexbox/


8

Yaklaşım 1

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>

Yaklaşım 2

div {
  height: 200px;
  line-height: 200px;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Haec et tu ita posuisti, et verba vestra sunt. Non enim iam stirpis bonum quaeret, sed animalis. </span>
</div>

Yaklaşım 3

div {
  display: table;
  height: 100px;
  width: 100%;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: table-cell;
  vertical-align: middle;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>


4
<div class="small-container">
    <span>Text centered</span>
</div>

<style>
.small-container {
    width:250px;
    height:250px;
    border:1px green solid;
    text-align:center;
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
.small-container span{
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
</style>

4
# Parent
{
  display:table;
}

# Child
{
  display: table-cell;
  width: 100%; // As large as its parent to center the text horizontally
  text-align: center;
  vertical-align: middle; // Vertically align this element on its parent
}

6
Bu, gönderilen diğer cevaplardan tam olarak ne kadar farklıdır?
Josh Crozier

3

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>


3
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Sudheesh Singanamalla

1

.cell-row {display: table; width: 100%; height: 100px; background-color: lightgrey; text-align: center}
.cell {display: table-cell}
.cell-middle {vertical-align: middle}
<div class="cell-row">
  <div class="cell cell-middle">Center</div>
</div>


1

Bu benim için çalışıyor (test tamam!):

HTML:

<div class="mydiv">
    <p>Item to be centered!</p>
</div>

CSS:

.mydiv {
    height: 100%; /* Or other */
    position: relative;
}

.mydiv p {
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%); /* To compensate own width and height */
}

% 50'den başka değerler seçebilirsiniz. Örneğin,% 25 ebeveynin% 25'inde ortalanır.


1
<!DOCTYPE html>
<html>
  <head>
    <style>
      .maindiv {
        height: 450px;
        background: #f8f8f8;
        display: -webkit-flex;
        align-items: center;
        justify-content: center;
      }
      p {
        font-size: 24px;
      }
    </style>
  </head>

  <body>
    <div class="maindiv">
      <h1>Title</h1>
    </div>
  </body>
</html>

Neden iki cevap?
Peter Mortensen

1

Aşağıdaki yöntemleri deneyebilirsiniz:

  1. Tek bir kelime veya bir satır cümleniz varsa, aşağıdaki kod hile yapabilir.

    Bir div etiketinin içine bir metin ekleyin ve ona bir kimlik verin. Bu kimlik için aşağıdaki özellikleri tanımlayın.

    id-name {
      height: 90px;
      line-height: 90px;
      text-align: center;
      border: 2px dashed red;
    }

    Not: line-height özelliğinin, bölmenin yüksekliği ile aynı olduğundan emin olun.

    görüntü

    Ancak, içerik birden fazla kelime veya satırdan oluşuyorsa, bu işe yaramaz. Ayrıca, bir bölümün boyutunu piksel veya% cinsinden belirtemeyeceğiniz zamanlar olacaktır (bölüm gerçekten küçük olduğunda ve içeriğin tam olarak ortada olmasını istediğinizde).

  2. Bu sorunu çözmek için aşağıdaki özellik kombinasyonunu deneyebiliriz.

    id-name {
      display: flex;
      justify-content: center;
      align-items: center;
      border: 2px dashed red;
    }

    görüntü

    Bu 3 kod satırı, içeriği tam olarak bir bölümün ortasında ayarlar (ekranın boyutundan bağımsız olarak). "Hizalama-öğeler: center" dikey merkezleme yardımcı olur iken "haklı-içerik: center" yatay merkezli yapacaktır.

    Not: Flex tüm tarayıcılarda çalışmaz. Ek tarayıcı desteği için uygun satıcı önekleri eklediğinizden emin olun.


Seçenek 2 benim için iyi çalıştı. Teşekkürler!
anacron


0

Dikey hizalamayı elde etmek için çizgi yüksekliğini ayarlama.

line-height: 90px;

3
Bir çözüm olabileceğinden aşağıya inmeyecek , ancak bu sadece tek satırlı metni garanti edebiliyorsanız işe yarar ...
dooleyo

0

Bu doğru cevap olmalı. En temiz ve en basit:

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

0

Stil uygula:

position: absolute;
top: 50%;
left: 0;
right: 0;

Metniniz, uzunluğuna bakılmaksızın ortalanır.


0

Bu benim için çalıştı:

.center-stuff{
    text-align: center;
    vertical-align: middle;
    line-height: 230px; /* This should be the div height */
}

0

Benim için bu en iyi çözümdü:

HTML:

 <div id="outer">  
     <img src="logo.png">
 </div>

CSS:

#outer {
  position: fixed;
  top: 50%;
  left: 50%;
  /* bring your own prefixes */
  transform: translate(-50%, -50%);
}

-1
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <div style ="text-align: center;">Center horizontal text</div>
        <div style ="position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);">Center vertical text</div>
    </body>
</html> 

1
Bu temiz kod iyi. Bununla birlikte, div etiketlerinize kimlik ekleyebilirsiniz, böylece gerekirse daha sonra kullanabilirsiniz.
Amir Md Amiruzzaman

Öneriniz için teşekkür ederiz. Evet, kimliğin manipüle edilmesine yardımcı olduğunu kabul ediyorum.

2
önceki cevapları okudun mu? bu cevabın öncekilere neler kattığını söyleyebilir misiniz?
Temani Afif

1
@AmirMdAmiruzzaman bize bu kodun en temiz kısmının ne olduğunu söyleyebilir misiniz :) ... iyi olmayan satır içi stiller görüyorum ... ayrıca kimlik eklemek de iyi bir fikir değil, Sınıflara ihtiyacımız var
Temani Afif

1
Kopyası Josh'un cevabın Yaklaşımı 1
Munim Munna

-1

Benim için çalışan gerçekten basit bir kod! Yalnızca bir satır ve metniniz yatay olarak ortalanır.

.center-horizontally{
  justify-content: center;
}

<Card.Footer className="card-body-padding center-horizontally">
  <label className="support-expand-text-light">Call or email Customer Support to change</label>
</Card.Footer>

Çıktı şöyle görünür:

Kolay çözümler arayan geliştiricilerin biraz zaman ayırması için lütfen bu yanıtı oylayın. Teşekkürler! :)


-2

Aşağıdaki örneği deneyin. Her kategori için örnekler ekledim: yatay ve dikey

<!DOCTYPE html>
<html>
    <head>
        <style>
            #horizontal
            {
                text-align: center;
            }
            #vertical
            {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translateX(-50%) translateY(-50%);
            }
         </style>
    </head>
    <body>
         <div id ="horizontal">Center horizontal text</div>
         <div id ="vertical">Center vertical text</div>
    </body>
</html> 

1
soru yatay olarak ortalamak ve dikey olarak da bu çözüm daha önce verilmiştir
Temani Afif
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.