我們在學習了CSS的基本知識和盒子之後,就該瞭解一下網頁的整體構成了
當然如果沒有學習之前的知識,可以到我的主頁中檢視之前的文章:秋落雨微涼 - 部落格園
網頁佈局的本質就是用CSS控制盒子的擺放來形成頁面
CSS提供了三種流派來控制盒子:
所謂普通流就是我們前面所學習的內容:
接下來讓我們走進浮動和定位的世界
首先我們為什麼需要浮動呢?
那麼我們來介紹一下浮動:
我們給出簡單的程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>浮動</title>
<style>
div {
height: 100px;
width: 200px;
background-color: palevioletred;
/* 我們加入一個邊框,以便於更好區分兩個div */
border: 1px black solid;
/* 這裡表示開啟浮動,且向左浮動 */
float: left;
}
</style>
</head>
<body>
<div></div>
<div></div>
</body>
</html>
我們再來講解一下浮動的特性:
我們給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>浮動特性</title>
<!-- 我們為兩個div提供不同屬性 -->
<style>
.floats {
height: 100px;
width: 200px;
background-color: palegoldenrod;
float: left;
}
.normals {
height: 300px;
width: 200px;
background-color: red;
}
</style>
</head>
<body>
<div class="floats"></div>
<div class="normals"></div>
</body>
</html>
浮動元素經常與標準流父級搭配使用:
我們通過一個簡單案例展示浮動和標準流搭配產生的佈局效果:
圖片展示效果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>案例</title>
<style>
/* 我們先設定大盒子的屬性 */
.father {
width: 1200px;
height: 460px;
background-color: pink;
margin: 0 auto;
}
/* 然後設定左浮動盒子 */
.left {
width: 230px;
height: 460px;
background-color: purple;
float: left;
}
.right {
width: 970px;
height: 460px;
background-color: skyblue;
float: left;
}
</style>
</head>
<body>
<!-- 首先我們需要一個標準流的大盒子來控制整體縱向位置 -->
<div class="father">
<!-- 然後我們用兩個浮動來控制內部的位置 -->
<div class="left">left</div>
<div class="right">right</div>
</div>
</body>
</html>
圖片展示效果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>案例</title>
<style>
/* 我們需要做初始化設定,去除基本margin和padding,去掉li的前置style*/
* {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
/* 首先設定大盒子 */
.box {
width: 1226px;
height: 285px;
background-color: pink;
margin: 0 auto;
}
/* 然後我們設定小盒子 */
.box li {
width: 296px;
height: 285px;
background-color: purple;
float: left;
/* 因為盒子之間有縫隙,我們用margin控制 */
margin-right: 14px;
}
.box .lis {
/* 因為四個盒子只有三個縫隙,但上文標註了四個縫隙,所以我們需要去除掉最後一個縫隙,否則最後一個盒子將會被擠出大盒子 */
margin-right: 0;
}
</style>
</head>
<body>
<ul class="box">
<li>1</li>
<li>2</li>
<li>3</li>
<li class="lis">4</li>
</ul>
</body>
</html>
圖片效果展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>案例3</title>
<!-- 該案例結合了上面兩種情況,我在這裡不做出詳細程式碼了 -->
<!-- 如果有興趣可以自己嘗試完成一下 -->
</head>
<body>
<!-- 先來實現案例1的操作 -->
<!-- 首先是一個大盒子 -->
<div class="box">
<!-- 大盒子裡分為左右兩個小盒子 -->
<div class="left"></div>
<!-- 在右邊的盒子裡實現案例2的操作 -->
<div class="right">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
</div>
</div>
</body>
</html>
浮動佈局的三個注意點:
首先我們介紹一下為什麼要清除浮動:
下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 當我們存在浮動盒子且沒有高度時,box的高度為0 -->
<style>
.box {
width: 1226px;
background-color: pink;
margin: 0 auto;
}
.ermao,.daomao {
width: 296px;
height: 285px;
background-color: purple;
float: left;
margin-right: 14px;
}
/* 當我們的box沒有高度時,下面再出現其他標準流盒子,就會直接覆蓋到box上導致排版錯誤 */
.footer {
height: 100px;
background-color: black;
}
</style>
</head>
<body>
<div class="box">
<div class="damao"></div>
<div class="ermao"></div>
<div class="ermao"></div>
</div>
<div class="footer"></div>
</body>
</html>
清除浮動的本質:
清除浮動方法:
額外標籤法
在浮動末尾加上clear:both;屬性
優點:通俗易懂
缺點:新增無意義標籤,結構性差
我們給出程式碼展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 1226px;
background-color: pink;
margin: 0 auto;
}
.damao,.ermao {
width: 296px;
height: 285px;
background-color: purple;
float: left;
margin-right: 14px;
}
/* 在這裡寫下clear屬性 */
.clear {
clear: both;
}
.footer {
height: 100px;
background-color: black;
}
</style>
</head>
<body>
<div class="box">
<div class="damao"></div>
<div class="ermao"></div>
<div class="ermao"></div>
<!-- 在box結束末尾插入clear屬性 -->
<!-- 且這裡必須使用塊級元素 -->
<div class="clear"></div>
</div>
<div class="footer"></div>
</body>
</html>
我們給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 1226px;
background-color: pink;
margin: 0 auto;
/* 直接給出overflow屬性即可 */
overflow: hidden;
}
.damao,.ermao {
width: 296px;
height: 285px;
background-color: purple;
float: left;
margin-right: 14px;
}
.footer {
height: 100px;
background-color: black;
}
</style>
</head>
<body>
<div class="box">
<div class="damao"></div>
<div class="ermao"></div>
<div class="ermao"></div>
</div>
<div class="footer"></div>
</body>
</html>
:after偽元素法
.clearfix {
*zoom: 1;
}
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
我們下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.clearfix {
*zoom: 1;
}
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.box {
width: 1226px;
background-color: pink;
margin: 0 auto;
}
.damao,.ermao {
width: 296px;
height: 285px;
background-color: purple;
float: left;
margin-right: 14px;
}
.footer {
height: 100px;
background-color: black;
}
</style>
</head>
<body>
<div class="box clearfix">
<div class="damao"></div>
<div class="ermao"></div>
<div class="ermao"></div>
</div>
<div class="footer"></div>
</body>
</html>
雙偽元素法:
.clearfix {
*zoom: 1;
}
.clearfix:after {
clear: both;
}
.clearfix:after,.clearfix:before {
content: "";
display: table;
}
我們下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.clearfix {
*zoom: 1;
}
.clearfix:after {
clear: both;
}
.clearfix:after,.clearfix:before {
content: "";
display: table;
}
.box {
width: 1226px;
background-color: pink;
margin: 0 auto;
}
.damao,.ermao {
width: 296px;
height: 285px;
background-color: purple;
float: left;
margin-right: 14px;
}
.footer {
height: 100px;
background-color: black;
}
</style>
</head>
<body>
<div class="box clearfix">
<div class="damao"></div>
<div class="ermao"></div>
<div class="ermao"></div>
</div>
<div class="footer"></div>
</body>
</html>
首先我們為什麼需要定位呢?
定位 = 定位元型樣 + 邊偏移
定位元型樣分為四種:static relative absolute fixed
接下來讓我們一一瞭解:
靜態定位是元素的預設定位方法,無定位的意思
語法:
選擇器{ position:static;}
相對定位是元素在移動位置時,是相對於原本的位置來說的
語法:
選擇器{ position:relative;}
我們給出程式碼測試:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 接下來我們讓box1定位移動,使其覆蓋在box2上面 -->
<style>
.box1 {
width: 100px;
height: 100px;
background-color: pink;
/* 設定為relative屬性,並且採用top和left進行移動 */
position: relative;
top: 50px;
left: 50px;
}
.box2 {
width: 100px;
height: 100px;
background-color: black;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
</html>
絕對定位是元素在移動位置的時候,相對於它的祖先元素來說的
語法:
選擇器{positon:absolute;}
我們下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 首先我們測試無父元素,或者父元素沒有定位的狀況 */
.nofather {
height: 200px;
width: 200px;
background-color: black;
/* 這種情況下會以瀏覽器左上角為標準 */
position: absolute;
top: 100px;
left: 100px;
}
/* 然後我們測試有定位的孩子(若父親沒有定位,爺爺有定位,則以爺爺為準,依次類推) */
.son {
height: 100px;
width: 100px;
background-color: pink;
/* 這種情況下會以瀏覽器左上角為標準 */
position: absolute;
top: 50px;
left: 50px;
}
/* 我們建立另一個標準流,我們會發現它會覆蓋在原本nofather的位置上 */
.anthor {
height: 200px;
width: 200px;
background-color: skyblue;
}
</style>
</head>
<body>
<div class="nofather">
<div class="son"></div>
</div>
<div class="anthor"></div>
</body>
</html>
固定定位是元素固定於瀏覽器可視區的位置,主要應用於:在瀏覽器頁面捲動時元素位置不發生改變
語法:
選擇器{position:fix;}
fixed小技巧:
我們希望使fix內容緊貼版心右側固定不變
那麼我們就可以使fix的位置left在瀏覽器寬的的一半,然後設定margin-left為版心寬度的一半
我們給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 首先我們設定一個版心box */
.box {
width: 800px;
height: 1400px;
background-color: pink;
margin: 0 auto;
}
/* 然後我們設定一個fixed附屬框,為fix屬性 */
.fixed {
width: 50px;
height: 150px;
background-color: black;
/* 首先設定fix屬性 */
position: fixed;
/* 然後我們設定left為頁面一半,設定margin為版心一半 */
left: 50%;
margin-left: 400px;
}
</style>
</head>
<body>
<div class="fixed"></div>
<div class="box"></div>
</body>
</html>
粘性定位可以認為使相對定位和固定定位的混合
語法:
選擇器{position:sticky;}
我們下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 首先設定box,讓我們的頁面有可拉動的空間 */
.box {
height: 3000px;
}
/* 然後我們以導航欄為例,當它位於頁面最上端時(top=0),導航欄不再跟著頁面滑動而滑動 */
.nav {
width: 200px;
height: 100px;
background-color: aqua;
margin: 100px auto;
/* 設定為粘性 */
position: sticky;
/* 設定滯停位置 */
top: 0;
}
</style>
</head>
<body>
<div class="nav">導航欄</div>
<div class="box"></div>
</body>
</html>
子絕父相:
我們給出一個案例來解釋子絕父相:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>案例</title>
<!-- 我們採用之前的案例,希望在這個案例的右上角加入一個新的小圖示 -->
<style>
* {
padding: 0;
margin: 0;
}
/* 首先我們要給父類別加上定位,這裡採用相對定位且不發生位置變化 */
.box {
position: relative;
height: 415px;
width: 298px;
background-color: rgba(255, 255, 255, 0);
margin: 100px auto;
}
.box img {
width: 100%;
}
/* 然後我們將圖片以絕對定位的方法插入並設定位置 */
.good {
width: 10px;
position: absolute;
/* 因為父親有相對定位,所以我們只需要相對父類別設定位置即可 */
top: 10px;
right: 20px;
}
.review {
font-family: 微軟雅黑;
font-size: 14px;
height: 70px;
padding: 0 28px;
margin-top: 30px;
}
.appraise {
font-family: 微軟雅黑;
font-size: 12px;
color: #b0b0b0;
padding: 0 28px;
margin-top: 28px;
}
.info {
font-size: 14px;
padding: 0 28px;
margin-top: 15px;
}
.info em {
font-style: normal;
color: #ebe4e0;
margin: 0 6px 0 15px;
}
.info .price {
color: #ff6700;
}
</style>
</head>
<body>
<div class="box">
<!-- 這裡插入我們新插入的小花圖案 -->
<img class="good" src="好評.png" alt="好評">
<!-- 首先我們放入照片 -->
<img src="../../lesson2/Demo/案例照片/1.png" alt="圖片">
<!-- 放入第一行文字 -->
<p class="review">快遞牛,整體不錯,藍芽都可以秒連</p>
<!-- 放入第二行文字 -->
<p class="appraise">來自1923134的評價</p>
<!-- 最後一行文字 -->
<p class="info"><span class="name">Redmi AirDots真無線藍...</span><em>|</em><span class="price">99.9元</span></p>
</div>
</body>
</html>
在使用定位佈局時,可能會引起盒子重疊的情況,我們需要z-index來設定疊放權重
語法:
選擇器{z-index:n;}
我們下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 我們給出三個盒子,分別設定定位和z-index,可以清楚看出z-index效果 -->
<style>
div {
position: absolute;
width: 200px;
height: 200px;
}
.w1{
background-color: red;
z-index: 2;
}
.w2{
background-color: green;
left: 50px;
top: 50px;
z-index: 3;
}
.w3{
background-color: blue;
left: 100px;
top: 100px;
z-index: 1;
}
</style>
</head>
<body>
<div class="w1">w1</div>
<div class="w2">w2</div>
<div class="w3">w3</div>
</body>
</html>
絕對定位盒子無法通過margin: 0 auto居中
需要採用小演演算法:left:50% 和 margin-left:-自身50%
我們下面給出程式碼範例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 我們需要採用小演演算法:left:50% 和 margin-left:-自身50% -->
<style>
div {
/* 首先設定自身屬性 */
height: 100px;
width: 200px;
background-color: black;
/* 然後設定定位,且居中 */
position: absolute;
left: 50%;
margin-left: -100px;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
下面我們給出一些定位特殊特性:
好的,那麼關於浮動和定位的知識點基本彙總完畢,希望能給你帶來收穫。
接下來我會介紹一些CSS的佈局技巧和知識補充,希望能獲得你的一些鼓勵。