本文介紹WEB前端之CSS進階
一、CSS屬性操作
1.背景屬性
常用:
- background-color 規定要使用的背景顔色
- background-image 規定要使用的背景圖像
- background-repeat 規定如何重複背景圖像
- background-position 規定背景圖像的位置
非常用:
- background-size 規定背景圖檔的尺寸
- background-origin 規定背景圖檔的定位區域
- background-clip 規定背景的繪制區域
- background-attachment 規定背景圖像是否固定或者随着頁面的其餘部分滾動
- inherit 規定應該從父元素繼承 background 屬性的設定
background-color: cornflowerblue
background-image: url('1.jpg');
background-repeat: no-repeat;(repeat:平鋪滿)
background-position: right top(20px 20px);
簡寫:
background:#ffffff url('1.png') no-repeat right top;
2.邊框屬性
- border-width 規定邊框的寬度
- border-style 規定邊框的樣式
- border-color 規定邊框的顔色
- inherit 規定應該從父元素繼承 border 屬性的設定
border-style: solid;
border-color: chartreuse;
border-width: 20px;
border: 30px rebeccapurple solid;
邊框-單獨設定各邊
border-top-style:dotted;
border-right-style:solid;
border-bottom-style:dotted;
border-left-style:none;
3.清單屬性
list-style 簡寫屬性在一個聲明中設定所有的清單屬性。
說明:
該屬性是一個簡寫屬性,涵蓋了所有其他清單樣式屬性。由于它應用到所有display為list-item的元素,是以在普通的HTML和XHTML中隻能用于li元素,不過實際上它可以應用到任何元素,并由list-item元素繼承。
可以按順序設定如下屬性:
- list-style-type 設定清單項标記的類型
- list-style-position 設定在何處放置清單項标記
- list-style-image 使用圖像來替換清單項的标記
- inherit 規定應該從父元素繼承 list-style 屬性的值
ist-style-type屬性指定清單項标記的類型:
ul { list-style-type: square; }
使用圖像來替換清單項的标記:
ul {
list-style-image: url('');
}
4.display屬性
display 屬性規定元素應該生成的框的類型。
這個屬性用于定義建立布局時元素生成的顯示框類型。對于HTML等文檔類型,如果使用display不謹慎會很危險,因為可能違反HTML中已經定義的顯示層次結構。對于XML,由于XML沒有内置的這種層次結構,所有display是絕對必要的。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1EjM0QDO3EDMx0CMxUDMwUjM3EjNykDM3EDMy0CM5YTOxITMvwVOwcTMwIzLcBTO2kTMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YucTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
none(隐藏某标簽)
p{display:none;}
注意與visibility:hidden的差別:
visibility:hidden可以隐藏某個元素,但隐藏的元素仍需占用與未隐藏之前一樣的空間。也就是說,該元素雖然被隐藏了,但仍然會影響布局。
display:none可以隐藏某個元素,且隐藏的元素不會占用任何空間。也就是說,該元素不但被隐藏了,而且該元素原本占用的空間也會從頁面布局中消失。
block(内聯标簽設定為塊級标簽)
span {display:block;}
注意:一個内聯元素設定為display:block是不允許有它内部的嵌套塊元素。
inline(塊級标簽設定為内聯标簽)
li {display:inline;}
inline-block
display:inline-block可做清單布局,其中的類似于圖檔間的間隙小bug可以通過如下設定解決:
#outer{
border: 3px dashed;
word-spacing: -5px;
}
5.外邊距(margine)和内邊距(padding)
(1)盒子模型
margin: 用于控制元素與元素之間的距離;margin的最基本用途就是控制元素周圍空間的間隔,從視覺角度上達到互相隔開的目的。
padding: 用于控制内容與邊框之間的距離;
Border(邊框): 圍繞在内邊距和内容外的邊框。
Content(内容): 盒子的内容,顯示文本和圖像。
(2)margin屬性
margin簡寫屬性在一個聲明中設定所有外邊距屬性。該屬性可以有1到4個值。
這個簡寫屬性設定一個元素所有外邊距的寬度,或者設定各邊上外邊距的寬度。
塊級元素的垂直相鄰外邊距會合并,而行内元素實際上不占上下外邊距。行内元素的的左右外邊距不會合并。同樣地,浮動元素的外邊距也不會合并。允許指定負的外邊距值,不過使用時要小心。
注釋:允許使用負值。
- auto 浏覽器計算外邊距。
- length 規定以具體機關計的外邊距值,比如像素、厘米等。預設值是 0px。
- % 規定基于父元素的寬度的百分比的外邊距。
- inherit 規定應該從父元素繼承外邊距。
單邊外邊距屬性:
margin-top:100px;
margin-bottom:100px;
margin-right:50px;
margin-left:50px;
居中應用
margin: 0 auto;
例子1
margin:10px 5px 15px 20px;
- 上外邊距是 10px
- 右外邊距是 5px
- 下外邊距是 15px
- 左外邊距是 20px
例子2
margin:10px 5px 15px;
- 右外邊距和左外邊距是 5px
例子3
margin:10px 5px;
- 上外邊距和下外邊距是 10px
例子4
margin:10px;
- 所有4個外邊距都是 10px
(3)padding屬性
padding 簡寫屬性在一個聲明中設定所有内邊距屬性。
說明:
這個簡寫屬性設定元素所有内邊距的寬度,或者設定各邊上内邊距的寬度。行内非替換元素上設定的内邊距不會影響行高計算;是以,如果一個元素既有内邊距又有背景,從視覺上看可能會延伸到其他行,有可能還會與其他内容重疊。元素的背景會延伸穿過内邊距。不允許指定負邊距值。
注釋:不允許使用負值。
樣例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.outer{
margin: 0 auto;
width: 80%;
}
.content{
background-color: darkgrey;
height: 500px;
}
a{
text-decoration: none;
}
.page-area{
text-align: center;
padding-top: 30px;
padding-bottom: 30px;
background-color: #f0ad4e;
}
.page-area ul li{
display: inline-block;
}
.page-area ul li a ,.page-area ul li span{
display: inline-block;
color: #369;
height: 25px;
width: 25px;
text-align: center;
line-height: 25px;
padding: 8px;
margin-left: 8px;
border: 1px solid #e1e1e1;
border-radius: 15%;
}
.page-area ul li .page-next{
width: 70px;
border-radius:0
}
.page-area ul li span.current_page{
border: none;
color: black;
font-weight:900;
}
.page-area ul li a:hover{
color: #fff;
background-color: #2459a2;
}
</style>
</head>
<body>
<div class="outer">
<div class="content"></div>
<div class="page-area">
<ul>
<li><span class="current_page">1</span></li>
<li><a href="#" class="page-a">2</a></li>
<li><a href="#" class="page-a">3</a></li>
<li><a href="#" class="page-a">4</a></li>
<li><a href="#" class="page-a">5</a></li>
<li><a href="#" class="page-a">6</a></li>
<li><a href="#" class="page-a">7</a></li>
<li><a href="#" class="page-a">8</a></li>
<li><a href="#" class="page-a">9</a></li>
<li><a href="#" class="page-a">10</a></li>
<li><a href="#" class="page-a page-next">下一頁</a></li>
</ul>
</div>
</div>
</body>
</html>
效果圖:
- auto 浏覽器計算内邊距。
- length 規定以具體機關計的内邊距值,比如像素、厘米等。預設值是 0px。
- % 規定基于父元素的寬度的百分比的内邊距。
- inherit 規定應該從父元素繼承内邊距。
padding:10px 5px 15px 20px;
- 上内邊距是 10px
- 右内邊距是 5px
- 下内邊距是 15px
- 左内邊距是 20px
padding:10px 5px 15px;
- 右内邊距和左内邊距是 5px
padding:10px 5px;
- 上内邊距和下内邊距是 10px
padding:10px;
- 所有 4 個内邊距都是 10px
思考1:body的外邊距
邊框在預設情況下會定位于浏覽器視窗的左上角,但是并沒有緊貼着浏覽器的視窗的邊框,這是因為body本身也是一個盒子(外層還有html),在預設情況下, body距離html會有若幹像素的margin,具體數值因各個浏覽器不盡相同,是以body中的盒子不會緊貼浏覽器視窗的邊框了,為了驗證這一點,加上:
body{
border: 1px solid;
background-color: cadetblue;
}
解決方法:
body{
margin: 0;
}
思考2:margin collapse(邊界塌陷或者說邊界重疊)
1、兄弟div:
上面div的margin-bottom和下面div的margin-top會塌陷,也就是會取上下兩者margin裡最大值作為顯示值
2、父子div:
if 父級div中沒有border,padding,inlinecontent,子級div的margin會一直向上找,直到找到某個标簽包括border,padding,inline content中的其中一個,然後按此div 進行margin;
<!DOCTYPE html>
<html lang="en" style="padding: 0px">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin: 0px;
}
.div1{
background-color: rebeccapurple;
width: 300px;
height: 300px;
overflow: hidden;
}
.div2{
background-color: green;
width: 100px;
height: 100px;
margin-bottom: 40px;
margin-top: 20px;
}
.div3{
background-color:teal;
width: 100px;
height: 100px;
margin-top: 20px;
}
</style>
</head>
<body>
<div style="background-color: bisque;width: 300px;height: 300px"></div>
<div class="div1">
<div class="div2"></div>
<div class="div3"></div>
</div>
</body>
</html>
overflow: hidden;
6.float屬性
float屬性定義元素在哪個方向浮動。以往這個屬性總應用于圖像,使文本圍繞在圖像周圍,不過在CSS中,任何元素都可以浮動。浮動元素會生成一個塊級框,而不論它本身是何種元素。
如果浮動非替換元素,則要指定一個明确的寬度;否則,它們會盡可能地窄。
注釋:假如在一行之上隻有極少的空間可供浮動元素,那麼這個元素會跳至下一行,這個過程會持續到某一行擁有足夠的空間為止。
- left 元素向左浮動。
- right 元素向右浮動。
- none 預設值。元素不浮動,并會顯示在其在文本中出現的位置。
- inherit 規定應該從父元素繼承 float 屬性的值。
(1)基本浮動規則
先來了解一下block元素和inline元素在文檔流中的排列方式。
block元素通常被現實為獨立的一塊,獨占一行,多個block元素會各自新起一行,預設block元素寬度自動填滿其父元素寬度。block元素可以設定width、height、margin、padding屬性;
inline元素不會獨占一行,多個相鄰的行内元素會排列在同一行裡,直到一行排列不下,才會新換一行,其寬度随元素的内容而變化。inline元素設定width、height屬性無效
- 常見的塊級元素有 div、form、table、p、pre、h1~h5、dl、ol、ul 等。
- 常見的内聯元素有span、a、strong、em、label、input、select、textarea、img、br等
所謂的文檔流,指的是元素排版布局過程中,元素會自動從左往右,從上往下的流式排列。
脫離文檔流,也就是将元素從普通的布局排版中拿走,其他盒子在定位的時候,會當做脫離文檔流的元素不存在而進行定位。
假如某個div元素A是浮動的,如果A元素上一個元素也是浮動的,那麼A元素會跟随在上一個元素的後邊(如果一行放不下這兩個元素,那麼A元素會被擠到下一行);如果A元素上一個元素是标準流中的元素,那麼A的相對垂直位置不會改變,也就是說A的頂部總是和上一個元素的底部對齊。此外,浮動的框之後的block元素元素會認為這個框不存在,但其中的文本依然會為這個元素讓出位置。 浮動的框之後的inline元素,會為這個框空出位置,然後按順序排列。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.r1{
width: 300px;
height: 100px;
background-color: #7A77C8;
float: left;
}
.r2{
width: 200px;
height: 200px;
background-color: wheat;
/*float: left;*/
}
.r3{
width: 100px;
height: 200px;
background-color: darkgreen;
float: left;
}
</style>
</head>
<body>
<div class="r1"></div>
<div class="r2"></div>
<div class="r3"></div>
</body>
</html>
(2)非完全脫離文檔流
左右結構div盒子重疊現象,一般是由于相鄰兩個DIV一個使用浮動一個沒有使用浮動。一個使用浮動一個沒有導緻DIV不是在同個“平面”上,但内容不會造成覆寫現象,隻有DIV形成覆寫現象。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.r1{
width: 100px;
height: 100px;
background-color: #7A77C8;
float: left;
}
.r2{
width: 200px;
height: 200px;
background-color: wheat;
}
</style>
</head>
<body>
<div class="r1"></div>
<div class="r2">region2</div>
</body>
</html>
要麼都不使用浮動;要麼都使用float浮動;要麼對沒有使用float浮動的DIV設定margin樣式。
(3)父級坍塌現象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
* {
margin:0;padding:0;
}
.container{
border:1px solid red;width:300px;
}
#box1{
background-color:green;float:left;width:100px;height:100px;
}
#box2{
background-color:deeppink; float:right;width:100px;height:100px;
}
#box3{
background-color:pink;height:40px;
}
</style>
</head>
<body>
<div class="container">
<div id="box1">box1 向左浮動</div>
<div id="box2">box2 向右浮動</div>
</div>
<div id="box3">box3</div>
</body>
</html>
例子如上:.container和box3的布局是上下結構,上圖發現box3跑到了上面,與.container産生了重疊,但文本内容沒有發生覆寫,隻有div發生覆寫現象。這個原因是因為第一個大盒子裡的子元素使用了浮動,脫離了文檔流,導緻.container沒有被撐開。box3認為.container沒有高度(未被撐開),是以跑上去了。
1、固定高度
給.container設定固定高度,一般情況下文字内容不确定多少就不能設定固定高度,是以一般不能設定“.container”高度(當然能确定内容多高,這種情況下“.container是可以設定一個高度即可解決覆寫問題。
或者給.container加一個固定高度的子div:
<div class="container">
<div id="box1">box1 向左浮動</div>
<div id="box2">box2 向右浮動</div>
<div id="empty" style="height: 100px"></div>
</div>
<div id="box3">box3</div>
但是這樣限定固定高度會使頁面操作不靈活,不推薦!
2、清除浮動(推薦)。
clear文法:
clear : none | left | right | both
取值:
- none : 預設值。允許兩邊都可以有浮動對象
- left : 不允許左邊有浮動對象
- right : 不允許右邊有浮動對象
- both : 不允許有浮動對象
但是需要注意的是:clear屬性隻會對自身起作用,而不會影響其他元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.r1{
width: 300px;
height: 100px;
background-color: #7A77C8;
float: left;
}
.r2{
width: 200px;
height: 200px;
background-color: wheat;
float: left;
clear: left;
}
.r3{
width: 100px;
height: 200px;
background-color: darkgreen;
float: left;
}
</style>
</head>
<body>
<div class="r1"></div>
<div class="r2"></div>
<div class="r3"></div>
</body>
</html>
把握住兩點:
- 元素是從上到下、從左到右依次加載的。
- clear: left;對自身起作用,一旦左邊有浮動元素,即切換到下一行來保證左邊元素不是浮動的,依據這一點解決父級塌陷問題。
思考:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.r1{
width: 300px;
height: 100px;
background-color: #7A77C8;
float: left;
}
.r2{
width: 200px;
height: 200px;
background-color: wheat;
float: left;
clear: both;
}
.r3{
width: 100px;
height: 200px;
background-color: darkgreen;
float: left;
}
</style>
</head>
<body>
<div class="r1"></div>
<div class="r2"></div>
<div class="r3"></div>
</body>
</html>
解決父級塌陷:
.clearfix:after { <----在類名為“clearfix”的元素内最後面加入内容;
content: "."; <----内容為“.”就是一個英文的句号而已。也可以不寫。
display: block; <----加入的這個元素轉換為塊級元素。
clear: both; <----清除左右兩邊浮動。
visibility: hidden; <----可見度設為隐藏。注意它和display:none;是有差別的。
visibility:hidden;仍然占據空間,隻是看不到而已;
line-height: 0; <----行高為0;
height: 0; <----高度為0;
font-size:0; <----字型大小為0;
}
.clearfix { *zoom:1;} <----這是針對于IE6的,因為IE6不支援:after僞類,這個神
奇的zoom:1讓IE6的元素可以清除浮動來包裹内部元素。
整段代碼就相當于在浮動元素後面跟了個寬高為0的空div,然後設定它clear:both來達到清除浮動的效果。
之是以用它,是因為,你不必在html檔案中寫入大量無意義的空标簽,又能清除浮動。
<div class="head clearfix"></div>
overflow:hidden
overflow:hidden的含義是超出的部分要裁切隐藏,float的元素雖然不在普通流中,但是他是浮動在普通流之上的,可以把普通流元素+浮動元素想象成一個立方體。如果沒有明确設定包含容器高度的情況下,它要計算内容的全部高度才能确定在什麼位置hidden,這樣浮動元素的高度就要被計算進去。這樣包含容器就會被撐開,清除浮動。
7.position(定位)
position 屬性規定元素的定位類型。
這個屬性定義建立元素布局所用的定位機制。任何元素都可以定位,不過絕對或固定元素會生成一個塊級框,而不論該元素本身是什麼類型。相對定位元素會相對于它在正常流中的預設位置偏移。
(1)relative: 相對定位。
相對定位是相對于該元素在文檔流中的原始位置,即以自己原始位置為參照物。有趣的是,即使設定了元素的相對定位以及偏移值,元素還占有着原來的位置,即占據文檔流空間。對象遵循正常文檔流,但将依據top,right,bottom,left等屬性在正常文檔流中偏移位置。而其層疊通過z-index屬性定義。
注意:position:relative的一個主要用法:友善絕對定位元素找到參照物。
(2)absolute: 絕對定位。
定義:設定為絕對定位的元素框從文檔流完全删除,并相對于最近的已定位祖先元素定位,如果元素沒有已定位的祖先元素,那麼它的位置相對于最初的包含塊(即body元素)。元素原先在正常文檔流中所占的空間會關閉,就好像該元素原來不存在一樣。元素定位後生成一個塊級框,而不論原來它在正常流中生成何種類型的框。
重點:如果父級設定了position屬性,例如position:relative;,那麼子元素就會以父級的左上角為原始點進行定位。這樣能很好的解決自适應網站的标簽偏離問題,即父級為自适應的,那我子元素就設定position:absolute;父元素設定position:relative;,然後Top、Right、Bottom、Left用百分比寬度表示。
另外,對象脫離正常文檔流,使用top,right,bottom,left等屬性進行絕對定位。而其層疊通過z-index屬性定義。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.outet{
/*position: relative;*/
}
.item{
width: 200px;
height:200px ;
}
.r1{
background-color: #7A77C8;
}
.r2{
background-color: wheat;
/*position: relative;*/
position: absolute;
top: 200px;
left: 200px;
}
.r3{
background-color: darkgreen;
}
</style>
</head>
<body>
<div class="item r1"></div>
<div class="outet">
<div class="item r2"></div>
<div class="item r3"></div>
</div>
</body>
</html>
總結:參照物用相對定位,子元素用絕對定位,并且保證相對定位參照物不會偏移即可。
(3)position:fixed
fixed:對象脫離正常文檔流,使用top,right,bottom,left等屬性以視窗為參考點進行定位,當出現滾動條時,對象不會随着滾動。而其層疊通過z-index屬性 定義。
注意點: 一個元素若設定了 position:absolute | fixed; 則該元素就不能設定float。這是一個常識性的知識點,因為這是兩個不同的流,一個是浮動流,另一個是“定位流”。但是 relative 卻可以。因為它原本所占的空間仍然占據文檔流。
在理論上,被設定為fixed的元素會被定位于浏覽器視窗的一個指定坐标,不論視窗是否滾動,它都會固定在這個位置。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.back{
background-color: wheat;
width: 100%;
height: 1200px;
}
span{
display: inline-block;
width: 80px;
height: 50px;
position: fixed;
bottom: 20px;
right: 20px;
background-color: rebeccapurple;
color: white;
text-align: center;
line-height: 50px;
}
</style>
</head>
<body>
<div class="back">
<span>傳回頂部</span>
</div>
</body>
</html>
補充
預設的高度和寬度問題
(1)父子都是塊級元素
<!DOCTYPE html>
<html>
<head>
<title>fortest</title>
<style>
div.parent{
width: 500px;
height: 300px;
background: #ccc;
}
div.son{
width: 100%;
height: 200px;
background: green;
}
</style>
</head>
<body>
<div class="parent">
<div class="son"></div>
</div>
</body>
</html>
這時,子元素設定為了父元素width的100%,那麼子元素的寬度也是500px;
但是如果我們把子元素的width去掉之後,就會發現子元素還是等于父元素的width。也就是說,對于塊級元素,子元素的寬度預設為父元素的100%。
當我們給子元素添加padding和margin時,可以發現寬度width是父元素的寬度減去子元素的margin值和padding值。
毫無疑問,如果去掉子元素的height,就會發先子元素的高度為0,故height是不會為100%的,一般我們都是通過添加内容(子元素)将父元素撐起來。
(2)父:塊級元素 子:内聯元素
如果内聯元素是不可替換元素(除img,input以外的一般元素),元素是沒有辦法設定寬度的,也就談不上100%的問題了。 即内聯元素必須依靠其内部的内容才能撐開。
如果内聯元素是可替換元素(img,input,本身可以設定長和寬),不管怎麼設定父元素的寬度和高度,而不設定img的寬和高時,img總是表現為其原始的寬和高。
<!DOCTYPE html>
<html>
<head>
<title>...</title>
<style>
div.parent{
width: 500px;
height: 300px;
background: #ccc;
}
img{
height: 100px;
background: green;
}
</style>
</head>
<body>
<div class="parent">
<img class="son" src="s1.jpg"></img>
</div>
</body>
</html>
由此我們可以發現,雖然沒有設定寬度,但是表現在浏覽器上為160px,它并沒有繼承父元素的100%得到500px,而是根據既定的高度來等比例縮小寬度。
同樣,如果隻設定width,那麼height也會等比例改變。
如果我們把img的width設定為100%,就可以發現其寬度這時就和父元素的寬度一緻了。而我們一般的做法時,首先确定img的父元素的寬度和高度,然後再将img的寬度和高度設定位100%,這樣,圖檔就能鋪滿父元素了。