Tüm html gövdesini merkeze nasıl hizalayabilirim?


Yanıtlar:


116

Bu eski gönderiye biraz önce rastladım ve user01'in cevabını çoktan bulduğundan eminim, ancak mevcut cevapların pek işe yaramadığını gördüm. Başkaları tarafından sağlanan bilgileri kullanarak biraz oynadıktan sonra, IE, Firefox ve Chrome'da çalışan bir çözüm buldum. CSS'de:

html, body {
    height: 100%;
}

html {
    display: table;
    margin: auto;
}

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

Bu, abernier'in cevabıyla neredeyse aynı, ancak otomatik marjı ihmal edeceği gibi, genişliğin dahil edilmesinin merkezlemeyi bozacağını buldum. Umarım bu konuya rastlayan başka biri cevabımı faydalı bulacaktır.

Not:html, body { height: 100%; } Yalnızca yatay olarak ortalamayı ihmal edin.


İyi cevap. Merak ediyorum (HTML konusunda pek tecrübem olmadığı için) yüksekliği% 100'e ayarlamak gerekli mi?
batımı. 8

7
@JackHumphries Yükseklik, yalnızca sayfayı hem dikey hem de yatay eksende ortalamak istiyorsanız gereklidir. İstediğiniz tek şey yataysa, yüksekliği atlayabilirsiniz.
MildWolfie

37

Deneyebilirsin:

body{ margin:0 auto; }

1
Bu çok basit bir cevaptır, ancak gövde etiketini sayfanın ortasında ortalamanın en temiz ve en verimli yoludur.
justinhartman

1
Kısa olmasına rağmen, IE, Edge Legacy, Edge, Chrome veya Firefox'ta da çalışmaz. Sorun şu ki, marj otomatik yalnızca öğe genişliği üst öğenin genişliğinden daha az olduğunda çalışır. "Gövde" varsayılan değeri% 100 olduğundan kenarlarda kenar boşluklarını otomatik olarak eklemek için yer yoktur. Kullanabilirsiniz body { margin:0 auto; max-width: 700px; }ve sonra vücudunuz 700 piksele kadar olacak ve daha küçük cihazlarda sarmaya izin verecektir.
user3347790

17

DÜZENLE

Bugünden itibaren flexbox ile şunları yapabilirsiniz:

body {
  display:flex; flex-direction:column; justify-content:center;
  min-height:100vh;
}

ÖNCEKİ CEVAP

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

1
Hangi DOCTYPE style, htmlvarlığın özniteliğine izin verir ?
2014

1
@ceving: anlamak emin değilim ... yani CSS geçerli değil mi?
abernier

11

CSS ile ilgili olarak paylaşmayı sevdiğim bir şey varsa, o da HER İKİ EKSEN BOYUNCA ŞEYLERİ MERKEZLEME YOLUMUMUZ !!!

Bu yöntemin avantajları :

  1. İnsanların gerçekten kullandığı tarayıcılarla tam uyumluluk
  2. Tablo gerekmez
  3. Ebeveynlerinin içindeki diğer öğeleri ortalamak için son derece yeniden kullanılabilir
  4. Ebeveynleri ve çocukları dinamik (değişen) boyutlarla ağırlıyor!

Bunu her zaman 2 sınıf kullanarak yapıyorum: Biri içeriği ortalanacak olan ana öğeyi belirtmek için ( .centered-wrapper) ve ikincisi, ana öğenin hangi alt öğesinin ortalandığını belirtmek için ( .centered-content). Bu 2. sınıf, ebeveynin birden fazla çocuğu olduğu, ancak yalnızca 1 tanesinin ortalanması gereken durumlarda kullanışlıdır. Bu durumda, bodyolacak .centered-wrapperve bir iç divolacaktır .centered-content.

<html>
    <head>...</head>
    <body class="centered-wrapper">
        <div class="centered-content">...</div>
    </body>
</html>

Merkezleme fikri şimdi .centered-contentbir inline-block. Bu, yatay merkezlemeyi kolayca kolaylaştıracak text-align: center;ve aynı zamanda göreceğiniz gibi dikey merkezlemeye de izin verecektir .

.centered-wrapper {
    position: relative;
    text-align: center;
}
.centered-wrapper:before {
    content: "";
    position: relative;
    display: inline-block;
    width: 0; height: 100%;
    vertical-align: middle;
}
.centered-content {
    display: inline-block;
    vertical-align: middle;
}

Bu, herhangi bir çocuğu herhangi bir ebeveynin içinde ortalamak için size gerçekten yeniden kullanılabilir 2 sınıf verir! Sadece .centered-wrapperve .centered-contentsınıflarını ekleyin .

Öyleyse, bu :beforeunsurla ilgili ne var ? Kolaylaştırır vertical-align: middle;ve gereklidir çünkü dikey hizalama ebeveynin yüksekliğine bağlı değildir - dikey hizalama en uzun kardeşin boyuna bağlıdır !!! . Bu nedenle, yüksekliği ebeveynin boyu (% 100 yükseklik, görünmez hale getirmek için 0 genişlik) olan bir kardeşin olmasını sağlayarak, dikey hizalamanın ebeveynin boyuna göre olacağını biliyoruz.

Son bir şey: htmlve bodyetiketlerinizin pencerenin boyutunda olmasını sağlamanız gerekir, böylece onları ortalamak tarayıcıyı ortalamakla aynı olur!

html, body {
    width: 100%;
    height: 100%;
    padding: 0;
    margin: 0;
}

Keman: https://jsfiddle.net/gershy/g121g72a/



8

Flexbox kullanıyorum html. Güzel bir etki için, içeriğinizi sayfa maksimumlarınızdan daha büyük ekran boyutlarında çerçevelemek için tarayıcı kromunu eşleştirebilirsiniz. Bunun #eeeeeeeşleşmesini oldukça iyi buluyorum . Güzel bir yüzdürme efekti için bir kutu gölgesi ekleyebilirsiniz.

    html{
        display: flex;
        flex-flow: row nowrap;  
        justify-content: center;
        align-content: center;
        align-items: center;
        height:100%;
        margin: 0;
        padding: 0;
        background:#eeeeee;
    }
    body {
        margin: 0;
        flex: 0 1 auto;
        align-self: auto;
        /*recommend 1920 / 1080 max based on usage stats, use 100% to that point*/
        width: 100%
        max-width: 900px;
        height: 100%;
        max-height: 600px;
        background:#fafafa;
        -webkit-box-shadow: 0px 0px 96px 0px rgba(0,0,0,0.75);
        -moz-box-shadow: 0px 0px 96px 0px rgba(0,0,0,0.75);
        box-shadow: 0px 0px 96px 0px rgba(0,0,0,0.75);
    }

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin resim / veri izniyle StatCounter


4
Güzel, modern cevap. Sadece birkaç yorum. (a) satıcı-öneki box-shadowdestekleyen tarayıcılar muhtemelen gereksiz flexda destek box-shadow. (b) Cevabınızı süsleyen, ancak önemli kısımların ayırt edilmesini zorlaştıran çok sayıda CSS vardır. Teşekkürler
Manngo

Çok fazla (b), @ Manngo'nun yukarıdaki yorumunda.
cjauvin

İyi cevap. Modern. Ama aynı içeriğe sahip daha basit olabilirdi.
carloswm85

4
<style>
        body{
            max-width: 1180px;
            width: 98%;
            margin: 0px auto;
            text-align: left;
        }
</style>

Herhangi bir CSS uygulamadan önce bu stili uygulamanız yeterlidir. Genişliği ihtiyacınıza göre değiştirebilirsiniz.



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.