Bir html öğesi, yalnızca css kullanarak kalan ekran yüksekliğinin% 100'ünü nasıl doldurabilir?


119

Bir başlık öğem ve bir içerik öğem var:

#header
#content

Başlığın sabit yükseklikte olmasını ve içeriğin ekranda bulunan kalan tüm yüksekliği ile doldurmasını istiyorum overflow-y: scroll;.

Javascript olmadan bu mümkün mü?

Yanıtlar:


83

Bunun püf noktası, html ve body öğelerinde% 100 yükseklik belirlemektir. Bazı tarayıcılar yüksekliği hesaplamak için ana öğelere (html, gövde) bakar.

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">
        </div>
    </body>
</html>

html, body
{
    height: 100%;
}
#Header
{
    width: 960px;
    height: 150px;
}
#Content
{
    height: 100%;
    width: 960px;
}

1
Tüm çözümü denedim ama sadece bu sorunumu çözdü.
Alex

1
@Alex bu, hedeflediğiniz tüm tarayıcılar için çalışıyorsa, o zaman elbette devam edin ve uygulayın. Herkesin gereksinimleri farklıdır.
BentOnCoding

323

tüm cevapları unutun, bu CSS satırı benim için 2 saniyede çalıştı:

height:100vh;

1vh = Tarayıcı ekran yüksekliğinin% 1'i

kaynak

Duyarlı düzen ölçeklendirme için şunları kullanmak isteyebilirsiniz:

min-height: 100vh

[Kasım 2018'de güncelleme] Yorumlarda belirtildiği gibi, minimum yüksekliği kullanmak, yanıt veren tasarımlarda sorun yaşanmasını önleyebilir

[güncelleme nisan 2018] Yorumlarda belirtildiği gibi, 2011'de soru sorulduğunda, tüm tarayıcılar görüntü alanı birimlerini desteklemiyordu. Diğer cevaplar o zamanki çözümlerdi - vmaxhala IE'de desteklenmiyor, bu yüzden bu henüz herkes için en iyi çözüm olmayabilir.


9
Tüm ana öğelerin yüksekliğini% 100 olarak ayarlamanıza gerek olmadığı için bu en basit cevaptır. İşte vh - caniuse.com/#feat=viewport-units için mevcut destek - görünüşe göre iOS'ta vh'nin yükseklik hesaplamasına alt araç çubuğunun yüksekliğini dahil ettiği bildirildiğinden, iOS bir geçici çözüme ihtiyaç duyabilir.
Brian Burns

2
VAY, güzel bul! Aşırı karmaşık cevapları olan tüm bu insanlara bakın.
NoName

8
2011'de soru sorulduğunda, büyük tarayıcıların hiçbiri görüntü alanı birimlerini desteklemiyordu. Bu "aşırı karmaşık cevaplar" o zamanlar tek seçenekti.
JJJ

6
A'nın min-height: 100vhçok daha iyi olacağına dair küçük öneri . Duyarlı tasarımlar için de ölçeklendirilebilir.
Wiggy A.

3
Bu, sorulan soruyu yanıtlamaz, bu görüntü alanının% 100'ünü kaplar. Diğer yanıtlar doğru olduğu için, başlığının görüntü alanının% x'ini kaplayacağı için bunu istemiyor.
4cody

35

Aslında en iyi yaklaşım şudur:

html { 
    height:100%;
}
body { 
    min-height:100%;
}

Bu benim için her şeyi çözer ve altbilgimi kontrol etmeme yardımcı olur ve sayfa aşağı kaydırılsa bile sabit altbilgiye sahip olabilir.

Teknik Çözüm - DÜZENLENMİŞ

Tarihsel olarak, 'yükseklik', en kolay olan 'genişlik' ile karşılaştırıldığında kalıplanması zor bir şeydir. CSS <body>, stilin işe yaraması için odaklandığından beri . Yukarıdaki kod - verdik <html>ve <body>bir yükseklik. Sihrin ortaya çıktığı yer burasıdır - oyun masasında 'min-yükseklik' olduğu için, tarayıcıya <body>üstün olduğunu <html>çünkü <body>minimum yüksekliği tuttuğunu söylüyoruz . Bu da, daha önce yüksekliğe sahip olduğu <body>için geçersiz kılmaya izin verir . Başka bir deyişle, tarayıcıyı masadan "çarpması" için kandırıyoruz , böylece bağımsız olarak stil oluşturabiliriz.<html><html><html>


1
Aman tanrım bu bir mucize!
Geoff

Mucize gibi işe yarıyor! Ama lütfen: neden min-heightve height?
Joy

1
@ShaojiangCai - Tarihsel olarak, 'yükseklik', en kolay olan 'genişlik' ile karşılaştırıldığında kalıplanması zor bir şeydir. CSS <body>, stilin işe yaraması için odaklandığından beri . Bu kod: verdik <html>ve <body>bir yükseklik. Sihirli resmin içine giriyor - biz oyun masasında 'min-height' sahip olmalarından dolayı, sunucuyu anlatıyorsun <body>üstün over olduğu <html>çünkü <body>min-yükseklik tutar. Bu da, daha önce yüksekliğe sahip olduğu <body>için geçersiz kılmaya izin verir . Diğer bir deyişle, sunucuyu masadan "çarpması" için kandırıyoruz , böylece bağımsız olarak stil oluşturabiliriz. <html><html><html>
Faron

2
@Faron 'tarayıcı' burada 'sunucu' yerine daha iyi bir kelime seçimi olacak gibi görünüyor. ;)
LETs

@EunLeem ... Bunu ele almak için doğru ifadeyi nasıl seçebileceğim konusunda sana katılıyorum. "Dirsek yumruğu" bahşiş için teşekkürler. Cevabımı buna göre güncelledim.
Faron

14

Min-height özelliğinde vh kullanabilirsiniz.

min-height: 100vh;

Kenar boşluklarını nasıl kullandığınıza bağlı olarak aşağıdaki işlemleri yapabilirsiniz ...

min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element

10

Kabul edilen çözüm aslında işe yaramayacak. İçeriğin divebeveyninin yüksekliğine eşit olacağını fark edeceksiniz body. Bu nedenle, bodyyüksekliğin olarak 100%ayarlanması, onu tarayıcı penceresinin yüksekliğine eşit olarak ayarlayacaktır. Let tarayıcı penceresi olduğunu söylemek 768pxiçeriği ayarlayarak, yüksekliği diviçin yükseklik 100%, div'in yükseklik olmak dönecek 768px. Böylece, başlık div'i 150pxve içerik div'i olacaksınız 768px. Sonunda 150pxsayfanın altında içeriğe sahip olacaksın . Başka bir çözüm için bu bağlantıya bakın.


8

HTML5 ile şunları yapabilirsiniz:

CSS:

body, html{ width:100%; height:100%; padding: 0; margin: 0;}
header{ width:100%; height: 70px; }
section{ width: 100%; height: calc(100% - 70px);}

HTML:

<header>blabablalba </header>
<section> Content </section>

Yüzdelik yükseklik üzerinde hesaplama kullanmaya dikkat edin. Tüm ebeveynlerin boyu belirlenmiş olmadığı sürece Firefox bununla doğru şekilde çalışmayacaktır.
TomDK

4

Benim için bir sonraki iyi çalıştı:

Başlığı ve içeriği bir div üzerine kaydırdım

<div class="main-wrapper">
    <div class="header">

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

    </div>
</div>

Bu referansı yüksekliği flexbox ile doldurmak için kullandım. CSS şu şekildedir:

.main-wrapper {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
.header {
    flex: 1;
}
.content {
    flex: 1;
}

Flexbox tekniği hakkında daha fazla bilgi için referansı ziyaret edin



1

Kabul edilen cevap işe yaramıyor. Ve en yüksek oyu alan cevap asıl soruya cevap vermiyor. Sabit bir piksel yüksekliği başlığı ve tarayıcının kalan ekranında bir dolgu ile ve owerflow için kaydırın. İşte mutlak konumlandırma kullanarak gerçekten işe yarayan bir çözüm. Ayrıca sorudaki "sabit başlık" sesiyle başlık yüksekliğinin bilindiğini varsayıyorum. Burada örnek olarak 150px kullanıyorum:

HTML:

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">      
        </div>
    </body>
</html>

CSS: (yalnızca görsel efekt için arka plan rengi ekleme)

#Header
{
    height: 150px;
    width: 100%;
    background-color: #ddd;
}
#Content
{
   position: absolute;
   width: 100%;
   top: 150px;
   bottom: 0;
   background-color: #aaa;
   overflow-y: scroll;
}

Bunun nasıl çalıştığına daha ayrıntılı bir bakış için #Content, içindeki gerçek içerikle , bootstrap satırlarını ve sütunlarını kullanarak bu jsfiddle'a bir göz atın .


"sabit piksel yüksekliği başlığı" -> tam olarak bu! bottomMülkiyet verdiğinden emin #Contentkalır sayfanın sonunda sıkışmış. Bunu açıklamak için zaman ayırdığınız için teşekkür ederim.
Armfoot

1
Ve birine yardım ettiği için mutluyum;)
jumps4fun

1

Bu örnekte, ana içerik div'imin sıvı yüksekliği olmasını istiyorum, böylece tüm sayfa tarayıcı yüksekliğinin% 100'ünü kaplar.

height: 100vh;


1

Lütfen buraya 5 sentimi ekleyeyim ve klasik bir çözüm sunayım:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:0;">Content section</div>
</div>

Bu, tüm tarayıcılarda çalışacak, komut dosyası yok, esneklik yok. Parçacığı tam sayfa modunda açın ve tarayıcıyı yeniden boyutlandırın: istenen oranlar tam ekran modunda bile korunur.

Not:

  • Farklı arka plan rengine sahip öğeler aslında birbirini kaplayabilir. Burada öğelerin doğru yerleştirildiğinden emin olmak için düz kenarlık kullandım.
  • idHeader.heightve idContent.topkenarlık içerecek şekilde ayarlanır ve kenarlık kullanılmıyorsa aynı değere sahip olmalıdır. Aksi takdirde, hesaplanan genişlik kenarlık, kenar boşluğu ve / veya dolgu içermediğinden öğeler görünüm alanından çekilecektir.
  • left:0; right:0;width:100%sınır kullanılmamışsa, aynı nedenle ile değiştirilebilir .
  • Ayrı bir sayfada test etmek (pasaj olarak değil) herhangi bir html / body ayarı gerektirmez.
  • IE6 ve önceki sürümlerde elemente padding-topve / veya padding-bottomnitelikler eklemeliyiz #idOuter.

Cevabımı tamamlamak için işte altbilgi düzeni:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idContent" style="bottom:36px; top:0;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>

Ve işte hem üstbilgi hem de altbilgi içeren düzen:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:36px;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>


0

IE 9 ve altını desteklemeniz gerekmedikçe, flexbox kullanırım

body { display: flex; flex-direction: column; }
.header { height: 70px; }
.content { flex: 1 1 0 }

Ayrıca tüm sayfayı doldurmak için bir gövdeye ihtiyacınız var

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


0
#Header
{
width: 960px;
height: 150px;
}

#Content
{
min-height:100vh;
height: 100%;
width: 960px;
}

-1

Şimdiye kadar bulduğum en iyi çözüm, sayfanın altına bir altbilgi öğesi yerleştirmek ve ardından altbilgi ofsetiyle genişletmemiz gereken öğenin farkını değerlendirmek. Örneğin

Html dosyası

<div id="contents"></div>
<div id="footer"></div>

Css dosyası

#footer {
    position: fixed;
    bottom: 0;
    width: 100%;
}

Js dosyası (jquery kullanarak)

var contents = $('#contents'); 
var footer = $('#footer');
contents.css('height', (footer.offset().top - contents.offset().top) + 'px');

Ayrıca her pencere yeniden boyutlandırmasında içerik öğesinin yüksekliğini güncellemek isteyebilirsiniz, bu nedenle ...

$(window).on('resize', function() {
  contents.css('height', (footer.offset().top -contents.offset().top) + 'px');
});


-3

Böyle bir şey denedin mi?

CSS:

.content {
    height: 100%;
    display: block;
}

HTML:

<div class=".content">
<!-- Content goes here -->
</div>
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.