Sayfanın veya içeriğin altındaki altbilgi, hangisi daha düşükse


94

Aşağıdaki yapıya sahibim:

<body>
    <div id="main-wrapper">
        <header>
        </header>
        <nav>
        </nav>
        <article>
        </article>
        <footer>
        </footer>
    </div>
</body>

<article>Javascript kullanarak içeriği dinamik olarak yüklüyorum . Bu nedenle <article>bloğun yüksekliği değişebilir.

Çok <footer>fazla içerik olduğunda bloğun sayfanın altında veya yalnızca birkaç satır içerik olduğunda tarayıcı penceresinin altında olmasını istiyorum.

Şu anda birini veya diğerini yapabilirim ... ama ikisini birden yapamaz.

Bunu nasıl yapabileceğimi bilen var mı - <footer>hangisinin daha düşük olduğuna bağlı olarak sayfanın / içeriğin altına veya ekranın altına sadık kalın.


İnsanlar neden 2 yıllık bir soruya olumsuz oy verdiklerini yorumlamak ister mi?
Will

Haydi, ... Yaklaşık 6 yıl geçti
Will

Yanıtlar:


101

Ryan Fait'in yapışkan altbilgisi çok güzel, ancak temel yapısının eksik olduğunu düşünüyorum *.


Flexbox Sürümü

Eski tarayıcıları desteklemeye gerek kalmadan flexbox'ı kullanabileceğiniz kadar şanslıysanız, yapışkan altbilgiler önemsiz bir şekilde kolay hale gelir ve dinamik olarak boyutlandırılmış bir altbilgiyi destekler.

Altbilgilerin flexbox ile dibe yapışmasını sağlamanın püf noktası, aynı kaptaki diğer öğelerin dikey olarak esnetilmesidir. Tek gereken, aşağıdakilerden daha büyük display: flexbir flexdeğere sahip en az bir kardeşi olan tam yükseklikte bir sarmalayıcı öğesidir 0:

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

#main-wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100%;
}

article {
  flex: 1;
}


Flexbox kullanamıyorsanız, temel seçim yapım:

<div class="page">
  <div class="page__inner">
    <header class="header">
      <div class="header__inner">
      </div>
    </header>
    <nav class="nav">
      <div class="nav__inner">
      </div>
    </nav>
    <main class="wrapper">
      <div class="wrapper__inner">
        <div class="content">
          <div class="content__inner">
          </div>
        </div>
        <div class="sidebar">
          <div class="sidebar__inner">
          </div>
        </div>
      </div>
    </main>
    <footer class="footer">
      <div class="footer__inner">
      </div>
    </footer>
  </div>
</div>

Hangisi o kadar da uzak değil:

<div id="main-wrapper">
    <header>
    </header>
    <nav>
    </nav>
    <article>
    </article>
    <footer>
    </footer>
</div>

Altbilgiyi sabitlemenin püf noktası, altbilginin, içerdiği öğenin alt dolgusuna sabitlenmesidir. Bu , altbilgi yüksekliğinin sabit olmasını gerektirir , ancak altbilgilerin tipik olarak statik yükseklikte olduğunu buldum.

HTML:
<div id="main-wrapper">
    ...
    <footer>
    </footer>
</div>
CSS:
#main-wrapper {
    padding: 0 0 100px;
    position: relative;
}

footer {
    bottom: 0;
    height: 100px;
    left: 0;
    position: absolute;
    width: 100%;
}

Altbilgi sabitlendiğinde, altbilgisi daha uzun olmadıkça, artık en azından sayfanın yüksekliğinde #main-wrapperolmanız gerekir #main-wrapper. Bu yaparak yapılır #main-wrapperbir var min-heightbir 100%. Ayrıca kendi ebeveynleri, hatırlamak zorunda htmlve bodyihtiyaç yanı sayfa olarak uzun boylu gibi olması.

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

#main-wrapper {
    min-height: 100%;
    padding: 0 0 100px;
    position: relative;
}

footer {
    bottom: 0;
    height: 100px;
    left: 0;
    position: absolute;
    width: 100%;
}

Tabii ki, bu kod altbilginin içerik olmadığında bile sayfanın altından düşmesine neden olduğu için benim kararımı sorgulamalısınız. Geçen hile kullandığı kutu modelini değiştirmek için #main-wrapperböylece min-heightbir 100%içermektedir 100pxdolguyu.

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

#main-wrapper {
    box-sizing: border-box;
    min-height: 100%;
    padding: 0 0 100px;
    position: relative;
}

footer {
    bottom: 0;
    height: 100px;
    left: 0;
    position: absolute;
    width: 100%;
}

Ve işte orada, orijinal HTML yapınızın olduğu yapışkan bir altbilgi var. Sadece emin olmak footer'ın heighteşittir #main-wrappers' padding-bottomve set olmalıdır.


* Fait'in yapısında hata bulmamın sebebi , gereksiz bir eleman eklerken .footerve .headerelemanlarını farklı hiyerarşik seviyelerde ayarlamasıdır .push.


Eklemem gerekiyordu #main-wrapper *:first-child { margin-top: 0; }, aksi takdirde sayfa ilk çocuğun üst kenar boşluğuna göre çok uzun olurdu (kısa sayfalarda gereksiz bir kaydırma çubuğuna neden olur).
Florian Brucker

Teşekkürler, @zzzzBov bu kapsamlı açıklama için ve özellikle esnek yönden bahsettiğiniz için (keşke bunu daha önce bulmuş olsaydım - bana birkaç saat kazandırırdı! :)
ea0723

Flexbox sürümü IE11'de benim için çalışmıyor, ancak diğer yaklaşım benim için uygun! Teşekkürler ve +1!
Matt

@Matt, flexbox'ın IE11'de çalışması için tarayıcı öneklerini kullanmanız gerekir. autoprefixer gibi bir araç kullanın ve bunları manuel olarak eklemek için asla endişelenmenize gerek kalmayacak.
zzzzBov

2
Yapışkan altbilgi bağlantısı, sitesinin kendisi için bir In Memoriam bildirimine dönüştürülmesi nedeniyle bozulmuş görünüyor. Ek olarak, robots.txt
tzrlk

13

Ryan Fait'in yapışkan altbilgisi , geçmişte defalarca kullandığım basit bir çözüm.

Temel HTML :

<div class="wrapper">
    <div class="header">
        <h1>CSS Sticky Footer</h1>
    </div>
    <div class="content"></div>
    <div class="push"></div>
</div>
<div class="footer"></div>

CSS :

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
.footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}

/*

Sticky Footer by Ryan Fait
http://ryanfait.com/

*/

Bunu halihazırda sahip olduğunuz sonuçlara benzer olacak şekilde çevirmek, şu satırlarda bir şeylerle:

HTML :

<body>
    <div class="wrapper">
        <header>
        </header>
        <nav>
        </nav>
        <article>
        </article>
        <div class="push"></div>
    </div>
    <footer>
    </footer>
</body>

CSS:

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}

Altbilginizin yüksekliğiyle eşleşecek şekilde sarmalayıcı kenar boşluğundaki negatifi güncellemeyi ve div düğmesini itmeyi unutmayın. İyi şanslar!


4
Altbilgi çözümüne uygun olan yorumu en alta koyma şeklini seviyorum: D
Madara's Ghost

Bu özel stil için işaretlemeyi değiştirmeye gerek yoktur.
zzzzBov

@zzzzBov Şu anda buna daha fazla bakmak için fazla zamanım yok, ama tam olarak ne demek istiyorsun?
Josh Mein

Mobil ATM'mdeyim, bu yüzden tam bir cevap yazamam, aksi takdirde bunu çoktan yapardım. Yorum daha fazlaydı, bu yüzden daha sonra bir cevap eklemeyi hatırlardım.
zzzzBov

@JoshMein, sağlanan yapıyla uğraşmadan altbilginin nasıl yapıştırılacağını açıklayan bir yanıt ekledim.
zzzzBov

0

Bu sorunu herhangi bir ek işaret eklemeden çözmeye çalışıyordum, bu yüzden aşağıdaki çözümü kullandım:

article {
  min-height: calc(100vh - 150px); /* deduct the height or margins of any other elements within wrapping container*/
}

footer {
  height: 50px;
}

header {
   height: 50px;
}

nav {
  height: 50px;
}
<body>
  <div id="main-wrapper">
    <header>
    </header>
    <nav>
    </nav>
    <article>
    </article>
    <footer>
    </footer>
  </div>
</body>

Makalenin minimum yüksekliğini ayarlayabilmek için üstbilgi, gezinme ve altbilgi yüksekliklerini bilmeniz gerekir. Bununla, makale yalnızca birkaç satır içeriğe sahipse, altbilgi tarayıcı penceresinin altına yapışır, aksi takdirde tüm içeriğin altına düşer.

Bunu ve yukarıda yayınlanan diğer çözümleri burada bulabilirsiniz: https://css-tricks.com/couple-takes-sticky-footer/

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.