用CSS固定footer在底部的疑問?
【html組織】
& &&
&&
【html組織】
& &&
&&
---------------------------------------------------------------------------------------------------------------------
【問題】不論container和footer的位置屬性設為relative還是absolute,都不會影響到最終結果。請問正確的位置屬性設置方法是怎樣?這個是css中比較經典的問題。
這裡固定在底部包括兩種情況,第一種是當頁面內容尚未填充滿的時候,頁腳需要固定在底部,第二種是頁面填充滿後,頁腳需要隨頁面內容的增加而填充在主體內容的下方。
由於受書寫模式的影響,一般情況下無法直接將一元素置於垂直的某一位置,除非使之脫離普通流。而脫離普通流後就很難滿足第二種要求,這種情況下也可藉助js進行計算進行定位,但這種效果可能由於計算時間和瀏覽器渲染的問題發生跳動(沒親自試過)。因此,這裡提供一種比較通用的,基於普通文檔流的解決方法。
具體解決方案:直接來代碼。&
&
&
思路就是創建一個足夠大的容器wrap包含整個網頁,並將footer擠到底端,通過設置margin-top:-30px使之上浮,並在main中設置padding-bottom使之能夠容下頁腳而不重疊。
第一次回答問題,難免有點小錯誤,望指正。
-----------分割線-----------
寫完答案後才發現答非所問了,之前沒將問題展開,囧。
先引用一段定位的小知識,來自:w3school:absolute生成絕對定位的元素,相對於 static 定位以外的第一個父元素進行定位。
relative元素框偏移某個距離。元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。生成相對定位的元素,相對於其正常位置進行定位。
不論container設置為哪種定位,只要不是static,footer設置為absolute時,位置是與container的初始位置進行偏移,relative時相對正常位置進行偏移。
希望這個能夠幫助到你。footer放置的最好情況:
1.頁面內容少,無法撐開,在可視窗口最底部
2.頁面內容多,在頁面最底部
Demo
position:
* fixed 固定在可視窗口最底部
* absolute 顯示在可視窗口的最底部
* relative 顯示在頁面的最底部 (和什麼都不寫一樣,因為內容會直接將footer擠在底部)
缺點:使用position,不能在內容多的時候顯示
推拉推原理
&> 步驟
1.設置div.wraper高度為整個網頁,
2.將推到下一頁的footer使用margin-bottom拉回
3.為避免設置了負邊距的頁面內容與footer重疊,所以使用
div.push||.main[padding-bottom]||wrapper:after
再次推開footer
為元素設置負外邊距。這會導致元素超出其父元素,或者與其他元素重疊,但並不違反框模型。
div.push寫法
html結構
&
&&
&&
&
&
css結構
/*div.push 寫法*/
html, body {
height: 100%;
}
.wrapper-add{
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -58px; 58px為footer的高度+margin
}
.main[padding-bottom] 寫法
html結構
&
&&
&
&
css結構
/*margin 寫法*/
html, body {
height: 100%;
}
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -58px;
}
.main{
padding-bottom: 58px;
}
.wrapper:after寫法
html結構
&
&&
&
&
css結構
/*after 寫法*/
html, body {
height: 100%;
}
.wrapper{
min-height: 100%;
margin-bottom: -58px;
}
.wrapper:after {
content: "";
display: block;
}
.footer, .wrapper:after {
height: 58px;
}
flex 寫法
html結構
&&
&
css結構
/*flex寫法*/
body {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.main {
flex: 1;
}
注意:vh兼容性表,兼容性還不錯,只是安卓4.3以下都不兼容。
紅色為不兼容 黃色為部分兼容 綠色為兼容
demo
計算高度,設置footer的位置
綜上,如果內容多的話,不去搗鼓footer也行,當內容不確定的時候,推拉推方法可以一直保持在頁面內容的最底部。
參考資料
原文地址:footer的各種寫法
- 對於一個非根元素,如果其position值是relative或static(默認),包含塊的設置為最近的塊級框、表單元格或行內塊祖先框的內容邊界構成。
- 對於一個非根元素,如果其position值是absolute,包含塊則由最近的position值不是static的祖先元素(可以是任何類型)。這個過程如下:
- 如果這個祖先是塊級元素,包含塊則設置為該元素的內邊距邊界;換句話說,就是由邊框界定的區域。
- 如果這個祖先是行內元素,包含塊則設置為該祖先元素的內容邊界。在從左向右讀的語言中,包含塊的上邊界和左邊界是該祖先元素中第一個框內容區的上邊界和左邊界,包含塊的下邊界和右邊界是最後一個框內容區的下邊界和右邊界。
- 如果沒有祖先,元素的包含塊定義為初始包含塊。
當footer的position設置為relative的時候,它的包含塊就是leftcolumn,所以bottom的值設置為負(-100px)表示為遠離leftcolumn下邊框100px。
當footer的position設置為absolute的時候,它的包含塊則為container,它的bottom值(-100px)所對應的是container的下邊框,所以此時footer在container的下面,我照著你給的html和css做了一次,發現和你所說的「不會影響到最終結果」並不一樣,footer的位置確實變化了。而container的position值無論設置成relative還是position,它的包含塊都是初始包含塊,所以沒有變化(這裡是我自己猜的,或者它的包含塊是body?)另外,css中body部分的background少了一個「u」,#leftcolumn部分最後一個屬性少了「;」。本人也是剛學不久,望大家指正~※有沒有前端性能優化知識推薦,包括css和js?
※Web 前端與演算法的結合點在哪裡?
※CSS 優化、提高性能的方法有哪些?