如果你想要一個填滿整頁的容器 div,確保你有這些:
/* 覆蓋瀏覽器預設 */
html,
body {
margin: 0;
padding: 0;
}
/* 使用視口相對單位以完全覆蓋頁面 */
body {
height: 100vh;
width: 100vw;
}
/* 將邊框和內距包含在元素的寬度和高度中 */
* {
box-sizing: border-box;
}
/* 填滿整個頁面的容器 */
div {
height: 100%;
width: 100%;
/* 示例內距、字型大小、背景等 */
padding: 10px;
font-size: 20px;
background-color: lightskyblue;
}
div {
height: 100%;
width: 100%;
font-size: 20px;
background-color: lightskyblue;
}
什麼?!這樣不行!高度仍然只佔用內容,而不是整個頁面。
寬度是可以的,因為 div 預設就是一個區塊元素,無論如何都會佔用盡可能多的寬度。
px
呢?div {
/* height: 100% */
height: 865px; /* 當前瀏覽器的高度 */
/* ... */
}
這樣可以工作……直到瀏覽器被調整大小。
當瀏覽器調整大小時,它並不會自動適應。
你可以使用 JS 來實現,但那對我們的需求來說過於繁瑣。
我提到
px
是「絕對的」,但僅僅是相對於其他任何東西(如 rem 和 vh)而言。實際的大小仍然取決於設備。以下是一些詳細資訊:
Stack Overflow: CSS 像素真的是一個絕對單位嗎?
height: 100%
html,
body {
height: 100%;
width: 100%;
}
div {
height: 100%;
/* ... */
}
工作了!(我們稍後會修正捲軸條)
通過將 <html>
和它的子元素 <body>
設置為 100% 的高度,我們達到了全尺寸。
請注意,僅設置其中一個不會起作用,因為百分比總是相對於其他值。
在這種情況下:
div
是 body
的 100% 高度body
是 html
的 100% 高度html
是視口的 100% 高度視口是瀏覽器的可見區域,根據設備而異。
視口 >
html
>body
>div
例如,iPhone 6/7/8 的視口為 375x667。你可以在瀏覽器的開發者工具的手機選項中驗證這一點。
目前,你可以將視口視為設備的像素大小或解析度。但如果你想深入了解:
Media Genesis: 螢幕大小、解析度與視口:這一切意味著什麼?
vh
和 vw
視口百分比長度,也就是視口單位,已經存在一段時間了,非常適合響應瀏覽器的大小調整。
1vh
) = 視口高度的 1%1vw
) = 視口寬度的 1%換句話說,100vh
= 視口高度的 100%
100vw
= 視口寬度的 100%
所以這樣可以有效地填滿設備的視口。
html,
body {
/* height: 100%; */
/* width: 100% */
}
div {
/* height: 100%;
width: 100%; */
height: 100vh;
width: 100vw;
/* ... */
}
看起來也不錯!(我們稍後會修正捲軸條)
正如 @angelsixuk 和 @mpuckett 的評論中所提到的,在使用
100vh
的行為中會出現眶重的現象,這是一個問題但被 WebKit 認為是故意的。詳情請參見這些連結:某些行動瀏覽器中視口高度高於可見部分的文件 以及 Stack Overflow: CSS3 100vh 在行動瀏覽器中不是常數
min-height: 100vh
如何?雖然 height
將長度固定在 100vh
,但 min-height
從 100vh
開始,但允許內容超出該長度。如果內容少於指定的長度,則 min-height
對其沒有影響。
換句話說,min-height
確保該元素至少達到該長度,如果定義的 height
小於 min-height
,則覆蓋 height
。
對於我們目標中子 div 擁有全高度和寬度來說,這沒有任何差別,因為內容也是全尺寸的。
min-height
的一個好用例是在頁面上有更多內容時可以推動的黏性底部。這裡查看這裡以及其他 vh 的好用法
Fun with Viewport Units | CSS-Tricks
height: 100vh
和 width: 100vw
應用到 <body>
...在這種情況下,我們甚至可以保持容器 div
的相對大小,就像一開始那樣,以防我們稍後改變主意。
通過這種方法,我們確保整個 DOM 的 body 占據全高和寬,無論我們的容器 div 如何。
body {
height: 100vh;
width: 100vw;
}
div {
height: 100%;
width: 100%;
/* height: 100vh;
width: 100vw; */
/* ... */
}
vh/vw
與 %
vh, vw
與 %
的一個好的思考方式是它們類似於 em
和 rem
%
和 em
都相對於父元素的大小,而 vw/vh
和 rem
都相對於「最高參考」,rem 的根字型大小和設備視口的 vh/vw。
<html>
和 <body>
有預設的邊距和內距!瀏覽器為 HTML 元素提供了預設的邊距、內距和邊框。而最糟糕的部分是這對於每個瀏覽器的值都不同!
Chrome 預設對 <body>
的邊距是 8px
並且 100vh + 8px
造成溢出,因為這超出了視口
幸運的是,這很容易解決:
html,
body {
margin: 0;
padding: 0;
}
body {...
這是一個「總體」解決方案,可以覆蓋你所可能遇到的任何瀏覽器的所有邊距和內距變體。
最後,讓我們增加一點內距,因為內容緊貼邊緣有點尷尬。
div {
padding: 10px;
/* ... */
}
什麼?!捲軸條回來了!發生了什麼事?
box-sizing
border-boxbox-sizing
允許你定義 內距和邊框 是否被包含在 div 的高度和寬度中。
box-sizing
的預設值 content-box
不包含內距和邊框在長度中,因此 div 變成
height = 100% + 10px * 2
width = 100% + 10px * 2
這使頁面溢出!
border-box
包含內距和邊框,因此 div 保持在我們所需的尺寸:
height = 100%
width = 100%
將所有元素設置為 border-box
是很常見的做法,以保持頁面布局和大小的一致性,使用 *
選擇器:
* {
box-sizing: border-box;
}
原文出處:https://dev.to/lennythedev/css-gotcha-how-to-fill-page-with-a-div-270j