yüzde olarak çalışmayan satır yüksekliği


87

Hat yüksekliğiyle ilgili olarak kafamı tam olarak anlayamadığım bir sorun yaşıyorum.

Aşağıdaki kod bir görüntüyü bir div içinde ortalayacaktır:

CSS

.bar {
    height: 800px;
    width: 100%;
    line-height:800px;
    background-color: #000;
    text-align: center; 
}

.bar img {
    vertical-align: middle;   
}

HTML

<div class="bar">
    <img src="http://27.media.tumblr.com/yHWA4oxH870ulxnoH7CkOSDR_500.jpg" alt="Foo Image" />
</div>

Bununla birlikte, satır yüksekliğini% 100 olarak değiştirirsem, satır yüksekliği etkili olmaz (veya en azından div'in% 100'ü olmaz).

Örnek jsfiddle

Neyi yanlış yaptığımı bilen var mı?

Yanıtlar:


195

line-height: 100%yüksekliğinin% 100'ü değil, o öğe için yazı tipi boyutunun% 100'ü anlamına gelir. Değeri mutlak uzunluk birimi (kullandığı sürece Aslında, satır yüksekliği, her yazı tipi boyutu değil, yüksekliği göreceli px, ptvs.).


3
Ah. Beni her zaman saçma sapan hatalar yapar. Teşekkürler! Bana izin verdiğinde cevabını kabul edeceğim.
— My Head Acıyor

1
Görünüşe göre yazarların yanlışlıkla yazı tipi boyutunu / satır yüksekliğini öğenin yüksekliğine göre ayarlamak istemeyeceğini düşünmüşler ...
— Andy

1
@Andy: İyi (?) Haber, bunun yakında basamaklı değişkenlerin kullanımıyla mümkün olacağı . Sadece birkaç yıl bekleyiş ...
— BoltClock

@ BoltClock ah, harika! Bu güzel olacak. Bana bildirdiğiniz için teşekkürler!
— Andy

vh bir istisnadır. CSS3'te, 100vh olarak ayarlarsanız, aslında bazı geliştiricilerin isteyebileceği şekilde çalışacaktır. Yine de CSS3'ü desteklemeyen eski tarayıcılarda çalışmadığını unutmayın.
— Philll_t

99

Bu sorunun eski olduğunu biliyorum ama benim için mükemmel bir çözüm buldum.

Bu css'yi ortalamak istediğim div'e ekliyorum:

div:before {
  content: "";
  display: inline-block;
  height: 100%;
  vertical-align: middle;
}

Bu her seferinde işe yarar ve temizdir.

Düzenleme: Sadece tamamlama aşkına, scss kullanıyorum ve dikey olarak ortalamak istediğim, doğrudan çocuk sahibi olan her ebeveyne dahil ettiğim kullanışlı bir karışımım var:

@mixin vertical-align($align: middle) {
  &:before {
    content: "";
    display: inline-block;
    height: 100%;
    vertical-align: $align;
    // you can add font-size 0 here and restore in the children to prevent
    // the inline-block white-space to mess the width of your elements
    font-size: 0;
  }
  & > * {
    vertical-align: $align;
    // although you need to know the font-size, because "inherit" is 0
    font-size: 14px;
  }
}

Tam açıklama: div:beforediv'in içine, ancak alt öğelerinin herhangi birinin önüne bir öğe ekler. Kullanırken :beforeveya :afterbir content:beyan kullanmalıyız, aksi takdirde hiçbir şey olmaz, ancak amacımız için içerik boş olabilir. Daha sonra, ebeveyninin yüksekliği tanımlandığı ve bu eleman en azından inline-blok olduğu sürece, elemana, ebeveyninin boyu kadar uzun olmasını söyleriz. farklı şekilde işlediğinin vertical-alignaksine, ebeveynle ilgili kendinin dikey konumunu tanımlar text-align.

@mixinDeklarasyon küstahlık kullanıcıları içindir ve bu gibi kullanılabilir olacaktır:

div {
    @include vertical-align(middle)
}

Diğer cevapların hepsi doğru olsa da, bu muhtemelen yukarıdaki soruna en temiz ve zarif çözümdür.
— mstation

Cevap değil, ama en kullanışlı!
— Alex

Orada neler olduğunu detaylı bir şekilde açıklar mısınız? Oldukça alamadım
— Valdrinium

1
@Valdrinit Cevabı daha fazla açıklamayla düzenleyeceğim
— santiago arizti

36

Yüzdeyi satır yüksekliği olarak kullandığınızda, bu div kapsayıcısına değil, yazı tipi boyutuna bağlıdır.


22

line-height:% 100, konteynere göre hesaplansaydı, elemanları dikey olarak ortalamanın kolay bir yolu olurdu, ancak bu çok kolay olurdu, bu yüzden işe yaramaz.

Yani bunun yerine, satır yüksekliği demenin başka bir yolu: 1em (değil mi?)

Bir öğeyi dikey olarak ortalamanın başka bir yolu şudur:

.container {
     position:relative;
}
.center {
     position:absolute;
     top:0; left:0; bottom:0; right:0;
     margin: auto;
     /* for horiz left-align, try "margin: auto auto auto 0" */
}

1
Bu benim için çalışmıyor ... bir şeyi kaçırdığımdan emin değilim.
— clifgriffin

1
@clifgriffin, hem kapsayıcıda hem de "ortadaki" alt öğede sabit bir genişlik ve yükseklik ayarlamayı deneyin, çocuğun kaptan daha küçük olduğundan emin olun. Çocuk kap içinde yatay ve dikey olarak ortalanmalıdır.
— Rolf

23
bu çok kolay olurdu, bu yüzden işe yaramıyor +1 :-)
— elipoultorak

@clifgriffin, kabın doğru genişliğe ve yüksekliğe sahip olduğundan emin olun, her şeyi aynı boyutta bir div içinde ortalıyor olabilirsiniz. Yapmam gereken ayarlama buydu.
— David Carrigan

@ user3576887 "bu çok kolay olurdu, bu yüzden işe yaramıyor" tam da bu yüzden bunu eksi oyla alıyorum - burada istediğiniz gibi çalışmamasının çok iyi bir nedeni var ve bu olmamalı eğlence, eleştiri veya olması gereken her ne olursa olsun gizlenmiş.
— TheThirdMan

11

güzel olmayabilir, ama işe yarıyor ve anlamsal;

<div class="bar" style="display: table; text-align: center;">
    <img style="display: table-cell; vertical-align: middle;" src="http://27.media.tumblr.com/yHWA4oxH870ulxnoH7CkOSDR_500.jpg" alt="Foo Image" />
</div>

display: table-cell, bir elemana dikey hizalama için benzersiz bir tablo yeteneği verir (en azından bence benzersizdir)


Cevabınız için teşekkürler, kodunuzu denedim ama bende işe yaramadı.
— My Head Acıyor

hmm, bu biraz garip; Kodunuzun bir kısmını gönderebilirseniz, böylece ona daha yakından bakabilirim, daha fazla yardımcı olabilirim
— Johan Olsson

Olsson - Kodunuzu bir JSFiddle'a yapıştırdım ve işe yaramadı. Yardım teklifiniz için teşekkürler - ancak şimdilik mutlak bir satır yüksekliği belirlemekten kurtulabilirim. Eğer bu değişirse cevabınızı daha ayrıntılı inceleyeceğim. Yardım için tekrar teşekkürler!
— My Head Acıyor


1

Bu çözüm IE9 ve üzeri sürümlerde çalışır. Önce çocuğun üst konumunu% 50'ye (ebeveynin ortası) ayarladık. Ardından translatekuralı kullanarak çocuğu gerçek boyunun yarısı kadar yukarı kaydırın. Ana faydası, çocuğun boyunu tanımlamamız gerekmemesi, tarayıcı tarafından dinamik olarak hesaplanmasıdır. JSFiddle

.bar {
    height: 500px;
    text-align: center;
    background: green;
}
.bar img {
    position: relative;
    top: 50%;
    transform: translate(0, -50%);
}

1

Daha modern bir yaklaşım bunun için flexbox kullanmaktır, daha basit ve daha temizdir. Ancak FlexBox ne tamamen farklı bir paradigma olduğunu inline-block, floatya daposition olmaya kullanılan.

İçinizdeki öğeleri hizalamak için .parentşunları yapın:

.parent {
  display: flex;
  align-items: center;
}

Bu onunla ilgili. Çocuklarıflex ebeveynleri otomatik esnek alt öğelerden dönüştürülür.

Flexbox hakkında daha fazla bilgi almalısınız, başlamak için iyi bir yer şu hile sayfasıdır: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


0

Satır yüksekliğini bu öğe yüksekliğine göre ayarlayabilirsiniz . Öğe yüksekliği 200px, metni ortalamak için satır yüksekliğini 200px olarak ayarlamanız gerektiği anlamına gelir.

span {
  height: 200px;
  width: 200px; 
  border: 1px solid black;
  line-height: 200px; 
  display: block;
}
<span>Im vertically center</span>


0

Bu, aşağıdaki CSS'yi kapsayıcı div veya dış div'de ayarlamanız gereken modern çözümdür.

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

Dikey olarak ortalamak istediğiniz elemana aşağıdaki başka bir çözüm uygulanabilir. Dış veya kapsayıcı div'in

.inner-div {
    position: absolute;
    top: 50%; 
    left: 50%;
    transform: translate(-50%,-50%);
    text-align: center;
}

Dış veya kapsayıcı div konumunun göreli olması gerektiğini unutmayın.

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.