浮動
浮動最直接的價值就在于他可以多個div并排在同一行。
當然也可以設定盒子的樣式為 inline-block, 但是帶來的問題也随之而來,首先就是盒子之間右空隙,其次,盒子會依次從左到右并排,雖然可以通過padding控制他們之間的間距,但是變數太大了
- 浮動會讓盒子脫離标準流,盒子不再占用位置。
- 浮動的盒子總是會找到離他最近的父元素進行對齊,但是不會超出内邊距的範圍。
- 浮動的盒子不能越過父盒子的padding值
常見的布局
如下圖,每一個圖檔都在一個div中,為了讓他們可以并排在一行上,肯定就得添加浮動,同時浮動會影響其他标準流,所在在這些标記浮動的元素的最外層添加一個div,清除這些盒子的浮動。同時給最外層的盒子添加高,讓他占位。這樣再往下的标準流就不會再受到影響了。
嘗試浮動
讓多個div并排在同一列,給下面的兩個div同時添加浮動即刻
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.dv1 {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.dv2 {
width: 300px;
height: 300px;
background-color: aqua;
float: left;
}
</style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>
浮動僅僅會影響他下面的元素,看下面的例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.dv1 {
width: 200px;
height: 200px;
background-color: pink;
}
.dv2 {
width: 300px;
height: 300px;
background-color: aqua;
float: left;
}
</style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>
最終的效果就像下面這樣, 雖然水藍色的盒子添加了浮動,但是這也是僅僅是會影響他之後的元素,而他上面的元素不會受到影響。
推斷,父盒子中有多個子盒子,如果其中一個盒子存在浮動,那麼其他的所有盒子都需要浮動。才能在一行内并排
浮動隐藏的模式轉換
浮動可以讓盒子隐式的轉換成行内塊元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.dv1 {
background-color: aqua;
float: left;
}
</style>
</head>
<body>
<div class="dv1">123</div>
</body>
</html>
效果:
布局和版心
示例1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.top,
.footer,
.main,
.banner{
background-color: #eee;
width: 1190px;
}
.top {
height: 80px;
margin: 0 auto 5px;
}
.banner {
height: 200px;
margin: 0 auto 5px;
}
.main {
height: 600px;
margin: 0 auto 5px;
}
.footer {
height: 80px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="top">123</div>
<div class="banner">123</div>
<div class="main">123</div>
<div class="footer">123</div>
</body>
</html>
效果圖:
示例2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.top,
.footer,
.main,
.banner{
background-color: #eee;
width: 1190px;
}
.top {
height: 80px;
margin: 0 auto 5px;
}
.banner {
height: 200px;
margin: 0 auto 5px;
}
.main {
height: 600px;
margin: 0 auto 5px;
}
.left {
background-color: pink;
height: 600px;
width: 300px;
float: left;
}
.right {
background-color: aqua;
height: 600px;
width: 890px;
float: right;
}
.footer {
height: 80px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="top">123</div>
<div class="banner">123</div>
<div class="main">
<div class="left"></div>
<div class="right"></div>
</div>
<div class="footer">123</div>
</body>
</html>
注意點,比如main部分,父盒子的寬度是1190px, 裡面的兩個子盒子發生浮動實作了并排,這時如果子盒子的寬度相加大于父盒子的寬度,最終的效果就是右邊的子盒子會被擠下去。 為了防止他們不被擠下去,就得修改相應的子盒子的寬度
此外,像這種布局方式,我們用滑鼠推動着浏覽器往左滑動,盒子是不會被擠下去的。
效果:
清除浮動
清除浮動的本質: 就是為了解決父級元素因為子集元素浮動後而導緻高度為0的情況。
看下面的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.main {
width: 1190px;
background-color: #eee;
margin: 0 auto 5px;
}
.left {
background-color: pink;
height: 600px;
width: 300px;
float: left;
}
.right {
background-color: aqua;
height: 600px;
width: 890px;
float: right;
}
.footer {
width: 100%;
height: 80px;
margin: 0 auto;
background-color: #cccccc;
}
</style>
</head>
<body>
<nav>
</nav>
<div class="main">
<div class="left"></div>
<div class="right"></div>
</div>
<div class="footer">123</div>
</body>
</html>
因為我們并沒有給main盒子設定高度,導緻讓它裡面的子盒子發生發動脫離文檔流後,沒有人撐開它,他就重新變成了一條線
前面的解決方式是我們給main盒子設定一個固定的高度,但是很多情況下,我們的需求是根據子盒子的本身的高度去撐開盒子,而不是把高度寫死,于是我們可以使用清除浮動。
清除浮動實作的最終效果就是:父盒子中子盒子并排,父盒子的高度 = 最高的子盒子的高度
- 清除浮動方式1:
w3c推薦的方式,在存在浮動的元素後面添加一個新的空标簽,如下:
<body>
<div class="main">
<div class="left"></div>
<div class="right"></div>
</div>
<!-就像下面這樣-->
<div style="clear: both;"></div>
<div class="footer">123</div>
</body>
- 清除浮動方式2:
第二種方式清除浮動,可以通過給父盒子添加屬性 overflow
.main {
width: 1190px;
background-color: #eee;
margin: 0 auto 5px;
/*同樣可以實作清除浮動*/
overflow: hidden;
}
元素的定位
元素的定位屬性主要是包含兩部分: 定位模式 + 邊偏移
邊偏移
邊偏移屬性 | 描述 |
top | 頂部偏移量:定義元素相對于其父元素上邊距的距離 |
bottom | 底部偏移量:定義元素相對于其父元素下邊距的距離 |
left | 左側偏移量 |
right | 右側偏移量 |
四種定位模式
css中,通過position屬性定義元素的定位模式,基本的文法如下
值 | 描述 |
static | 預設值,自動定位。 |
relative | 相對定位,相對于其文檔流的位置進行定位。 |
absolute | 絕對定位,相對于其上一個元素的父元素進行定位。 |
fixed | 固定定位,相對于浏覽器的視窗進行定位。 |
靜态定位
網頁中的元素預設的都是靜态定位,比如一個div預設會自己獨占一行,多個span可以并排在一行。
靜态定位的唯一的作用就是取消其他的定位模式。
相對定位
相對定位:相對于自己目前的位置,再定位到新的位置上。
看下面的示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.dv {
margin: 100px;
background-color: aqua;
width: 100px;
height: 100px;
position: relative;
top: 100px;
}
</style>
</head>
<body>
<div class="dv"></div>
</body>
</html>
最終的效果就是會相對于自己的位置重新定位,在top方向上增加100px
在看下面的示例: 可以看到,使用相對定位,元素雖然會移動,但是元素的原來在标準流中所占的位置不會發生改變。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.dv1 {
background-color: aqua;
width: 100px;
height: 100px;
position: relative;
top: 50px;
left: 50px;
}
.dv2 {
background-color: skyblue;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>
效果圖:
絕對定位
如下例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.dv1 {
background-color: aqua;
width: 100px;
height: 100px;
position: absolute;
}
.dv2 {
background-color: skyblue;
width: 120px;
height: 120px;
}
</style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>
效果圖:
給水藍色的盒子設定定位方式:相對定位,他相對于自己的父元素進行定位,在上面的例子中,就是相對于body,也就是目前的螢幕進行定位。
再看下面這個例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.dv1 {
margin: 50px;
background-color: aqua;
width: 100px;
height: 100px;
}
.dv2 {
background-color: skyblue;
position: absolute;
top: 20px;
left: 20px;
width: 80px;
height: 80px;
}
</style>
</head>
<body>
<div class="dv1">
<div class="dv2">
</div>
</div>
</body>
</html>
效果圖:
通過這個例子看到,當給子盒子添加相對定位時,如果他的直接父盒子并沒有添加任何定位,這時子盒子實際上是會相對于body進行定位。
子絕父相
子絕父相說的是啥意思呢?意思就是說,如果我們想實作子元素相對于父元素進行定位時,子元素的定位方式需要設定成絕對定位,父元素的定位方式設定成相對定位才ok
還是上面的例子:像下面這樣修改css樣式:
<style>
* {
margin: 0;
padding: 0;
}
.dv1 {
margin: 50px;
background-color: aqua;
width: 100px;
height: 100px;
position: absolute;
}
.dv2 {
background-color: skyblue;
position: relative;
top: 10px;
left: 10px;
width: 80px;
height: 80px;
}
</style>
最終實作的效果就是:
加了定位的盒子水準對齊
首先來說,一個盒子隻要是添加了定位,盒子就會飄起來,與此同時margin屬性也會失效。
那怎麼使一個添加了定位的盒子水準對齊呢? 如下:
.dv1 {
background-color: aqua;
width: 100px;
height: 100px;
/*無論什麼定位都ok*/
position: absolute;
/*以左上角為基準,移動到父盒子的百分之五十寬度的位置*/
left: 50%;
/*margin值,往左減少50px*/
margin-left: -50px;
}
顯示和隐藏
css中與顯示和隐藏相關的常見屬性有如下幾個
display
visiblity
overflow
我們的目的是讓其在文檔中消失,而不是在源碼中将其删除。
- 通過display隐藏元素後,元素原來的位置不再保留
div {
/*隐藏之後,不再保留原位置*/
display: none;
}
div {
/*将元素轉換成塊級元素,第二層意思就是顯示元素*/
display: block;
}
通過visibility控制元素的隐藏,原位置将會被保留
div {
/*對象可見*/
visibility: visible;
}
div {
/*對象隐藏*/
visibility: hidden;
}
div {
/*超出的部分依然會顯示*/
overflow: visible;
}
div {
/*超出的部分隐藏*/
overflow: hidden;
}
div {
/*内容超出後,會顯示滾動條*/
overflow: auto;
}
div {
/*總是顯示滾動條*/
overflow: scroll;
}