頁布局對改善網站的外觀非常重要。
請慎重設計您的網頁布局。
在線實例
使用 <div> 元素的網頁布局
如何使用 <div> 元素添加布局。
使用 <table> 元素的網頁布局
如何使用 <table> 元素添加布局。
網站布局
大多數網站會把內容安排到多個列中(就像雜志或報紙那樣)。
大多數網站可以使用 <div> 或者 <table> 元素來創建多列。CSS 用于對元素進行定位,或者為頁面創建背景以及色彩豐富的外觀。
雖然我們可以使用HTML table標簽來設計出漂亮的布局,但是table標簽是不建議作為布局工具使用的 - 表格不是布局工具。 |
HTML 布局 - 使用<div> 元素
div 元素是用于分組 HTML 元素的塊級元素。
下面的例子使用五個 div 元素來創建多列布局:
實例
<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><divid="container"style="width:500px"><divid="header"style="background-color:#FFA500;"><h1style="margin-bottom:0;">主要的網頁標題</h1></div><divid="menu"style="background-color:#FFD700;height:200px;width:100px;float:left;"><b>菜單</b><br>HTML<br>CSS<br>JavaScript</div><divid="content"style="background-color:#EEEEEE;height:200px;width:400px;float:left;">內容在這里</div><divid="footer"style="background-color:#FFA500;clear:both;text-align:center;">版權 ? runoob.com</div></div></body></html>
上面的 HTML 代碼會產生如下結果:
HTML 布局 - 使用表格
使用 HTML <table> 標簽是創建布局的一種簡單的方式。
大多數站點可以使用 <div> 或者 <table> 元素來創建多列。CSS 用于對元素進行定位,或者為頁面創建背景以及色彩豐富的外觀。
即使可以使用 HTML 表格來創建漂亮的布局,但設計表格的目的是呈現表格化數據 - 表格不是布局工具! |
下面的例子使用三行兩列的表格 - 第一和最后一行使用 colspan 屬性來橫跨兩列:
實例
<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><tablewidth="500"border="0"><tr><tdcolspan="2"style="background-color:#FFA500;"><h1>主要的網頁標題</h1></td></tr><tr><tdstyle="background-color:#FFD700;width:100px;"><b>菜單</b><br>HTML<br>CSS<br>JavaScript</td><tdstyle="background-color:#eeeeee;height:200px;width:400px;">內容在這里</td></tr><tr><tdcolspan="2"style="background-color:#FFA500;text-align:center;">版權 ? runoob.com</td></tr></table></body></html>
上面的 HTML 代碼會產生以下結果:
HTML 布局 - 有用的提示
Tip: 使用 CSS 最大的好處是,如果把 CSS 代碼存放到外部樣式表中,那么站點會更易于維護。通過編輯單一的文件,就可以改變所有頁面的布局。如需學習更多有關 CSS 的知識,請訪問我們的CSS 教程。
Tip: 由于創建高級的布局非常耗時,使用模板是一個快速的選項。通過搜索引擎可以找到很多免費的網站模板(您可以使用這些預先構建好的網站布局,并優化它們)。
HTML 布局標簽
標簽 | 描述 |
---|---|
<div> | 定義文檔區塊,塊級(block-level) |
<span> | 定義 span,用來組合文檔中的行內元素。 |
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
. 流式定位
這是網頁元素默認的定位方式,網頁元素按照其HTML標簽的先后順序,在網頁內依次顯示,就像液體一樣“流動”,所以稱為“流式定位”,這種方式將所有網頁元素的默認顯示方式分為以下幾種類型:
塊級元素(display: block): 可以設置寬度,默認寬度為100%,但不管多寬都會獨占一行,多個塊級元素按從上到下的順序縱向顯示,默認顯示為塊級元素的包括:段落(p)、層(div)、表單(form)等。
內聯元素(display: inline): 不會獨占一行,可以多個元素共享一行,按從左至右的順序橫向顯示,默認顯示為內聯元素的包括:文本標簽(label)、鏈接(a)等。
行內塊元素(display: inline-block): 這種定位方式兼具塊級元素和內聯元素的優勢,既可以像塊級元素一樣設置寬度和高度,又可以一行放置多個,默認顯示為內聯元素的包括:圖片(img)、輸入項(input)、多行文本(textarea)等。
可以通過設置HTML元素的CSS樣式的display屬性來改變元素默認的流式定位方式,例如將層(div)元素設置為行內塊元素后,就可以跟文本標簽(label)、圖片(img)等元素放在同一行顯示,不再獨占一行。
流式定位存在一些問題,主要包括:
l 塊級元素很難被有效利用起來,因為其獨占一行的特性,不能一行顯示多個。
l 內聯元素無法設置寬度、高度和垂直方向邊距,不好精確控制元素大小和顯示位置。
l 內聯元素之間水平方向會因為代碼中的空格、換行等產生間隙,垂直方向存在默認的底部間隙,這給水平布局帶來額外的麻煩。
2. 浮動定位
浮動定位會讓元素脫離原來的標準文檔流浮動起來,直至它的外邊緣遇到父元素的內邊緣或者另一個兄弟浮動元素的外邊緣。
任何HTML元素都可以設置為浮動,可以通過設置HTML元素的CSS樣式的float屬性來設置具體的浮動方式,可以選擇向左浮動(float: left)或向右浮動(float: right)。
相對于網頁默認的流式定位,浮動定位有以下優勢:
l 多個塊級元素可以共享一行。
l 內聯元素可以設置寬度和高度。
l 元素之間的空格、換行不影響元素的顯示位置。
浮動定位最初被設計出來是為了實現文字環繞圖片顯示的效果,但由于其上述優勢,后來大家也用浮動定位來設置更多網頁元素的位置,代替默認的流式定位,也是TaskBuilder默認的組件定位方式。
不過,浮動定位也有一些問題,不是所有的場合都適合,大家根據需要選擇,這些問題包括:
l 居中對齊問題:浮動定位不太好實現垂直和水平居中對齊。
l 父元素的高度塌陷問題:如果元素不浮動,會自動撐開父元素的高度,浮動后,由于浮動元素已經脫離原來的標準流,如果父元素沒有設置高度,且父元素中沒有其他非浮動元素時,會造成父元素的高度塌陷(高度變成了0)。
3. 坐標定位
坐標定位是指為HTML元素設置上下左右的偏移量來確定其具體的顯示位置或大小,通過設置元素CSS的position屬性,可以選擇坐標定位的具體方式,包括:
相對定位(position: relative):即相對于元素在流式定位時的正常位置進行定位,您可以通過 top、right、bottom、left 這 4 個CSS屬性來設置元素相對于正常位置的偏移量,在此過程中不會對其它元素造成影響。
相對定位示意圖
絕對定位(position: absolute):即相對于第一個非靜態定位的父級元素進行定位,可以通過 top、right、bottom、left 這 4 個屬性來設置元素相對于父級元素位置的偏移量。如果沒有滿足條件的父級元素,則會相對于瀏覽器窗口來進行定位。元素使用絕對定位后,其他標準流元素會填補它的位置。絕對定位可以通過設置元素CSS樣式的left和top屬性來精確控制元素的顯示位置,再設置right或bottom這兩個CSS樣式,實現元素的寬度或高度根據父元素的寬度和高度動態設置和變化。
絕對定位示意圖
固定定位(position: fixed):即相對于瀏覽器的窗口進行定位,可以使用 top、right、bottom、left 這 4 個CSS屬性來定義元素相對于瀏覽器窗口的位置。使用固定定位的元素無論如何滾動瀏覽器窗口,元素的位置都是固定不變的。
粘性定位(position: sticky):它是相對定位和固定定位的結合體,能夠實現類似吸附的效果,當滾動頁面時它的效果與相對定位相同,當元素要滾動到屏幕之外時則會自動變成固定定位的效果。用粘性定位很容易實現元素置頂顯示的效果。
4. 表格定位
顧名思義,表格定位就是用表格來實現網頁內容的定位,先繪制一個多行多列的表格,并設定表格各列的寬度和各行的高度,然后在表格的單元格里插入相關網頁元素,最終實現這些元素的位置定位。
這種定位方式比較適合可以將頁面內容清晰明確地劃分為多行多列的場景,例如各種業務單據和數據報表等。
有兩種方式可以實現表格布局: HTML Table(<table>標簽)和CSS Table(display:table 等相關屬性)。HTML Table是早期網頁設計采用的表格定位方式,由于其渲染性能較低,且有些界面效果較難實現,用的人已經比較少了,現在推薦使用CSS Table,能實現一些HTML Table做不到的效果。
目前,TaskBuilder只是在報表設計器里集成了一個第三方的表格插件,在前端tfp頁面設計器里,還沒有提供表格定位相應的容器組件,未來會提供。(現有的可編輯表格和數據表格不是用來為其他組件提供定位的,所以不能算作是表格定位的容器組件)
5. 彈性定位
彈性定位又叫彈性布局,這種定位方式最大的特點就是可以讓子元素的大小可以根據父元素的大小自動擴張或收縮,從而可以做到自動適應不同終端的屏幕尺寸,或者在用戶改變瀏覽器窗口大小時自動伸縮。
這種定位方式需要先將一個父元素的CSS屬性display設置為flex,然后該元素里的子元素即可實現彈性定位。
采用彈性定位的容器元素可以設置以下CSS樣式:
元素排列方向(flex-direction):用來設置子元素的排列方向,有四種方式可以選擇:從左到右顯示(row)、從右到左顯示(row-reverse)、從上到下顯示(column)、從下到上顯示(column-reverse)。
元素水平對齊方式(justify-content):用來設置子元素在水平方向的對齊方式,可以選左對齊(flex-start)、右對齊(flex-end)、居中對齊(center)、兩端對齊(space-between)和等距對齊(space-around)。
元素垂直對齊方式(align-items):用來設置子元素在垂直方向的對齊方式,可以選頂部對齊(flex-start)、底部對齊(flex-end)、居中對齊(center)、基線對齊(baseline)、自動伸展(stretch)。
內容整體對齊方式(align-content):當有多行子元素時,可以用該屬性設置全部子元素整體的垂直對齊方式,包括自動拉伸(stretch)、在容器的頂部排列(flex-start)、在容器的底部排列(flex-end)、在容器內居中排列(center)、均勻分布,上下靠邊(space-between)、均勻分布,每行等距(space-around)。
元素是否自動換行(flex-wrap):用來設置子元素是否自動換行。
彈性定位容器內的子元素可以設置以下CSS樣式:
擴展量(flex-grow):必須參數,用來設置當前元素相對于其他元素的增長量,默認值為 0,即如果存在剩余空間,也不自動放大。
如果所有元素的擴展量都設置為1,將等分剩余空間。如果一個元素的擴展量設置為2,其他元素都為1,則前者占據的剩余空間將是其他項的2倍,如下圖所示:
收縮量(flex-shrink):必須參數,用來設置當彈性容器空間不足時,該元素相對于其他元素的收縮量,默認值為 1。如果所有元素的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個元素的flex-shrink屬性為0,其他元素都為1,則空間不足時,前者不縮小。
基準長度(flex-basis):必須參數,元素的基準長度定義了父容器在分配多余空間之前,當前元素占據的主軸空間(main size,如果是橫向排列,則指父容器在水平方向的空間,如果是縱向排列,則指父容器在垂直方向的空間)。瀏覽器根據這個屬性,計算主軸是否有多余空間。合法值為 auto(默認值,表示根據其他情況自動伸縮),或者以具體的值加 "%"、"px"等單位的形式,表示該元素將占據固定空間。
顯示順序(order):屬性用來設置元素在容器中出現的順序,您可以通過具體的數值來定義元素在容器中的位置,默認值為 0。下圖所示的四個普通的面板組件,在彈性面板里從左至右的正常插入順序是panel1、panel2、panel3、panel4,但通過設置這四個面板的顯示順序,將panel1和panel4的顯示位置進行了調換。
對齊方式(align-self):該屬性允許您為某個特定的元素設置不同于其它元素的對齊方式,該屬性可以覆蓋父容器組件(彈性面板)里的垂直對齊屬性的值。該屬性的可選頂部對齊(flex-start)、底部對齊(flex-end)、居中對齊(center)、基線對齊(baseline)、自動伸展(stretch)。
由于彈性定位的自動伸縮特性,且易于實現子元素的水平和垂直對齊,目前很多主流的前端UI框架都大量地采用了該定位方式。
SS 有兩個最重要的基本屬性,前端開發必須掌握:display
和position
。
display
屬性指定網頁的布局。兩個重要的布局,我已經介紹過了:彈性布局flex
[1]和網格布局grid
[2]。
本文介紹非常有用的position
屬性。我希望通過10分鐘的閱讀,幫助大家輕松掌握網頁定位,說清楚瀏覽器如何計算網頁元素的位置,尤其是新引進的sticky
定位。
本文由國內最大的在線教育平臺之一“騰訊課堂”[3]贊助。他們現在啟動了“騰訊課堂101計劃”[4],推廣平臺上的課程資源,有不少優質內容。希望提高前端技術水平的同學,可以留意一下本文結尾的免費課程信息。
position
屬性用來指定一個元素在網頁上的位置,一共有5種定位方式,即position
屬性主要有五個值。
?
static
?relative
?fixed
?absolute
?sticky
下面就依次介紹這五個值。最后一個sticky
是2017年瀏覽器才支持的,本文將重點介紹。
static
是position
屬性的默認值。如果省略position
屬性,瀏覽器就認為該元素是static
定位。
這時,瀏覽器會按照源碼的順序,決定每個元素的位置,這稱為“正常的頁面流”(normal flow)。每個塊級元素占據自己的區塊(block),元素與元素之間不產生重疊,這個位置就是元素的默認位置。
注意,static
定位所導致的元素位置,是瀏覽器自主決定的,所以這時top
、bottom
、left
、right
這四個屬性無效。
relative
、absolute
、fixed
這三個屬性值有一個共同點,都是相對于某個基點的定位,不同之處僅僅在于基點不同。所以,只要理解了它們的基點是什么,就很容易掌握這三個屬性值。
這三種定位都不會對其他元素的位置產生影響,因此元素之間可能產生重疊。
relative
表示,相對于默認位置(即static
時的位置)進行偏移,即定位基點是元素的默認位置。
它必須搭配top
、bottom
、left
、right
這四個屬性一起使用,用來指定偏移的方向和距離。
div {
position: relative;
top: 20px;
}
上面代碼中,div
元素從默認位置向下偏移20px
(即距離頂部20px
)。
absolute
表示,相對于上級元素(一般是父元素)進行偏移,即定位基點是父元素。
它有一個重要的限制條件:父元素不能是static
定位,否則定位基點就會變成整個網頁的根元素html
。另外,absolute
定位也必須搭配top
、bottom
、left
、right
這四個屬性一起使用。
/*
HTML 代碼如下
<div id="father">
<div id="son"></div>
</div>
*/
#father {
positon: relative;
}
#son {
position: absolute;
top: 20px;
}
上面代碼中,父元素是relative
定位,子元素是absolute
定位,所以子元素的定位基點是父元素,相對于父元素的頂部向下偏移20px
。如果父元素是static
定位,上例的子元素就是距離網頁的頂部向下偏移20px
。
注意,absolute
定位的元素會被“正常頁面流”忽略,即在“正常頁面流”中,該元素所占空間為零,周邊元素不受影響。
fixed
表示,相對于視口(viewport,瀏覽器窗口)進行偏移,即定位基點是瀏覽器窗口。這會導致元素的位置不隨頁面滾動而變化,好像固定在網頁上一樣。
它如果搭配top
、bottom
、left
、right
這四個屬性一起使用,表示元素的初始位置是基于視口計算的,否則初始位置就是元素的默認位置。
div {
position: fixed;
top: 0;
}
上面代碼中,div
元素始終在視口頂部,不隨網頁滾動而變化。
sticky
跟前面四個屬性值都不一樣,它會產生動態效果,很像relative
和fixed
的結合:一些時候是relative
定位(定位基點是自身默認位置),另一些時候自動變成fixed
定位(定位基點是視口)。
因此,它能夠形成“動態固定”的效果。比如,網頁的搜索工具欄,初始加載時在自己的默認位置(relative
定位)。
頁面向下滾動時,工具欄變成固定位置,始終停留在頁面頭部(fixed
定位)。
等到頁面重新向上滾動回到原位,工具欄也會回到默認位置。
sticky
生效的前提是,必須搭配top
、bottom
、left
、right
這四個屬性一起使用,不能省略,否則等同于relative
定位,不產生“動態固定”的效果。原因是這四個屬性用來定義“偏移距離”,瀏覽器把它當作sticky
的生效門檻。
它的具體規則是,當頁面滾動,父元素開始脫離視口時(即部分不可見),只要與sticky
元素的距離達到生效門檻,relative
定位自動切換為fixed
定位;等到父元素完全脫離視口時(即完全不可見),fixed
定位自動切換回relative
定位。
請看下面的示例代碼。(注意,除了已被淘汰的 IE 以外,其他瀏覽器目前都支持sticky
。但是,Safari 瀏覽器需要加上瀏覽器前綴-webkit-
。)
#toolbar {
position: -webkit-sticky; /* safari 瀏覽器 */
position: sticky; /* 其他瀏覽器 */
top: 20px;
}
上面代碼中,頁面向下滾動時,#toolbar
的父元素開始脫離視口,一旦視口的頂部與#toolbar
的距離小于20px
(門檻值),#toolbar
就自動變為fixed
定位,保持與視口頂部20px
的距離。頁面繼續向下滾動,父元素徹底離開視口(即整個父元素完全不可見),#toolbar
恢復成relative
定位。
sticky
定位可以實現一些很有用的效果。除了上面提到“動態固定”效果,這里再介紹兩個。
堆疊效果(stacking)指的是頁面滾動時,下方的元素覆蓋上方的元素。下面是一個圖片堆疊的例子,下方的圖片會隨著頁面滾動,覆蓋上方的圖片(查看 demo[5])。
HTML 代碼就是幾張圖片。
<div><img src="pic1.jpg"></div>
<div><img src="pic2.jpg"></div>
<div><img src="pic3.jpg"></div>
CSS 代碼極其簡單,只要兩行。
div {
position: sticky;
top: 0;
}
它的原理是頁面向下滾動時,每張圖片都會變成fixed
定位,導致后一張圖片重疊在前一張圖片上面。詳細解釋可以看這里[6]。
大型表格滾動的時候,表頭始終固定,也可以用sticky
實現(查看 demo[7])。
CSS 代碼也很簡單。
th {
position: sticky;
top: 0;
}
需要注意的是,sticky
必須設在<th>
元素上面,不能設在<thead>
和<tr>
元素,因為這兩個元素沒有relative
定位,也就無法產生sticky
效果。詳細解釋可以看這里[8]。
(正文完)
初學者剛接觸前端,往往會被一大堆技術名詞、框架和工具,搞得眼花繚亂。
到底哪些技術是目前的主流技術棧,既能用于公司的開發實務,又能為自己的簡歷增添亮點?
下面就是一套目前主流的前端技術棧。
(1)Node.js:服務器端的 JavaScript 運行環境,不管哪種前端開發,都必不可少的底層環境。
(2)Webpack:語法轉換工具,把 ES6/TypeScript/JSX 語法轉成瀏覽器可以運行的代碼。
(3)Koa2:一個非常流行、簡潔強大的 Node.js 后端的 Web 開發框架。
(4)MongoDB:目前應用最廣泛的非關系數據庫之一,功能豐富,用法較簡單。
(5)Vue 全家桶:
?Vue:前端基礎框架?Vuex:配套的前端狀態管理庫。?Vue Router:官方的路由插件,構建單頁面應用必不可少。?Vue CLI:腳手架工具,幫你快速上手 Vue 開發,無需再花多余時間去實現項目架構。?Vant:有贊前端團隊開發的輕量級移動端 Vue 組件庫,讓你快速使用已經封裝好的各種頁面組件。
看到這個名單,你是不是感到有點頭大,全部掌握它們需要多少時間?。?/p>
現在,騰訊課堂就有一門這樣的課程,內容包含了所有這些工具,教你怎么用它們從頭完成一個全棧項目,親手做出一個手機端的移動商城,是由 慕課網的精英講師--謝成老師講授。
該課程的制作單位是青盟科技。它是《騰訊課堂101計劃》重點推廣的優質機構,已有7年 IT 行業教學經驗,培養收費學員2000+,有超過72%的學員都進入到名企大廠。如果你想了解課程的詳細內容,獲取課程大綱,或者想接受系統的前端培訓,可以登錄騰訊課堂查看“青盟科技”。
(完)
[1]
彈性布局flex
:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
[2]
網格布局grid
:http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html
[3]
“騰訊課堂”:https://ke.qq.com/?utm=ruanyifeng
[4]
“騰訊課堂101計劃”:https://edu.qq.com/a/20190119/005414.htm
[5]
demo:https://jsbin.com/fegiqoquki/edit?html,css,output
[6]
這里:https://dev.to/vinceumo/slide-stacking-effect-using-position-sticky-91f
[7]
demo:https://jsbin.com/decemanohe/edit?html,css,output
[8]
這里:https://css-tricks.com/position-sticky-and-table-headers/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。