Sabit bir div CSS yatay merkezleme?


183
#menu {
    position: fixed;
    width: 800px;
    background: rgb(255, 255, 255); /* The Fallback */
    background: rgba(255, 255, 255, 0.8);
    margin-top: 30px;
}

Bu sorunun orada milyonlarca kez olduğunu biliyorum, ancak davam için bir çözüm bulamıyorum. Ekranda sabitlenmesi gereken bir div var, sayfa kaydırılsa bile her zaman ekranın ortasında ORTA kalmalıdır!

Div, 500pxgenişliğe sahip olmalı 30px, üstten (kenar boşluğu üstte) uzakta olmalı, tüm tarayıcı boyutları için sayfanın ortasında yatay olarak ortalanmış olmalı ve sayfanın geri kalanını kaydırırken hareket etmemelidir.

Mümkün mü?


Yanıtlar:


167
left: 50%;
margin-left: -400px; /* Half of the width */

26
tarayıcı penceresini yeniden boyutlandırdığınızda amaçlandığı gibi çalışmaz.

3
@Bahodir: Emin misin? Yeniden boyutlandırma konusunda bana doğru görünüyor. Bunun -400div değerinin ayarlanmış olması nedeniyle olduğunu düşünüyorum 800.
Merlyn Morgan-Graham

1
@PrestonBadeer - Sorunun sorduğu gibi mi?
Quentin

3
Tamamen katılıyorum - bu bir çözüm DEĞİL ! Asla bir şeyi bu şekilde kodlamayın. -1
Nate I

3
Bu gün için kötü bir cevap olduğu için DEĞİL oy verdim - iyi bir cevaptı, ama artık olmadığı için ve bir sonraki en yüksek cevap en iyi cevap olarak görülebilecek tüm yardıma ihtiyaç duyuyor ŞİMDİ. Quentin: Sanırım cevabın kendisinde bu etkiye ilişkin bir yorumda düzenleme yapmak iyi bir fikir olurdu - o zaman aşağı oyumu tersine çevirirdim.
Nick Rice

547

Buradaki cevaplar güncel değil. Artık bir kenar boşluğunu kodlamadan kolayca bir CSS3 dönüşümü kullanabilirsiniz . Bu, genişliği veya dinamik genişliği olmayan öğeler de dahil olmak üzere tüm öğeler üzerinde çalışır.

Yatay merkez:

left: 50%;
transform: translateX(-50%);

Dikey merkez:

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

Hem yatay hem de dikey:

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

Uyumluluk sorun değil: http://caniuse.com/#feat=transforms2d


87
+1 Bu cevap yığın akışı ile ilgili bir sorunu göstermektedir: Günleri için iyi olan ve haklı olarak kabul edilen eski cevaplar, hala uygun oldukları izlenimini vererek gururla oturabilir, bunun gibi daha yeni bir dünya için harika cevaplar, ihtimallere karşı mücadele etmek.
Nick Rice

11
@NickRice% 100 kabul etti. Bu cevap kabul edilen yeni cevap olmalıdır. Genç Devs bile olmamalı bakınız , kabul edilen geçerli bir cevap!
Nate I

2
@matt lütfen bunun yerine bunu kabul edin. Bunu görmek için çok uzun kaydırın.
ssbb

4
Bu, içerik öğelerindeki kutu gölgesinde bulanıklaştırma efektleri oluşturur.
rab

4
Evet, Chrome dönüştürülen içeriği yanlış bulanıklaştırıyor. Metin de bulanık. Ancak sabit kodlamadan ve sargı elemanları kullanmadan ortalanmış sabit bir elemanın bulunması için tek çözüm budur. Arka planın işaretçi olaylarını umursamıyorsanız, tam ekran sarıcı ve flexbox veya aşağıdaki @ salomvary'nun çözümü ile aynı efekti elde edebilirsiniz.
Maciej Krawczyk

58

Satır içi blokları kullanmak bir seçenekse bu yaklaşımı tavsiye ederim:

.container { 
    /* fixed position a zero-height full width container */
    position: fixed;
    top: 0; /* or whatever position is desired */
    left: 0;
    right: 0;
    height: 0;
    /* center all inline content */
    text-align: center;
}

.container > div {
    /* make the block inline */
    display: inline-block;
    /* reset container's center alignment */
    text-align: left;
} 

Burada kısa bir yazı yazdım: http://salomvary.github.com/position-fixed-horizontally-centered.html


1
10x, bu benim için harika çalıştı w / o herhangi bir sayı widthveya herhangi bir şey sabit kodlamak zorunda - @Quentins cevap aksine
Yatharth Agarwal

30

Edit September 2016: Buna rağmen ara sıra yukarı oy almak güzel olsa da, dünya ilerlediğinden, şimdi dönüşüm kullanan (ve bir ton upvotes olan) cevaba giderdim. Artık bu şekilde yapmam.

Bir marj hesaplamak veya bir alt konteynere ihtiyaç duymamak için başka bir yol:

#menu {
    position: fixed;   /* Take it out of the flow of the document */
    left: 0;           /* Left edge at left for now */
    right: 0;          /* Right edge at right for now, so full width */ 
    top: 30px;         /* Move it down from top of window */
    width: 500px;      /* Give it the desired width */ 
    margin: auto;      /* Center it */
    max-width: 100%;   /* Make it fit window if under 500px */ 
    z-index: 10000;    /* Whatever needed to force to front (1 might do) */
}

@Joey Tabanı ne yapar: 0 ne yapar? yani neden gerekli? (Buna bakmamın üzerinden biraz zaman geçti!)
Nick Rice

bottom:0menünün her zaman dikey olarak ortalandığından emin olabilirsiniz, ancak şimdi OP'nin istediğini görmüyorum. :)
Jordan H

Öğelerin yüksekliği pencere (görünüm alanı) yüksekliğinden daha yüksekse, FF'de ortalanmadığını fark ettiğim farklı bir bağlamda kullanmaya çalıştım
Philipp Werminghausen

Dünya ilerlediğinden, şimdi dönüşümü kullanan cevapla devam ederdim. (Bu yorumu daha önce yaptım, yanıtlayıcının kullandığı adı referans alarak - ancak bu adı değiştirdiler, böylece yorumum artık mantıklı değil ve sildim - bunun yerine dönüşüm için bu sayfada arama yapın.)
Nick Rice

7

Div'i yatay olarak bu şekilde ortalamak mümkündür:

html:

<div class="container">
    <div class="inner">content</div>
</div>

css:

.container {
    left: 0;
    right: 0;
    bottom: 0; /* or top: 0, or any needed value */
    position: fixed;
    z-index: 1000; /* or even higher to prevent guarantee overlapping */
}

.inner {
    max-width: 600px; /* just for example */
    margin: 0 auto;
}

Bu şekilde kullanarak her zaman iç bloğunuz merkezlenir, ayrıca kolayca gerçek duyarlılığa dönüştürülebilir (örnekte sadece daha küçük ekranlarda akıcı olacaktır), bu nedenle soru örneğinde ve seçilen cevapta herhangi bir sınırlama yoktur .


5

... ya da başka bir menü div menüsünü kapatabilirsiniz:

    <div id="wrapper">
       <div id="menu">
       </div>
    </div>


#wrapper{
         width:800px;
         background: rgba(255, 255, 255, 0.8);
         margin:30px auto;
         border:1px solid red;
    }

    #menu{
        position:fixed;
        border:1px solid green;
        width:300px;
        height:30px;
    }

5

İşte başka bir iki bölümlü çözüm. Kısa ve özlü tutmaya çalıştım. İlk olarak, beklenen html:

<div id="outer">
  <div id="inner">
    content
  </div>
</div>

Aşağıdaki css'in arkasındaki ilke "dış" ın bir tarafını konumlandırmak, daha sonra ikincisini nispeten kaydırmak için "iç" boyutunu varsaydığı gerçeğini kullanmaktır.

#outer {
  position: fixed;
  left: 50%;          // % of window
}
#inner {
  position: relative;
  left: -50%;         // % of outer (which auto-matches inner width)
}

Bu yaklaşım Quentin'e benzer, ancak iç değişken büyüklükte olabilir.


-1

İşte tam ekran sarmalayıcı div kullanırken bir flexbox çözümü. justify-content çocuk div bölümünü yatay olarak, hizalama öğeleri ise dikey olarak merkezler.

<div class="full-screen-wrapper">
    <div class="center"> //... content</div>
</div>

.full-screen-wrapper { 
  position: fixed;
  display: flex;
  justify-content: center;
  width: 100vw;
  height: 100vh;
  top: 0;
  align-items: center;
}

.center {
  // your styles
}
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.