CSS para hacer que el pie de página de la página HTML permanezca en la parte inferior de la página con una altura mínima, pero no se superponga a la página

Tenía la siguiente página (deadlink: http://www.workingstorage.com/Sample.htm ) que tiene un pie de página que no puedo hacer se sienta en la parte inferior de la página.

Quiero que el pie de página

  • pegarse a la parte inferior de la ventana cuando la página es corta y la pantalla no está llena, y
  • permanezca en el extremo del documento y baje de forma normal cuando hay más de una pantalla llena de contenido (en lugar de superponer el contenido).

El CSS es heredado y me confunde; Parece que no puedo cambiarlo correctamente para poner una altura mínima en el contenido o hacer que el pie de página vaya al fondo.

Un método simple es hacer que el cuerpo sea el 100% de tu página, con una min-height del 100% también. Esto funciona bien si la altura de su pie de página no cambia.

Dale al pie de página un margen negativo superior:

 #footer { clear: both; position: relative; z-index: 10; height: 3em; margin-top: -3em; } 

Un enfoque muy simple que funciona bien en el navegador cruzado es este:

http://matthewjamestaylor.com/blog/ keeping-footers-at-the-bottom-of-the-page

HTML

 

CSS

 html, body { margin:0; padding:0; height:100%; } #container { min-height:100%; position:relative; } #header { background:#ff0; padding:10px; } #body { padding:10px; padding-bottom:60px; /* Height of the footer */ } #footer { position:absolute; bottom:0; width:100%; height:60px; /* Height of the footer */ background:#6cf; } 

He desarrollado un método bastante fácil para pegar el pie de página en la parte inferior, pero como métodos más comunes, tendrás que modificarlo para que se ajuste a la altura de tu pie de página.

VER DEMO

Este método a continuación utiliza un “truco” al colocar un pseudo-elemento ::after en el body y configurarlo para que tenga la altura exacta del pie de página, de modo que ocupe exactamente el mismo espacio que el pie de página, de modo que cuando el pie de página esté posición absolute sobre él, parecería que el pie de página realmente ocupa espacio y elimina los efectos negativos de su posición absoluta (por ejemplo, revisar el contenido del cuerpo)

HTML (marcado común básico)

 html{ height:100%; } body{ min-height:100%; padding:0; margin:0; position:relative; } header{ height:50px; background:lightcyan; } footer{ background:PapayaWhip; } /* Trick: */ body { position: relative; } body::after { content: ''; display: block; height: 50px; /* Set same as footer's height */ } footer { position: absolute; bottom: 0; width: 100%; height: 50px; } 
  
Header
Content
Footer

Desde IE7 en adelante puedes simplemente usar

 #footer { position:fixed; bottom:0; } 

Ver caniuse para soporte.

Una solución simple que uso, funciona desde IE8 +

Proporcione min-height: 100% en html, de modo que si el contenido es menor, la página estática toma toda la altura del puerto de visualización y el pie de página en la parte inferior de la página. Cuando el contenido aumenta, el pie de página se desplaza hacia abajo con el contenido y sigue pegado al fondo.

Demostración de JS violín trabajando: http://jsfiddle.net/3L3h64qo/2/

Css

 html{ position:relative; min-height: 100%; } /*Normalize html and body elements,this style is just good to have*/ html,body{ margin:0; padding:0; } .pageContentWrapper{ margin-bottom:100px;/* Height of footer*/ } .footer{ position: absolute; bottom: 0; left: 0; right: 0; height:100px; background:#ccc; } 

Html

    

Lo he usado para pegar el pie de página en la parte inferior y funcionó para mí:

HTML

  

Esa es la única modificación que tienes que hacer en el HTML, agrega ese div con la clase "allButFooter" . Lo hice con todas las páginas, las que eran tan cortas, sabía que el pie de página no se pegaría al fondo, y también las páginas el tiempo suficiente para que ya supiera que tenía que desplazarme. Hice esto, así que pude ver que funciona bien en el caso de que el contenido de una página sea dynamic.

CSS

 .allButFooter { min-height: calc(100vh - 40px); } 

La clase "allButFooter" tiene un valor de min-height que depende de la altura de la ventana 100vh ( 100vh significa el 100% de la altura de la ventana 100vh ) y la altura del pie de página, que ya sabía que era de 40px .

Eso es todo lo que hice, y funcionó perfectamente para mí. No lo he probado en todos los navegadores, solo Firefox, Chrome y Edge, y los resultados fueron los que yo quería. El pie de página se pega a la parte inferior, y no tiene que meterse con el índice Z, la posición o cualquier otra propiedad. La posición de cada elemento en mi documento era la posición predeterminada, no la cambié a absoluta o fija ni a nada.

Trabajando con un diseño receptivo

Aquí hay algo que me gustaría aclarar. Esta solución, con el mismo pie de página que tenía 40px de alto, no funcionó como esperaba cuando estaba trabajando en un diseño receptivo usando Twitter-Bootstrap . Tuve que modificar el valor que estaba restando en la función:

 .allButFooter { min-height: calc(100vh - 95px); } 

Esto es probablemente porque Twitter-Bootstrap viene con sus propios márgenes y almohadillas, por eso tuve que ajustar ese valor.

¡Espero que esto les sirva de algo! Al menos, es una solución simple de probar, y no implica hacer grandes cambios en todo el documento.

Una cosa de la que debemos desconfiar es en los dispositivos móviles, ya que implementan la idea de la ventana gráfica de una manera “inusual”:

http://developer.apple.com/library/ios/#documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html#//apple_ref/doc/uid/TP40006509-SW25

Como tal, usando la position: fixed; (como he visto recomendado en otros lugares) por lo general no es el camino a seguir. Por supuesto, depende del comportamiento exacto que busca.

Lo que he usado y funcionó bien en computadoras de escritorio y dispositivos móviles es:

    

con

 body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; padding: 0; margin: 0; } #footer { position: absolute; bottom: 0; } 

Sin embargo, otra solución realmente simple es esta:

 html, body { height: 100%; width: 100%; margin: 0; display: table; } footer { background-color: grey; display: table-row; height: 0; } 

jsFiddle

El truco es usar una display:table para todo el documento y display:table-row con height:0 para el pie de página.

Como el pie de página es el único niño del cuerpo que tiene una pantalla como table-row , se representa en la parte inferior de la página.

Mi método jquery, este pone el pie de página en la parte inferior de la página si el contenido de la página es menor que el alto de la ventana, o simplemente pone el pie de página después del contenido de otra manera:

Además, mantener el código en su propio gabinete antes de otro código reducirá el tiempo que lleva reposicionar el pie de página.

 (function() { $('.footer').css('position', $(document).height() > $(window).height() ? "inherit" : "fixed"); })(); 

Yo mismo he estado investigando este problema. He visto bastantes soluciones y cada una de ellas tenía problemas, a menudo con algunos números mágicos.

Entonces, al usar las mejores prácticas de varias fonts, se me ocurrió esta solución:

http://jsfiddle.net/vfSM3/248/

Lo que quería lograr específicamente aquí era conseguir que el contenido principal se desplazara entre el pie de página y el encabezado dentro del área verde.

aquí hay un simple CSS:

 html, body { height: 100%; margin: 0; padding: 0; } header { height: 4em; background-color: red; position: relative; z-index: 1; } .content { background: white; position: absolute; top: 5em; bottom: 5em; overflow: auto; } .contentinner { } .container { height: 100%; margin: -4em 0 -2em 0; background: green; position: relative; overflow: auto; } footer { height: 2em; position: relative; z-index: 1; background-color: yellow; } 

Esto se conoce como un pie de página adhesivo. Una búsqueda en Google para él produce muchos resultados. Un CSS Sticky Footer es el que he usado con éxito. Pero hay más.

aquí están mis dos centavos. En comparación con otras soluciones, no es necesario agregar contenedores adicionales. Por lo tanto, esta solución es un poco más elegante. Debajo del ejemplo del código, explicaré por qué funciona esto.

     test    
header
footer

Entonces, lo primero que hacemos es crear el contenedor más grande (html) al 100%. La página html es tan grande como la página misma. A continuación establecemos la altura del cuerpo, puede ser más grande que el 100% de la etiqueta html, pero al menos debe ser tan grande, por lo tanto, usamos la altura mínima del 100%.

También hacemos que el cuerpo sea relativo. Relativo significa que puede mover el elemento de bloque alrededor de su posición original relativa. No usamos eso aquí sin embargo. Porque el pariente tiene un segundo uso. Cualquier elemento absoluto es absoluto a la raíz (html) o al primer padre / abuelo relativo. Eso es lo que queremos, queremos que el pie de página sea absoluto, en relación con el cuerpo, es decir, el fondo.

El último paso es establecer el pie de página en absoluta e inferior: 0, que lo mueve al final del primer padre / abuelo que es relativo (por supuesto, el cuerpo).

Ahora todavía tenemos un problema que corregir, cuando completamos la página completa, el contenido va por debajo del pie de página. ¿Por qué? bien, porque el pie de página ya no está dentro del “flujo html”, porque es absoluto. Entonces, ¿cómo arreglamos esto? Añadiremos relleno al cuerpo. Esto asegura que el cuerpo en realidad es más grande que su contenido.

Espero haber dejado mucho en claro para ustedes, chicos.

Hacer esto

 

También puede leer sobre flex que es compatible con todos los navegadores modernos

Actualización : leí sobre flexión y lo intenté. Funcionó para mí Espero que haga lo mismo por ti. Aquí es cómo lo implementé. Aquí el main no es el ID, es el div

 body { margin: 0; display: flex; min-height: 100vh; flex-direction: column; } main { display: block; flex: 1 0 auto; } 

Aquí puede leer más acerca de flex https://css-tricks.com/snippets/css/a-guide-to-flexbox/

Tenga en cuenta que no es compatible con versiones anteriores de IE.

Así es como resolví el mismo problema

 html { height: 100%; box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; } body { position: relative; margin: 0; padding-bottom: 6rem; min-height: 100%; font-family: "Helvetica Neue", Arial, sans-serif; } .demo { margin: 0 auto; padding-top: 64px; max-width: 640px; width: 94%; } .footer { position: absolute; right: 0; bottom: 0; left: 0; padding: 1rem; background-color: #efefef; text-align: center; } 
 

CSS “Always on the bottom” Footer

I often find myself designing a website where the footer must rest at the bottom of the page, even if the content above it is too short to push it to the bottom of the viewport naturally.

However, if the content is taller than the user's viewport, then the footer should disappear from view as it would normally, resting at the bottom of the page (not fixed to the viewport).

If you know the height of the footer, then you should set it explicitly, and set the bottom padding of the footer's parent element to be the same value (or larger if you want some spacing).

This is to prevent the footer from overlapping the content above it, since it is being removed from the document flow with position: absolute; .

Simplemente configure el html, el cuerpo y las otras filas, excepto el pie de página, al 100%. p.ej

  

el CSS se convierte

 html, body, header, content{ height:100%; } 

Puedes hacerlo

 .footer { position: absolute; right: 0; bottom: 0; left: 0; padding: 1rem; text-align: center; } 

Una solución flexible muy simple que no asume alturas fijas ni cambia la posición de los elementos.

HTML

 

CSS

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

Soporte del navegador

Todos los navegadores principales, excepto IE11 y abajo.

Asegúrese de usar el Prefijo automático para los prefijos apropiados.

 .container { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; min-height: 100vh; } main { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; } ///////////////////////////////////////////// header, main, footer { margin: 0; display: block; } header, footer { min-height: 80px; } header { background-color: #ccc; } main { background-color: #f4f4f4; } footer { background-color: orange; } 
 

Un trazador de líneas dynamic usando jQuery

Todos los métodos de CSS que he encontrado son demasiado rígidos. Además, configurar el pie de página como fixed no es una opción si eso no forma parte del diseño.


Probado en:

  • Chrome: 60
  • FF: 54
  • IE: 11

Asumiendo este diseño:

   

Use la siguiente función jQuery:

 $('#content').css("min-height", $(window).height() - $("#footer").height() + "px"); 

Lo que hace es establecer la min-height #content para #content a la altura de la ventana : la altura del pie de página que sea que pueda ser en ese momento.

Como usamos min-height , si #content height excede la altura de la ventana , la función se degrada graciosamente y no tiene ningún efecto ya que no es necesaria.

Véalo en acción:

 $("#fix").click(function() { $('#content').css("min-height", $(window).height() - $("#footer").height() + "px"); }); 
 * { margin: 0; padding: 0; box-sizing: border-box; } html { background: #111; } body { text-align: center; background: #444 } #content { background: #999; } #footer { background: #777; width: 100%; } 
    

Very short content

Lo he usado en mis muchos proyectos y nunca tuve ningún problema 🙂

para su referencia, el código está en fragmento

 * { margin: 0; } html, body { height: 100%; } .wrapper { min-height: 100%; height: auto !important; /* This line and the next line are not necessary unless you need IE6 support */ height: 100%; margin: 0 auto -50px; /* the bottom margin is the negative value of the footer's height */ background:green; } .footer, .push { height: 50px; /* .push must be the same height as .footer */ } .footer{ background:gold; } 
    Untitled Document   
Content Area