1. 程式人生 > >01-CSS基礎--CSS概述+CSS和HTML相結合的四種方式+CSS選擇器+盒子模型+元素的浮動float+清除浮動clear+元素的定位position

01-CSS基礎--CSS概述+CSS和HTML相結合的四種方式+CSS選擇器+盒子模型+元素的浮動float+清除浮動clear+元素的定位position

一、CSS概述

1、CSS:層疊樣式表,用來定義網頁的顯示效果。CSS將網頁內容和顯示樣式進行分離,提高了顯示功能(降低耦合性,提高擴充套件性和可維護性)

2、CSS的基本特徵

(1)層疊性:多種CSS樣式的疊加

(2)繼承性:子標記會繼承父標記的某些樣式

3、CSS註釋

    /* CSS檔案註釋的內容 */

4、CSS程式碼格式

        選擇器名稱 {
            屬性1: 屬性值1;
            屬性2: 屬性值2;
            ......
        }

(1)屬性與屬性之間用分號(;)隔開

(2)屬性與屬性值之間用冒號(:)連線

(3)如果一個屬性有多個值,多個值之間用空格( )隔開

注:CSS程式碼中的空格不被解析

       a). 花括號({})及分號(;)前後的空格可有可無

       b). 屬性值和單位之間不允許有空格

二、CSS和HTML相結合的四種方式

1、CSS和HTML相結合的四種方式

(1)style屬性方式(內聯式):每一個html標籤中都有一個style屬性,負責該標籤的樣式。該屬性可以有多個屬性值,其屬性值就是CSS程式碼

<div style="color: #0000ff; background-color: #dddddd;">style屬性方式</div>

(2)<style>標籤方式(嵌入式):定義在<head>標籤中,因為要先載入。<style>在<head>中,但位於<title>之後

<head>
    <!-- 一般定義在<head>標籤中。頁面載入時樣式要先載入,一旦讀到對應的標籤,就馬上把樣式加到對應的標籤上 -->
    <style type="text/css">
        div{
            color: #0000ff;
            background-color: #dddddd;
        }
    </style>
</head>
<body>
    <div>style標籤方式</div>
</body>

(3)CSS程式碼匯入方式:將CSS封裝成檔案進行匯入(此種方式在某些瀏覽器下不起作用 -- 不常用)

<head>
    <style type="text/css">
        @import url(xxx.css);
    </style>
</head>
<head>
    <style type="text/css">
        @import url(xxx.css);
    </style>
</head>


xxx.css檔案
/*
    在xxx.css檔案中匯入其他css檔案
    新增/修改xxx.css這個檔案即可,不用動html檔案
 */
@import url(1.css);
@import url(2.css);

(4)<link>連結方式(外部式):使用html程式碼的<link />標籤連結一個xxx.css檔案 -- 此種方式使用最多(實現結構和表現完全分離)

<head>
    <title></title>
    <!-- 
        連結一個與當前網頁相關聯的頁面
        href:連結的檔案地址
        rel:樣式表,指明與html的關係
     -->
    <link href="xxx.css" rel="stylesheet" type="text/css" />
    <!-- <style>標籤放在<link>標籤下面 -->
    <style type="text/css">

    </style>
</head>

2、@import url(xxx.css) 和 <link> 兩種方式的區別

(1)@import url(xxx.css):是css程式碼匯入的

         <link>:是用html程式碼連結的

(2)@import url(xxx.css):頁面先於css樣式表載入,使用者體驗不好

         <link>:頁面和css樣式表同時載入

3、樣式的優先順序

(1)由上到下、由外到內,優先順序由低到高(一般情況下以後載入的為主)

即 標籤內部:style屬性(內聯式) > 當前檔案中:<style>標籤(嵌入式) > 外部檔案中:<link>標籤(外部式)

注:嵌入式 > 外部式 有一個前提:嵌入式css樣式<style>的位置要在外部式<link>的後面

<head>
    <title></title>
    <link href="xxx.css" rel="stylesheet" type="text/css" />
    <!-- <style>標籤放在<link>標籤下面 -->
    <style type="text/css">

    </style>
</head>

(2)! important > 使用者自己設定的樣式 > 網頁製作者樣式 > 瀏覽器預設的樣式

    <style type="text/css">
        p {
            color: #000;
        }

        /* !important要寫在分號的前面 */
        p {
            color: red !important;
        }
    </style>

三、CSS選擇器

1、預定義樣式可以實現動態載入

2、CSS選擇器分類

(1)HTML標籤名選擇器:使用的是html的標籤名

(2)class選擇器/類選擇器(.):使用的是標籤中的class屬性。每個標籤都有一個class屬性(class屬性是專門為css提供樣式載入用的一個屬性) -- 最常用

注:

a). 設定樣式時,多用類選擇器。因為類選擇器的值可以有多個,而id選擇器的值需要唯一

b). class可以在相同標籤中對部分標籤進行相同樣式的載入,還可以對不同標籤進行相同樣式的設定

<head>
    <style type="text/css">
        div {
            color: blue;
        }

        /* .abc:對所有類名為abc的標籤都適用 */
        .abc {
            color: #00cc00;
        }

        /* 對<div>下的類名為abc的標籤適用 */
        div.abc {
            color: red;
        }

    </style>
</head>
<body>
    <div>xxx</div>
    <div class="abc">xxx</div>
    <span class="abc">xxx</span>
    <p class="abc">xxx</p>
</body>

(3)id選擇器(#):使用的是標籤中的id屬性。通常,id的取值在頁面中是唯一的,因為id屬性除了可以被css使用,還可以被js使用(獲取該名稱的標籤)。id通常都是為了標識頁面中的一些特定區域使用的(eg:表格/表單區域)

注:不允許同一個id應用於多個標記

補充:擴充套件選擇器

(4)關聯選擇器/後代選擇器( ):選擇器中的選擇器,即 相同標籤中的不同標籤顯示不同樣式,中間用空格( )隔開

注:兩個或多個選擇器之間產生關係,作用於所有子後代元素(不一定是父-子兩代),通常是表示層級的

    <style type="text/css">
        /* <span>標籤中的所有<b>標籤 */
        span b {
            
        }
    </style>

(5)子選擇器(>):用於選擇指定標籤元素的第一代子元素(直接後代,即 父-子關係

<head>
    <style type="text/css">
        /* 類名class="foot"標籤中的第一代<span>標籤 */
        .foot > span {
            color: red;
        }
    </style>
</head>
<body>
    <div class="foot">
        <span>第一代span,樣式改變</span>
        <div>
            <span>不是第一代span,樣式沒有改變</span>
        </div>
    </div>
</body>

(6)組合選擇器/分組選擇器(,):對多個選擇器進行相同樣式設定,多個選擇器之間用逗號(,)隔開

    <style type="text/css">
        /* 對 類名class="foot"標籤 和 <div>中的所有<p>標籤 加樣式 */
        .foot, div p {

        }
    </style>

(7)偽元素選擇器:不是真正的標籤,代表標籤的某些狀態(狀態和標籤相結合)。css中提供了一些已經定義好的樣式,可以直接使用

         可以相容所有瀏覽器的偽元素選擇器,就是在<a>標籤上使用的:hover。:hover可以放在任意標籤上,但它們的相容性不是很好。所以,現在比較常用的還是a: hover組合

a). 超連結<a>的狀態

     a: link :未訪問

     a: hover :游標移動到超連結上(滑鼠懸停)

     a: active :點選

     a: visited :訪問後

注:實際開發中,通常未訪問(link)和訪問後(visited)的效果一樣,點選(active)的效果一般不做

b). 段落<p>的偽元素選擇器

     p: first-line :段落的第一行文字(首行)

     p: first-letter :段落中的第一個字母(首字母)

     input: focus :具有焦點的元素,獲得焦點時新增效果

注:<div>等標籤也具有懸停、聚焦等效果,這些狀態也可以加到其他標籤上

(8)通用選擇器:匹配html中所有標籤元素 -- 不建議使用

    <style type="text/css">
        /* 通用選擇器:匹配html中所有元素標籤 */
        * {

        }
    </style>

3、選擇器的優先順序:HTML標籤選擇器(1) < 類選擇器(10) < id選擇器(100) < style屬性(>100)

注:

(1)作用範圍越小,優先順序越高(越少數,優先順序越高)

(2)複合選擇器的權重無論為多少個標籤選擇器的疊加,其權重都不會高於類選擇器

(3)複合選擇器的權重無論為多少個類選擇器和id選擇器的疊加,其權重都不會高於id選擇器

4、id選擇器和class選擇器的區別

(1)在一個html文件中,同一個id選擇器只能使用一次,而同一個類選擇器可以使用多次

(2)可以使用類選擇器詞列表方法為一個元素同時設定多個樣式,不能使用id詞列表

<head>
    <style type="text/css">
        .stress {
        }
        .bigsize {
        }
    </style>
</head>
<body>
    <!-- 一個元素可以用多個類,但要用空格隔開 -->
    <span class="stress bigsize">xxx</span>
    <!-- 下面程式碼是錯誤的 -->
    <!-- id選擇器不允許定義多個值(id是唯一的,用一個即可) -->
    <span id="stress bigsize">xxx</span>
</body>

(3)class用於新增樣式(值可相同),id用於js呼叫,通過id呼叫js的功能(值唯一)

四、盒子模型

1、用來封裝資料的一片區域叫盒子

注:對資料進行操作,需要把資料放到一個區域裡面,這種區域多為<div>。即 盒子多為<div>

2、盒子模型有三項基本內容

(1)邊框(border)

            /* border: 粗細(border-width) 樣式(border-style)(必須設定) 顏色(border-color) */
             border: 1px solid red;

注:設定邊框的粗細/顏色時,必須同時設定邊框樣式。如果未設定樣式或將樣式設定為none,則無論粗細/顏色設定為多少,都無效

(2)內邊距(padding)

        上  右  下  左

        上  左右  下

        上下  左右

注:padding不能為負值

(3)外邊距(margin)

注:margin可為負值,重疊

       對子元素應用負margin時,在大部分瀏覽器中,都會產生子元素壓住父元素的效果。但在IE6中,子元素超出的部分將被父元素遮蓋。解決辦法是將子元素的定位屬性position設定為相對的relative

3、盒子的總寬度 = width(文字的寬)+ 左右內邊距之和 + 左右邊框寬度之和 + 左右外邊距之和

      盒子的總高度 = height(文字的高)+ 上下內邊距之和 + 上下邊框寬度之和 + 上下外邊距之和 

注:寬度屬性width和高度屬性height僅適用於塊級元素,對行內元素無效(<img>和<input />除外)

4、實際開發中,一般會設定 body{margin: 0px;},因為不同瀏覽器對body邊距的處理有差別

注:如果盒子的margin值為0,它距瀏覽器的上下左右還有空白,這是<body>的距離。<body>本身距離瀏覽器顯示資料窗體的邊框有一個固定距離

    <style type="text/css">
        /* 不同瀏覽器對body邊距的處理有差別 */
        /* 開發時大都做此動作 */
        body {
            margin: 0px;
        }

        /* 塊級元素水平居中 */
        div {
            margin: 0px auto;
        }
    </style>

5、網頁中預設存在內外邊距的元素有:<body>、<h1>~<h6>、<p>等。製作網頁時,要清除元素的預設內外邊距

    <style type="text/css">
        /* 清除元素的預設內外邊距 */
        * {
            /* 清除內邊距。padding不能為負值 */
            padding: 0px;
            /* 清除外邊距。margin可為負值(重疊) */
            margin: 0px;
        }
    </style>

五、元素的浮動(float)

1、網頁中元素有三種佈局模型:

(1)流動模型(Flow):預設的網頁佈局模式。網頁在預設狀態下的html網頁元素都是根據流動模型來分佈網頁內容的

(2)浮動模型(Float)

(3)層模型(Layer):讓html元素在網頁中精確定位。層模型有三種形式:絕對定位(position: absolute)、相對定位(position: relative)、固定定位(position: fixed)

2、float:脫離標準文件流的控制。取值:none(預設) | left | right

3、如果圖片一個<div>,文字一個<div>,兩者外層還有一個<div>。此時,圖片漂浮起來,也得在外層<div>範圍內

4、行內元素本身不可以設定寬高,但有兩種方式可以讓行內元素可以設定寬高:a). 浮動float    b). 變成塊元素display: block; 

所以,浮動元素(行內元素/塊元素)浮動後,將變成塊元素,可以設定寬高

注:很多瀏覽器在顯示未指定width屬性的浮動元素時會出現bug。所以,要為浮動的元素指定width屬性

5、浮動的侷限性:根據元素位置確定浮動到哪裡,定位不夠準確。實際開發中多用定位position

六、清除浮動(clear)

1、clear:只能清除元素左右兩側浮動的影響。取值:none | left | right | both

2、子元素設定浮動時,如果不對其父元素定義高度,則子元素的浮動會對父元素產生影響

問題示例:大<div>中有兩個小<div>,大<div>沒有設定height。兩個小<div>都浮動後,大<div>不見了

<head>
    <style type="text/css">
        div {
            border: 1px solid red;
        }

        /* 大<div>沒有設定height */
        .div1 {
            width: 500px;
            /*height: 400px;*/
            background-color: gray;
        }

        .div2 {
            width: 100px;
            height: 100px;
            background-color: yellow;
            /* 小<div>浮動 */
            float: left;
        }

        .div3 {
            width: 150px;
            height: 50px;
            background-color: green;
            /* 小<div>浮動 */
            float: left;
        }
    </style>
</head>
<body>
    <!-- 大<div>沒有設定height,大<diiv>中的兩個小<div>浮動後,大<div>不見了 -->
    <div class="div1">
        <div class="div2">div2</div>
        <div class="div3">div3</div>
    </div>
</body>

解決方式:可以給大<div>清除浮動

方法一:使用空標記清除浮動

<body>
    <!-- 大<div>沒有設定height,大<diiv>中的兩個小<div>浮動後,大<div>不見了 -->
    <div class="div1">
        <div class="div2">div2</div>
        <div class="div3">div3</div>
        <!-- 使用空標記清除浮動 -->
        <div class="div4" style="clear: both"></div>
    </div>
</body>

方法二:使用overflow屬性清除浮動

<body>
    <!-- 大<div>沒有設定height,大<diiv>中的兩個小<div>浮動後,大<div>不見了 -->
    <!-- 使用overflow屬性清除浮動 -->
    <div class="div1" style="overflow: hidden">
        <div class="div2">div2</div>
        <div class="div3">div3</div>
    </div>
</body>

方法三:使用after偽物件清除浮動

<head>
    <style type="text/css">
        div {
            border: 1px solid red;
        }

        /* 大<div>沒有設定height */
        .div1 {
            width: 500px;
            /*height: 400px;*/
            background-color: gray;
        }

        /* 使用after偽物件清除浮動 */
        .div1 :after {
            /* content屬性值為空 */
            content: "";
            /* height值為0 */
            height: 0px;
        }

        .div2 {
            width: 100px;
            height: 100px;
            background-color: yellow;
            /* 小<div>浮動 */
            float: left;
        }

        .div3 {
            width: 150px;
            height: 50px;
            background-color: green;
            /* 小<div>浮動 */
            float: left;
        }
    </style>
</head>
<body>
    <!-- 大<div>沒有設定height,大<diiv>中的兩個小<div>浮動後,大<div>不見了 -->
    <div class="div1">
        <div class="div2">div2</div>
        <div class="div3">div3</div>
    </div>
</body>

七、元素的定位(position)

1、可以讓盒子去到頁面的任意位置

2、元素的定位屬性主要包括兩部分:

(1)定位模式:static(預設)、relative、absolute、fixed

(2)偏移屬性:top、bottom、left、right

注:

(1)定義多個偏移屬性時,如果left和right衝突,以left為準;如果top和bottom衝突,以top為準

(2)static不能使用偏移屬性(使用偏移屬性無效),而relative、absolute、fixed可以使用偏移屬性

3、四種定位模式

(1)靜態定位(static):任何元素在預設狀態下都會以靜態定位來確定自己的位置(各元素在預設位置)。當沒有定義position屬性時,會遵循預設值顯示為靜態位置。在靜態定位狀態下,無法通過偏移屬性(top、bottom、left、right)來改變元素的位置。即 對position: static使用top、left等偏移屬性無效

注:position: static相當於沒有做定位(相當於沒有定義position屬性)。 即 position: static == 沒有定義position屬性

(2)固定定位(fixed):對元素設定固定定位後,它將脫離標準文件流的控制,始終依據瀏覽器視窗來定義自己的顯示位置。不管如何滾動頁面,該元素都始終顯示在瀏覽器視窗的固定位置(不會隨瀏覽器視窗的滾動條滾動而變化)

注:

a). 固定定位是絕對定位absolute的一種特殊形式

b). 固定定位的元素會變成塊元素,不管原來是什麼元素

c). IE6不支援固定定位

(3)絕對定位(absolute)將物件從文件流中拖出(脫離標準文件流),依據最近的已經定位(絕對定位absolute | 相對定位relative | 固定定位fixed)的祖先元素進行定位。如果所有祖先元素都沒有定位(包括靜態定位position:static),則依據<body>定位,即相對於瀏覽器視窗(使用偏移屬性top、bottom、left、right)

<head>
    <style type="text/css">
        /* div1脫離文件流,可對其進行定位。通過設定top、left等偏移屬性,想將div1定位在哪裡都可以 */
        /* 此處div1的祖先元素都沒有定位,所以div1的定位要依據<body> */
        .div1 {
            position: absolute;
            /* 距<body>上邊的距離 */
            top: 50px;
            left: 50px;
        }

    </style>
</head>
<body>
    <div>
        <div class="div1">div1</div>
        <div>div2</div>
        <div>div3</div>
    </div>
</body>

注:

a). 如果僅設定絕對定位absolute,不設定偏移屬性,則元素的位置不變。但其不再佔用標準文件流中的空間,與上移的後續元素重疊

b). 子元素依據其直接父元素進行絕對定位absolute,但其直接父元素不需要定位,怎麼辦?

      可以將直接父元素設定為相對定位relative,但不對其設定偏移量。然後再對子元素應用絕對定位absolute,並通過偏移屬性對其進行精確定位

<head>
    <style type="text/css">
        div {
            border: 1px solid red;
        }

        /* 將父元素設定為相對定位relative,但不對其設定偏移量(top、left等) */
        #box1 {
            width: 200px;
            height: 200px;
            position: relative;
        }

        /* 對子元素應用絕對定位absolute,並通過偏移屬性對其進行精確定位 */
        #box2 {
            position: absolute;
            bottom: 0px;
            left: 0px;
        }
    </style>
</head>
<body>
<div id="box1">
    <img src="http://img.mukewang.com/541a7d8a00018cf102000200.jpg">
    <div id="box2">子元素依據父元素進行絕對定位</div>
</div>

c). 如果用一個程式不斷修改<div>盒子的 top/left 的值(自增),意味著此<div>盒子在不斷地移動 -- 圖片飛動的原理

d). 絕對定位的元素會變成塊元素

(4)相對定位(relative):相對於自身的預設位置進行偏移(相對於以前的位置移動,偏移前的位置保留不動)。物件不可層疊,將依據偏移屬性(top、bottom、left、right)在正常文件流中偏移位置(不出文件流 -- 其他元素位置固定不動

注:如果父/祖先<div>有position: absolute/relative/fixed,則子<div>的position: relative相對於父/祖先<div>。如果父/祖先<div>沒有定義position(包括靜態定位position:static),則子<div>的position:relative相對於<body>

4、絕對定位absolute和相對定位relative的異同

(1)相同

     absolute和relative都可以用偏移屬性(top、bottom、left、right)進行定位

(2)不同

     absolute:將物件從文件流中拖出

     relative:不會把物件從文件流中拖出(物件不可層疊)

(3)定位元素:position: absolute;

         參照定位的元素:position: relative;