CSS + DIV 让页脚始终底部

1、利用 bottom 属性?

在实践之前,很容易联想到用 CSS 里面的 bottom 属性让页脚在最下面,可是这个是行不通的。如果使用了如下方法:

 

 

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. footer  
  2. {  
  3.   bottom: 0px;  
  4. }  

我可以很诚实地告诉你,写了根没写压根就没区别。因为版面默认用的是 “position: relative;”,这会让版面从上至下地排布,而不能够独立地让 footer 始终在页面的最底部。

 

 

position: fixed?

那么自然就会想说,那如果用“position: fixed;”属性呢?

 

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. footer  
  2. {  
  3.   position: fixed;  
  4.   bottom: 0px;  
  5. }  

这个也是不行的,因为“fixed”会让 div 相对浏览器,而非页面。那么出现的情况将是无论怎么移动页面,始终都有一个 footer 在浏览器的底部,不甚美观。

 

 

position: absolute?

这个也是不行的。用了这个属性,会有一种初始化的效果,让 footer 一开始就在浏览器的最底部,然后你拉动页面,它不会落到页面最低部,而是上去了。实际上就是与其他网页内容产生了重叠。这个也是绝对不允许的。

 

 

 

2、解决方法

在解决的时候,我查了相当多的资料。如果用纯 CSS 的话,似乎都指向一种叫 Sticky Footer的方法。不过网上的基本都是抄来抄去,只有代码,没有解释什么的,我就不吐嘈了。

 

原理解析

这种方法的原理很简单,用到了 2 个属性:min-height 和 margin。

其中,min-height 都有个很奇特的属性值:100%。这个属性值是指当前浏览器窗口的高度,实际上就是能显示的最大高度(一个屏幕的高度)了。那么自然可以联想到,如果将内容部分设成“min-height: 100%”,就能够将内容部分占有一个屏幕的高度,那么页脚起码会在屏幕的外面。只要稍加改进,便能融入 Header、Content、Footer 这三个部分,并使得 Footer 起码在屏幕的最底部,而且当内容长度增加时,会在页面的最后面,而不至于遮挡内容。

可是要注意的是,“100%”的这个属性对于“height”或者“min-height”来说有点奇怪,它在使用之前貌似要对“100%”的定义进行初始化。而我们知道,“html”这个结点是沾满一个屏幕的,那么就要先写这样的内容:

 

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. body, html  
  2. {  
  3.   height: 100%;  
  4. }  

一个值得关注的是,如果我们用的是 ASP.NET 框架,因为它是基于 form 的,所以仅仅设置 body 和 html 还不够,还要设置 form 的相应属性

 

 

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. form  
  2. {  
  3.   height: 100%;  
  4. }  

而为了页眉与页脚紧贴浏览器边框,我们还要设置相关的 margin 与 padding 为 0,以防止空隙的出现。而为了简单起见,就对全局所有的容器都设置这样的一个默认值吧。

 

 

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. *  
  2. {  
  3.   margin: 0;  
  4.   padding: 0;  
  5. }  

 

好了,到了这里就可以放心地去用“min-height: 100%;”了。

那么怎么解决在内容很少的时候,页脚能够显示在浏览器的最底部,而不是什么情况都被置于一个屏幕的高度之外呢?

可能看到上面的第 2 个我说的要使用的属性,大家就大概明白了。对,就是用 margin 这个属性。不过要声明的一点是,下面的方法用到了一些不太符合规范的方法,就是加多了一个空 div 用作显示格式定制,而其本身不起任何作用。

先看看网页的 html 文本来了解一下框架吧:

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <div class="Wrapper">  
  2.   <div class="Header"></div>  
  3.   <div class="Content"></div>  
  4.   <div class="FooterPush"></div>  
  5. </div>  
  6. <div class="Footer"></div>  

可见,页眉与内容都被一个叫“Wrapper”的容器包着,然后在他们后面有个叫“FooterPush”的东西,其实这个就是我之前说的仅用于控制显示格式的空 div 了。然后,Footer 是置于所有内容之外的。

然后我们这样思考:如果 FooterPush 的高度与 Footer 相同,然后 Footer 有一个“margin-top”的属性,它的值是 Footer 的高度的负值,即例如 Footer 的高度是 120px,然后:

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. .Wrapper .FooterPush  
  2. {  
  3.   height: 120px;  
  4. }  
  5.                              
  6. .Footer  
  7. {  
  8.   margin-top: -120px;  
  9.   height: 120px;  
  10. }  

那么发生的情况将会非常神奇,实际上就是 Footer 刚好就覆盖在 FooterPush 的上面了。那么这个时候,我们只要将 Wrapper 的高度设为“100%”,这样所有的东西就至少能够在一个屏幕内现实完毕了。

这样,就能够达到当内容少时,Footer 最高能够在一个屏幕的最底部显示;而当内容比较长的时候,Footer 能够很乖巧地在所有内容的后面,而不至于遮挡内容。

OK,大工告成了吧!那我就贴个完整些的代码吧。

 

完整代码

Html:

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <body>  
  2. <form<!-- 如果用的是 Asp.Net 就可能会有这个结点 -->  
  3.   <div class="Wrapper">  
  4.     <div class="Header"></div>  
  5.     <div class="Content"></div>  
  6.     <div class="FooterPush"></div>  
  7.   </div>  
  8.   <div class="Footer"></div>  
  9. </form>  
  10. </body>  

CSS:

 

[css] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. *  
  2. {  
  3.   margin: 0;  
  4.   padding: 0;  
  5. }  
  6.      
  7. html, body, form  
  8. {  
  9.   height: 100%;  
  10. }  
  11.      
  12. .Wrapper  
  13. {  
  14.   min-height: 100%;  
  15. }  
  16.      
  17.   .Wrapper .FooterPush  
  18.   {  
  19.     height: 120px; /* Footer 的高度 */  
  20.   }  
  21.      
  22. .Footer  
  23. {  
  24.   clear: both; /* 清除浮动元素格式 */  
  25.   position: relative;  
  26.   margin-top: -120px; /* Footer 高度的负值 */  
  27.   height: 120px;  
  28. }  
posted @ 2017-02-27 19:09  我爱吃小丸子  阅读(15665)  评论(0编辑  收藏  举报