Dinamik genişlikte (CSS) ortala sabit div


90

Bu CSS'ye sahip olacak bir div'im var:

#some_kind_of_popup
{
    position: fixed;
    top: 100px;
    min-height: 300px;
    width: 90%;
    max-width: 900px;
}

Şimdi, bu div'i nasıl ortalayabilirim? Kullanabilirim margin-left: -450px; left: 50%;ancak bu yalnızca ekran> 900 piksel olduğunda çalışacaktır. Bundan sonra (pencere <900 piksel olduğunda), artık ortalanmayacaktır.

Elbette bunu bir tür js ile yapabilirim, ancak bunu CSS ile yapmanın "daha doğru" bir yolu var mı?


4
@Liam - Katılmıyorum, bu sorunun kendi başına bir düpedüz olduğunu düşünüyorum. Bu sorular, ortalanmış sabit genişliği olmayan bir div'e sahip olmakla ilgili olarak bunu yanıtlamaz.
Joshua M

Joshua'nın söylediği şey, bir div'i diğerine ortalamak için.
gubbfett

7
@Liam - Dahası margin: 0 auto, bir position: fixeddiv üzerinde kullanamazsınız . Soruyu okudun mu?
Joshua M

^ hayır. ben de denedim. : p
gubbfett

3
@JoshuaM İddianız% 100 doğru değil. Cevabımı gör.
laconbass

Yanıtlar:


226

Bir ortalayabilmek fixedveya absolutekonumlandırılmış eleman ayarı rightve lefthiç 0ardından ve margin-left& margin-rightiçin autobir merkezleme sanki statickonumlandırılmış elemanı.

#example {
    position: fixed;
    /* center the element */
    right: 0;
    left: 0;
    margin-right: auto;
    margin-left: auto;
    /* give it dimensions */
    min-height: 10em;
    width: 90%;
}

Bu keman üzerinde çalışırken bu örneğe bakın .


1
Sadece bahsetmek gerekirse ... Bu beklenmedik değil, ancak IE7'de başarısız oluyor. Burada soldan 0px konumlandırılmıştır. IE 8'de nasıl mükemmel
çalışırsa çalışsın

Bu, elemanın genişliği ekranın genişliğinden daha büyük olduğunda çalışmaz .. bu durumda çalışması iyi olur.
andrewb

1
@andrewb Eğer hem eşit derecede olumsuz marjı geçerli olabilir rightve leften azından bir bölgesinin value >= witdth / 2görüldüğü gibi, jsfiddle.net/PvfFy/168 ama zarif bir yaklaşım IMHO olmayan olduğunu. Eğlenmek için krom üzerinde test ettim, geri kalanında işe
yarayıp

5
Sorunun kapsamı dışında, bu, öğenin genişliğinin ayarlanmasına bağlıdır, bu nedenle genişliği değişen veya bilinmeyen dinamik içeriğiniz varsa bu harika değildir. Merkezlemeyi bir kenara bırakırsak, normalde bunu ekranla yapardım: satır içi blok ve ayarlı genişlik yok. Bu dava için js olmayan bir çözümü olan var mı?
enigment

4
Soru dinamik genişlik diyor , tüm sorun bu, bunu öylece görmezden gelemezsiniz.
Gil Epshtain

56

CSS3'ün transformözelliğini güvenle kullanabiliyorsanız işte başka bir yöntem :

.fixed-horizontal-center
{
    position: fixed;
    top: 100px; /* or whatever top you need */
    left: 50%;
    width: auto;
    -webkit-transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -o-transform: translateX(-50%);
    transform: translateX(-50%);
}

... veya hem yatay HEM DE dikey merkezleme istiyorsanız:

.fixed-center
{
    position: fixed;
    top: 50%;
    left: 50%;
    width: auto;
    height: auto;
    -webkit-transform: translate(-50%,-50%);
    -moz-transform: translate(-50%,-50%);
    -ms-transform: translate(-50%,-50%);
    -o-transform: translate(-50%,-50%);
    transform: translate(-50%,-50%);
}

5
Modern bir tarayıcı için olduğu sürece , bu cevap için EN İYİ çözüm budur! Gerçek bir `` float: center '' gibi olan tek şey, sarma öğesinin etrafına tıklayabilir ve etrafında balık tutmak zorunda kalmazsınız. Bu cevabı seviyorum!
SpYk3HH

1
Dikkatli olun, ortaya çıkan değer bir kayan değer ise düzleştirileceği için metni ortalamak için yüzde olarak çeviriyi kullanmayın. Ho oğlum, bunu istemiyorsun, hayır istemiyorsun.
gnou

CSS dönüştürmelerinin kullanılması, düzgünleştirmenin metinden daha fazlasında gerçekleşmesine neden olabilir; Dönüşümün bir sonucu olarak tuhaf sınırlar alıyorum.
Nathan K

1
Ekran boyutunu değiştirirken erken büzülme potansiyeli (bölümün boyutuna bağlı olarak), bölümün kenarında büyük bordürlere neden olur.
Single Entity

7
<div id="container">
    <div id="some_kind_of_popup">
        center me
    </div>
</div>

Bir kaba sarmanız gerekir. işte css

#container{
    position: fixed;
    top: 100px;
    width: 100%;
    text-align: center;
}
#some_kind_of_popup{
    display:inline-block;
    width: 90%;
    max-width: 900px;  
    min-height: 300px;  
}

Ah, düşüncelerini beğendim. Sabit div yalnızca gerçek sonuca sahip başka bir div için bir kap mı olacak? Bunu deneyeceğim!
gubbfett

Cevabınızın sezgiselliğinden hoşlansam da, ie6 / 7 desteğine nasıl izin vereceğini anlamıyorum.
Mathew Berg

1
@MathewBerg, ie6 / 7 hakkında iyi bir nokta. Bu durumda cevabınız en iyi sonucu vermelidir. Bu biraz fazla mesai, ama şahsen geliştiricilerin <= ie7 için işleri düzeltmek için zaman harcamamaları gerektiğini düşünüyorum. Aslında geliştiricilerin, eski sistemlere sahip kişileri ve şirketleri yükseltmeye zorlamak için bu tarayıcıları engellemesi gerektiğini düşünüyorum. Bu fikri ödeme yapan bir müşteriye satmak ne kadar zor! ;)
gubbfett

Evet, ancak ne yazık ki bazı şirketler, gelecekte ne kadar ileri gidersek gidelim eski tarayıcılar için desteğe ihtiyaç duyuyor. Devam edin ve ihtiyaçlarınıza göre benimkini veya laconbass'ın cevabını kabul edin.
Mathew Berg

1
"kapsayıcı"
öğesini

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.