10-CSS3新特性

CSS3簡介

CSS3的現狀

  1. 瀏覽器支持程度差,需要添加<a href="#abc">私有前綴</a>;
  2. 移動端支持優于PC端;
  3. 不斷改進中;
  4. 應用相對廣泛,-webkit-border-radius(radius 半徑)。
  • 要遵循漸進原則。

準備工作

環境準備

  • 由于CSS3兼容性問題的普遍存在,為了避免因兼容性帶來的干擾,我們約定統一的環境,以保證學習的效率,在最后會單獨說明兼容性的問題。
  • Chrome瀏覽器 version 46+
  • Firefox瀏覽器 firefox 42+

如何使用手冊

  • 程序開發是一個不斷學習的過程,學會使用工具,可以讓我們事半功倍。
  • []:表示全部可選項 padding
  • ||:1個或者更多;
  • |:多選一;
  • ?:表示0個或者1個;
  • *:表示0個或者多個;
  • {}:表示范圍。
  • :學習過程中一定要學會查看手冊,培養自主學習能力。

基礎知識

選擇器

  • CSS3新增了許多靈活查找元素的方法,極大的提高了查找元素的效率和精準度。CSS3選擇器與jQuery中所提供的絕大部分選擇器兼容。

  • 之前學過的選擇器:

    • div{}:標簽選擇器;
    • .box{}:類選擇器;
    • #box:id選擇器;
    • div p:后代選擇器;
    • div.box:交集選擇器;
    • div,p,span:并集選擇器;
    • div>p:子代選擇器;
    • *:通配符;
    • div+p:選擇div后面的第一個兄弟p(p必須要緊跟在div之后);
    • div~p:選中div后面所有的兄弟p。
屬性選擇器:[]
  • 其特點是通過屬性來選擇元素,具體有以下5種形式:

  • E[attr],表示存在attr屬性即可:div[title]:表示頁面中帶有title屬性的div;

  • E[attr=val]表示屬性值完全等于val:div[class=mydemo]

  • E[attr*=val]表示的屬性值里包含val字符并且在“任意”位置:div[class*=mydemo];

  • E[attr^=val]表示的屬性值里包含val字符并且在“開始”位置:div[class^=mydemo]

  • E[attr=val]表示的屬性值里包含val字符并且在“結束”位置:`div[class=demos]`;

  • 案例:配合jQuery 的過濾選擇器

偽類選擇器
  • 除了以前學過的:link、:visited、:hover、:active、:focus,CSS3又新增了其它的偽類選擇器。

  • 以某元素相對于其父元素或兄弟元素的位置來獲取元素的結構偽類

  • 重點理解通過E來確定元素的父元素;

  • 所選到的元素的類型,必須是指定的類型E,否則無效。

  • E:first-child:第一個子元素;

  • E:last-child:最后一個子元素;

  • E:nth-child(n):第n個子元素,編號從1開始,計算方法是元素E的全部兄弟元素;

//第三個元素
div>ul>li:nth-child(3){
        color: deeppink;
}
  • E:nth-last-child(n)同E:nth-child(n) 相似,只是倒著計算;
div>ul>li:last-child(2){
        color: deeppink;
}
- n遵循`線性變化`,其取值0、1、2、3、4、... 但是當n<=0時,選取無效。
- 選中所有的奇數的li:`括號中的表達式形式必須是n在前`
li:nth-child(2n-1){
        color: red;
}
- 選中所有的7的倍數的li:
li:nth-child(7n){
        color: red;
}
- 選中前面五個:
li:nth-child(-1n+5){
        color: red;
}
  • 選中后面五個:
li:nth-last-child(-1n+5){
        color: red;
}
  • 所有的偶數
li:nth-child(even){
        color:red
}
  • 所有的奇數
li:nth-child(odd){
        color:blue;
}
- n可是多種形式:nth-child(2n)、nth-child(2n+1)、nth-child(-1n+5)等;
- 案例:日歷圖。
  • E:empty:選中沒有任何子節點的E元素(使用不是非常廣泛),沒有任何的子元素,包括空格,即元素為空的狀態。

  • 目標偽類:E:target結合錨點進行使用,處于當前錨點的元素被選中,表示元素被激活的狀態;

<li><a href="#title1">CSS (層疊樣式表)</a></li>
<h2 id="title1">CSS (層疊樣式表)</h2>
h2:target{
    color:red;
}
  • 點擊章節進行相應跳轉變色。
偽元素選擇器
  • 偽元素:
  • 重點:E::beforeE::after,是一個行內元素,需要轉換成塊元素;
  • E:after、E:before在舊版本里是偽類,在新版本里是偽元素,新版本下E:after、E:before會被自動識別為E::after、E::before,按偽元素來對待,這樣做的目的是用來做兼容處理必須要有content,否則無法顯示。E:after、E:before后面的練習中會反復用到,目前只需要有個大致了解。
.box::before{
    content:"今天";
}
.box::after{
    content:"真好";
}
  • 偽元素選擇器:
  • E::first-letter文本的第一個字母或(如中文、日文、韓文等);
  • 案例:首字下沉
  • E::first-line,文本第一行;
  • E::selection,選中的文本,可以根據這個效果去更改選中區域的樣式(可以更改背景顏色和文字顏色,但是不能改變字體大小);
  • ":""::"區別在于區分偽類和偽元素
  • 關于before和after:
  • CSS2中,E:before或者E:after,是屬于偽類的,并且沒有偽元素的概念;
  • CSS3中,提出偽元素的概念 E::before和E::after,并且歸屬到了偽元素當中,偽類里就不再存在E:before或者E:after偽類。

顏色

  • 一種新的顏色的表示方式:rgba(255,0,0,0.1),RGBA是代表Red(紅色)、Green(綠色)、Blue(藍色)和Alpha的色彩空間。雖然它有的時候被描述為一個顏色空間。

  • 新增了RGBA、HSLA模式,其中的A 表示透明度通道,即可以設置顏色值的透明度,相較opacity,它們不具有繼承性,即不會影響子元素的透明度。

  • Red、Green、Blue、Alpha即RGBA;

  • R、G、B 取值范圍0~255。

  • Hue、Saturation、Lightness、Alpha即HSLA;

  • H:色調,取值范圍0~360,0/360表示紅色、120表示綠色、240表示藍色;

  • S:飽和度,取值范圍0%~100%;

  • L:亮度,取值范圍0%~100%;

  • A:透明度,取值范圍0~1。

  • 關于透明度:

  • opacity,只能針對整個盒子設置透明度,子盒子及內容會繼承父盒子的透明度(此時不能再設置子盒子的透明度);

  • transparent,可以單獨設置透明度,但是不可調節透明度,始終完全透明;

  • RGBA、HSLA可應用于所有使用顏色的地方。

  • 案例:

  • opacity,設置透明度,只能針對整個盒子設置透明度,子盒子會繼承父盒子的透明度。

.out{
        width: 200px;
        height: 200px;
        background: green;
        border: 1px solid darkgreen;
        margin: 40px auto;
        opacity: 0.3;
}

子盒子也出現透明

.out .inner{
        width: 100px;
        height: 100px;
        background-color: yellow;
}
  • background-color: transparent,完全透明,不可調節透明度.
  • 使用rgba來控制顏色,相對opacity ,不具有繼承性

文本 (shadow陰影)

text-shadow,可分別設置偏移量、模糊度、顏色(可設透明度)。
  • 水平偏移量,正值向右,負值向左;
  • 垂直偏移量,正值向下,負值向上;
  • 模糊度不能為負值,值越大越模糊;
  • 顏色,設置對陰影的顏色,可以有多個影子。
    代碼演示:
// 3px,水平偏移量。正值向右  負值向左
//5px,垂直偏移量,正值向下 負值向上
//5px,模糊度,模糊度不能為負值,值越大越模糊
//#ccc,設置對象陰影的顏色。可以有多個影子.
ul>li{
    margin: 20px;
    font-size: 24px;
}
ul>li:nth-child(1){
    text-shadow: 5px 5px 2px #ccc;
}
ul>li:nth-child(2){
     text-shadow: -5px  -5px 2px #ccc;
}
ul>li:nth-child(3){
    text-shadow: 5px 5px 2px #ccc, -5px  -5px 2px #ccc;
}
  • 案例:浮雕文字.
/*設置背景色.*/
body {
    background-color: gray;
    font: bold 6em "microsoft yahei";
}
div {
    margin: 30px;
    color: #808080;
    text-align: center;
}
/*設置水平向左1px 向上1 px   向右1px 向下1px */
.to{
    text-shadow: -1px -1px 1px #000,1px 1px 1px #fff;
}
.ao{
    text-shadow: -1px -1px 1px #000,1px 1px 1px #fff;
}

盒模型

  • CSS3中可以通過box-sizing來指定盒模型,即可指定為content-box、border-box,這樣我們計算盒子大小的方式就發生了改變。

  • box-sizing有兩個值:content-box、border-box。可以分成兩種情況:

  • content-box:外加模式,對象的實際寬度等于設置的width值和border、padding之和

  • border-box:內減模式,對象的實際寬度就等于設置的width值,即使定義有border和padding也不會改變對象的實際寬度,即 ( Element width = width ),我們把這種方式叫做盒模型。

  • 默認是外加模式。

  • 兼容性比較好。

  • 練習:圖片展示(內減模式)

<span id="abc">瀏覽器私有化前綴:</span>
  • 谷歌、Safari瀏覽器內核:-webkit-;
  • 火狐瀏覽器內核:-moz-;
  • IE瀏覽器內核:-ms-;
  • 歐鵬瀏覽器內核:-o-;
.box{
    width:200px;
    height:200px;
    border:1px solid #000;
    /*background:linear-gradient(left,red,blue);*/
    /*以上屬性,一般的瀏覽器都不支持,加上對應的前綴即可被相應的瀏覽器識別,如下*/
    background:-webkit-linear-gradient(left,red,blue);
    background:-moz-linear-gradient(left,red,blue);
    background:-ms-linear-gradient(left,red,blue);
    background:-o-linear-gradient(left,red,blue);
}

邊框

  • 邊框圓角邊框陰影屬性,應用十分廣泛,兼容性也相對較好,具有符合漸進增強原則的特征,需要重點掌握

邊框圓角

  1. border-top-radius:每個角可以設置兩個值,第一個值x值是水平方向上的值,第二個y值是垂直方向上的值;
  2. border-radius:可以有一個值、兩個值、三個值、四個值,還可以用“/”分割橫坐標和縱坐標的值;賦值順序,從左上順時針進行賦值,如果沒有值就取對角的值;
  3. 邊框圓角處理、正方形、扇形;
  4. 橢圓,圓角處理時,腦中要形成圓、圓心、橫軸、縱軸的概念,正圓是橢圓的一種特殊情況。
  5. 以“/”進行分隔,可分別設置長、短半徑,遵循順時針規則,左上角為1,“/”前面的1~4個用來設置橫軸半徑(分別對應橫軸1、2、3、4位置 ),“/”后面1~4個參數用來設置縱軸半徑(分別對應縱軸1、2、3、4位置 )
border-radius:40px 50px 20px 40px / 10px 10px 10px 10px;

邊框陰影

box-shadowtext-shadow用法差不多.

  1. 水平偏移量,正值向右,負值向左;
  2. 垂直偏移量,正值向下,負值向上;
.box{
        box-shadow: 5px 5px 5px 27px red, -5px -5px 5px -5px green;
}
  1. 模糊度是不能為負值;
  2. 陰影大小;
  3. 陰影顏色;
  4. inset可以設置內陰影;
.box{
    box-shadow:inset 5px 5px 5px 5px red,inset -5px -5px 5px -5px green;
}

7 :設置邊框陰影不會改變盒子的大小,即不會影響其兄弟元素的布局。
可以設置多重邊框陰影,實現更好的效果,增強立體感。

邊框圖片(了解)

  1. border-image:設置邊框的背景圖片;
border-image: url("images/border.png") 27/20px round
  • 盒子的總寬高不會改變;
  1. border-image-source:url(""):設置邊框圖片的地址;
  2. border-image-slice:27,27,27,27:裁剪圖片,如何去裁切圖片,瀏覽器會自動去裁剪圖片;
  3. border-image-width:20px;:指定邊框的寬度;
  4. 邊框平鋪的樣式:border-image-repeat: stretch;
  5. stretch,拉升;
  6. round:平鋪,會自動調整縮放比例(如果谷歌版本很高可能會出現問題);
  7. repeat(重復):正常平鋪,但是可能會顯示不完整。
  • 設置的圖片將會被“切割”成九宮格形式,然后進行設置:
  1. “切割”完成后生成虛擬的9塊圖形,然后按對應位置設置背景,
  2. 其中四個角位置、形狀保持不變,中心位置水平垂直兩個方向平鋪;
  • round和repeat之間的區別:

  • round會自動調整尺寸,完整顯示邊框圖片。

  • repeat單純平鋪多余部分,會被“裁切”而不能完整顯示。

  • 更改裁切尺寸:

background-slice: 34 36 27 27
  • 關于邊框圖片重點理解9宮格的裁切及平鋪方式,實際開發中應用不廣泛,但是如能靈活運用會給我們帶來不少便利。
  • 案例:用css 實現

漸變

  • 漸變是CSS3當中比較豐富多彩的一個特性,通過漸變我們可以實現許多炫麗的效果,有效的減少圖片的使用數量,并且具有很強的適應性和可擴展性。
    可分為線性漸變、徑向漸變

線性漸變 (gradient 變化,屬于背景圖片里)

  • linear-gradient線性漸變指沿著某條直線朝一個方向產生漸變效果。
  • 例如從黃色水平漸變到綠色:
background-image:linear-gradient(
    to right, 表示方向 (left,top,right,left ,也可以使用度數)
    Yellow,  漸變起始顏色
    Green   漸變終止顏色
)
background:linear-gradient(
      to right,
      red 0%, red 25% ,
      blue 25%,blue 50%,
      green 50%,green 75%,
      pink 75% ,pink 100%
);  //前一個是起始顏色,后一個是終止顏色,百分比為占總長度的百分比
.box6{
    width: 600px;
    height: 150px;
    background: linear-gradient(135deg,#000 0%, #000 10%, #fff 10%, #fff 20%,#000 20%, #000 30%, #fff 30%, #fff 40%,#000 40%, #000 50%, #fff 50%, #fff 60%,#000 60%, #000 70%, #fff 70%, #fff 80%,#000 80%, #000 90%, #fff 90%, #fff 100%);
    animation: gun 5s linear infinite;
    background-size: 100px 150px;
}
@keyframes gun {
    from{

    }
    to{
        background-position: 100px 0px;
    }
}
  1. 必要的元素:
  • a、方向
  • b、起始顏色
  • c、終止色;
  • 方向:垂直向上為0度,順時針逐漸增大。

徑向漸變 (radial 徑向)

  • radial-gradient:徑向漸變指從一個中心點開始,沿著四周產生漸變效果:
background: radial-gradient(
    150px  at  center,
    yellow,
    green
);
  • 圍繞中心點做漸變,半徑是150px,從黃顏色到綠顏色做漸變。

  • 必要的元素:

  • a、中心點,即圓的中心(中心點的位置是以盒子自身)

background: radial-gradient(
        150px  at left center,
        yellow,
        green
);

以左上角為圓的中心點

background: radial-gradient(
        150px  at 0px  0px,
        yellow,
        green
);
  • b、漸變起始色
  • c、漸變終止色
  • 關于中心點:中心位置參照的是盒子的左上角;
  • 關于輻射范圍:其半徑可以不等,即可以是橢圓;
div{
     width: 300px;
     height: 300px;
     margin:100px auto;
     background: radial-gradient(
         250px  at 0px 0px,
         yellow,
         green
     );
     border-radius: 150px;
}

背景

  • 背景在CSS3中也得到很大程度的增強,比如背景圖片尺寸、背景裁切區域、背景定位參照點、多重背景等。
  • background-size:width,height,可以設置背景圖片的寬度以及高度。

background-size設置背景圖片的尺寸

  • background-size:600px auto;:自動是適應盒子的寬度;

  • background-size:100% 100%;:通過百分比設置背景圖片大小;

  • 通過具體數值來調整背景的尺寸:background-size: 100px 100px;

  • cover:會自動調整縮放比例,保證圖片始終填充滿背景區域,如有溢出部分則會被隱藏,圖片有可能不完整顯示。

  • contain:會自動調整縮放比例,保證圖片始終完整顯示在背景區域;但是不保證鋪滿盒子,也可以使用長度單位或百分比 。

  • 案例:全屏背景自動適應。

background-origin(原點,起點)設置背景定位的原點

  • 所謂的背景原點就是調整背景位置的一個參照點,調整背景圖片定位的參照原點。
  • border-box以邊框做為參考原點;
  • padding-box以內邊距做為參考原點(默認值);
  • content-box以內容區做為參考點。

background-clip設置背景區域clip(裁切)

  • border-box裁切邊框以內為背景區域,邊框外邊緣
  • padding-box裁切內邊距以內為背景區域;
  • content-box裁切內容區做為背景區域;

以逗號分隔可以設置多背景,可用于自適應局

  • 背景圖片尺寸在實際開發中應用十分廣泛。
案例:
  • 相框;
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>相框</title>

    <style>
        .album{
            width: 623px;
            height: 417px;
            border: 1px solid #000;
            background:
                url("images/bg1.png") no-repeat,
                url("images/bg2.png") no-repeat right top,
                url("images/bg3.png") no-repeat right bottom,
                url("images/bg4.png") no-repeat bottom left,
                url("images/bg5.png") no-repeat center;
            font: 700 60px/400px "Microsoft Yahei";
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="album">永垂不朽</div>
</body>
</html>
  • 手機界面。
  • 如果有背景顏色,必須加載最后一個url后面。
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>相框</title>

    <style>
        .phone{
            width: 639px;
            height: 800px;
            border: 1px solid #000;
            margin: 20px auto;
            background: url("images/head.jpg") no-repeat top,url("images/foot.jpg") no-repeat bottom,rgb(45,0,130);
        }
    </style>
</head>
<body>
        <div class="phone"></div>
</body>
</html>

過渡(transition)重點

  • Transition:param1 param2
  • param1:要過渡的屬性;
  • param2:過渡的時間。
  • 過渡是CSS3中具有顛覆性的特征之一,可以實現元素不同狀態間的平滑過渡(補間動畫),經常用來制作動畫效果;
  • 補間動畫:自動完成從起始狀態到終止狀態的的過渡。不用管中間的狀態;
  • 幀動畫:撲克牌切換.通過一幀一幀的畫面按照固定順序和速度播放。如電影膠片
  • 關于補間動畫更多學習可查看http://mux.alimama.com/posts/1009
  • 特點:當前元素只要有“屬性”發生變化時,可以平滑的進行過渡。
  • 相關屬性:
  • transition-property設置過渡屬性;,默認值為all;
  • transition-duration設置過渡時間,
  • transition-timing-function設置過渡的動畫類型,linear(勻速)、ease-in (由慢到快)、ease(平滑過渡,默認值);
  • transition-delay設置過渡延時,過了多長時間后執行動畫。
案例:
  • 氣泡
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>氣泡</title>

    <style>
        .paopao{
            width: 350px;
            height: 150px;
            border: 1px solid #000;
            margin: 20px auto;

            background: url("images/paopao.png") no-repeat top left,url("images/paopao.png") no-repeat right bottom;
            background-color: #000;

            transition: 3s linear;
        }

        .paopao:hover{
            background-position: bottom left,right top;
        }
    </style>
</head>
<body>
    <div class="paopao"></div>
</body>
</html>
  • 商品列表
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>邊框陰影</title>

    <style>
        body{
            background-color: #ddd;
        }
        .items{
            margin: 30px auto;
            width: 1250px;
            height: 300px;
        }

        .item{
            float: left;
            width: 230px;
            height: 300px;
            margin-right: 20px;
            text-align: center;
            background-color: #fff;
            position: relative;
            overflow: hidden;

            transition: 0.5s linear;
        }
        .pic{
            margin-top: 30px;
        }
        .desc{
            height: 60px;
            width: 100%;
            background-color: #f90;
            bottom: -60px;
            position: absolute;
            transition: 0.5s linear;
        }

        .item:hover{
            box-shadow: 0 0 18px #999;
            top: -5px;
        }
        .item:hover .desc{
            bottom: 0;
        }
    </style>
</head>
<body>
    <div class="items">
        <div class="item">
            ![](images/1.jpg)
        </div>
        <div class="item">
            ![](images/2.jpg)
            <div class="desc"></div>
        </div>
        <div class="item">
            ![](images/3.jpg)
            <div class="desc"></div>
        </div>
        <div class="item">
            ![](images/4.jpg)
            <div class="desc"></div>
        </div>
        <div class="item">
            ![](images/5.jpg)
            <div class="desc"></div>
        </div>
    </div>
</body>
</html>
  • 手風琴效果
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>手風琴</title>

    <style>
        .accordion{
            margin: 60px auto;
            width: 400px;

        }
        .sec{
            border-bottom: 1px solid #00f;
            background-color: #993;
            transition: 0.5s linear;
        }
        .title{
            height: 30px;
            line-height: 30px;
            margin-left: 20px;
        }
        .con{
            height: 0;
            background-color: transparent;
            transition: 0.5s linear;
        }
        .sec:last-child{
            border-bottom: none;
        }

        .sec:hover{
            background-color: #9f3;
        }
        .sec:hover .con{
            height: 200px;
            background-color: pink;
        }

    </style>
</head>
<body>
    <div class="accordion">
        <div class="sec">
            <div class="title">新聞標題</div>
            <div class="con"></div>
        </div>
        <div class="sec">
            <div class="title">新聞標題</div>
            <div class="con"></div>
        </div>
        <div class="sec">
            <div class="title">新聞標題</div>
            <div class="con"></div>
        </div>
        <div class="sec">
            <div class="title">新聞標題</div>
            <div class="con"></div>
        </div>
    </div>
</body>
</html>

2D轉換重點

  • 轉換是CSS3中具有顛覆性的特征之一,可以實現元素的位移、旋轉、變形、縮放,甚至支持矩陣方式,配合剛學習的過渡和動畫知識,可以取代大量之前只能靠Flash才可以實現的效果。在css3 當中,通過transform(變形) 來實現2d 或者3d 轉換,其中2d 有:縮放、移動、旋轉。

  • 移動translate(x,y)可以改變元素的位置,x、y可為負值,移動位置相對于自身原來位置

  • x,在水平方向移動;

  • y,在垂直方向移動;

  • 如果只有一個參數,默認為水平方向;

  • 除了可以是像素值,也可以是百分比,相對于自身的寬度或高度

  • 縮放scale(x,y)可以對元素進行水平和垂直方向的縮放,x、y的取值可為小數,不可為負值,大于1時為放大,小于1時為縮小。

  • 旋轉rotate(45deg),可以對元素進行旋轉,正值為順時針,負值為逆時針。

  • 當元素旋轉以后,坐標軸也跟著發生轉變;

  • 調整順序可以解決,把旋轉放到最后。

  • 傾斜:skew(deg,deg)可以使元素按一定的角度進行傾斜,可為負值,第二個參數不寫默認為0;

  • 第一個值為水平方向上傾斜的角度;

  • 第二個值為垂直方向上傾斜的角度

  • 矩陣:matrix()把所有的2D轉換組合到一起,需要6個參數(了解)。

  • transform-origin:可以調整元素轉換的原點。

  • 我們可以同時使用多個轉換,其格式為:transform: translate() rotate() scale(); ...等,其順序會影響轉換的效果。

案例
  • 盒子水平居中對齊;
.box{
    //距父盒子左側距離為父盒子寬度一半
    margin-left:50%;
    //往左側移動自身寬度的一般
    transform:translate(-50%);
}
  • 火箭移動;
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>小火箭</title>

    <style>
        html,body{
            width: 100%;
            height: 100%;
        }
        body{
            background-color: rgb(229,175,97);
        }

        img{
            position: absolute;
            left: 100px;
            bottom: 0;
            width: 80px;
            border: 1px solid #000;
            transform: translate(0px,150px) rotate(45deg);
            transition: all 1s;
        }
        body:hover img{
            transform: translate(600px,-300px) rotate(90deg);
        }
    </style>
</head>
<body>
    ![](images/rocket.png)
</body>
</html>
  • 盾牌,將位置還原
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>盾牌</title>

    <style>
        body{
            background-color: #000;
        }
        .shield{
            margin:60px auto;
            width: 420px;
        }

        img{
            transition: 0.3s;
        }
        img:nth-child(1){
            transform: translate(-184px,-52px) rotate(45deg);
        }
        img:nth-child(2){
            transform: translate(0px,-50px) rotate(0deg);
        }
        img:nth-child(3){
            transform: translate(52px,30px) rotate(45deg);
        }
        img:nth-child(4){
            transform: translate(-52px,30px) rotate(-45deg);
        }
        img:nth-child(6){
            transform: translate(152px,30px) rotate(45deg);
        }
        img:nth-child(7){
            transform: translate(-72px,30px) rotate(45deg);
        }
        img:nth-child(8){
            transform: translate(0px,50px) rotate(0deg);
        }
        img:nth-child(9){
            transform: translate(40px,50px) rotate(-30deg);
        }

        .shield:hover img{
            transform: none;
        }
    </style>
</head>
<body>
    <div class="shield">
        ![](images/shield_1_01.png)
        ![](images/shield_1_02.png)
        ![](images/shield_1_03.png)
        ![](images/shield_1_04.png)
        ![](images/shield_1_05.png)
        ![](images/shield_1_06.png)
        ![](images/shield_1_07.png)
        ![](images/shield_1_08.png)
        ![](images/shield_1_09.png)
    </div>
</body>
</html>
  • 旋轉 原點:transform-origin:left top;
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>對話框</title>

    <style>
        div{
            /*border: 1px solid #000;*/
            background-color: pink;
        }

        .bigBox{
            width: 200px;
            height: 60px;
            margin-top: 40px;
            position: relative;
        }
        .smallBox{
            width: 40px;
            height: 40px;
            position: absolute;
        }

        .sBox1{
            left: 50%;
            transform: translate(-50%);
            transform: rotate(45deg);
            transform-origin: left top;
            top: -10px;
        }
        .sBox2{
            right: 0;
            top: 10px;

            transform: translateY(-50%);
            transform: rotate(45deg);
        }
        .sBox3{
            left: 50%;
            transform: translate(-50%);
            transform: rotate(45deg);
            transform-origin: left top;
            bottom: 10px;
        }
        .sBox4{
            top: 10px;
            transform: rotate(45deg);
        }
    </style>
</head>
<body>

    <div class="box1 bigBox">
        <div class="sBox1 smallBox"></div>
    </div>
    <div class="box2 bigBox">
        <div class="sBox2 smallBox"></div>
    </div>
    <div class="box3 bigBox">
        <div class="sBox3 smallBox"></div>
    </div>
    <div class="box4 bigBox">
        <div class="sBox4 smallBox"></div>
    </div>
</body>
</html>
  • 撲克牌
  • 心形

3D轉換

左手坐標系

  • 伸出左手,讓拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方。這樣我們就建立了一個左手坐標系,拇指、食指和中指分別代表X、Y、Z軸的正方向。

  • CSS中的3D坐標系:

  • CSS3中的3D坐標系與上述的3D坐標系是有一定區別的,相當于其繞著X軸旋轉了180度。

  • 借助示例理解3D轉換:

    1. 繞X軸旋轉;
    2. 繞Y軸旋轉;
    3. 繞Z軸旋轉;
    4. 在X軸移動;
    5. 在Y軸移動;
    6. 在Z軸移動。

左手法則

  • 左手握住旋轉軸,豎起拇指指向旋轉軸正方向,正向就是其余手指卷曲的方向

透視(perspective)

  • 電腦顯示屏是一個2D平面,圖像之所以具有立體感(3D效果),其實只是一種視覺呈現,通過透視可以實現此目的,并不是真正的3D。

  • 透視可以將一個2D平面,在轉換的過程當中,呈現3D效果。

  • 注:并非任何情況下需要透視效果,根據開發需要進行設置。

  • perspective有兩種寫法

  1. 作為一個屬性,設置給父元素,作用于所有3D轉換的子元素;
  2. 作為transform屬性的一個值,做用于元素自身(使用較少)。
<div class="b1" transform="perspective:30px">
  • 理解透視距離:
  • 透視會產生“近大遠小”的效果.
案例:
  • 音樂盒;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>3D</title>

    <style>
        body{
            background: #ccc;
        }
        div:nth-child(1){
            width: 300px;
            height: 300px;
            margin: 40px auto;

            position: relative;
        }

        div:nth-child(1)::before,div:nth-child(1)::after{
            content: "";
            width: 300px;
            height: 300px;
            position: absolute;
            left: 0;
            top: 0;
            background: url("images-3D/musict.jpg") no-repeat;
            border-radius: 50%;
            transition: all 3s;
            transform-origin: bottom;
        }

        div:nth-child(1)::before{
            background: url("images-3D/musicb.jpg");
        }

        div:nth-child(1):hover::after{
            transform: rotateX(180deg);
        }
    </style>
</head>
<body>
    <div></div>
    <audio src="images-3D/style.mp3" loop></audio>

    <script>
        var open = document.querySelector("div:nth-child(1)");
        var music = document.querySelector("audio");
        open.onmousemove = function () {
            music.play();
        };
        open.onmouseleave = function () {
            music.pause();
        }
    </script>
</body>
</html>
  • 百度錢包;
  • 設置元素背面是否可見:backface-visibility;
  • 翻轉的文字;
  • 通過偽元素來獲取自定義屬性的值:attr(data-text);
  • 3D導航;
  • 立體導航欄。

3D呈現(transform-style)

  • 設置內嵌的元素在3D空間如何呈現,這些子元素必須為轉換原素.

  • flat:所有子元素在 2D 平面呈現;

  • preserve-3d:保留3D空間;

  • 3D元素構建是指某個圖形是由多個元素構成的,可以給這些元素的父元素設置transform-style:preserve-3d來使其變成一個真正的3D圖形。

案例:
  • 立方體;
  • 3D導航;
  • 立體導航條

動畫

  • 動畫是CSS3中具有顛覆性的特征之一,可通過設置多個節點來精確控制一個或一組動畫,常用來實現復雜的動畫效果。

  • 必要元素:

  • 通過@keyframes指定動畫序列;

  • 通過百分比將動畫序列分割成多個節點;

  • 在各節點中分別定義各屬性

  • 通過animation將動畫應用于相應元素;

  • 使用:

  • 類似js中的函數:先定義,再調用;

  • 定義動畫:

@keyframes 動畫名{
        from{初始狀態}
        to{結束狀態}
}
  • 定義多組動畫:
@keyframes move{
        0%{}
        25%{}
        50%{}
        75%{}
        100%{}
}
  • 調用:
    • 基本調用方式:
animation: 動畫名稱 持續時間 (執行次數:3,infinite);
  • 關鍵屬性
  1. animation-name:設置動畫序列名稱;
  • animation-duration動畫持續時間;

  • animation-delay動畫延時時間;

  • animation-timing-function動畫執行速度(運動曲線):linear、ease等;

  • animation-play-state動畫播放狀態,running、paused等;

  • animation-direction動畫的方向:normal正常,alternate可逆等;

  • animation-fill-mode動畫執行完畢后狀態:forwards(結束后保持結束時的狀態)、backwards(結束后保持開始時候的狀態)等;

  • animation-iteration-count動畫執行次數:可以是具體數字或者inifinate等;

  • steps(60) 表示動畫分成60步完成。

  • 參數值的順序:關鍵幾個值,除了名字、動畫時間、延時有嚴格順序要求,其它隨意。

案例
  • 捕魚達人;
  • 太陽系;
  • 全屏切換;
  • 鐘表;
  • 大海波濤;
  • 無縫滾動。

伸縮布局

  • CSS3在布局方面做了非常大的改進,使得我們對塊級元素的布局排列變得十分靈活,適應性非常強,其強大的伸縮性,在響應式開中可以發揮極大的作用。

  • 學習新的概念:

  • 主軸:Flex容器的主軸主要用來配置Flex項目,默認是水平方向;

  • 側軸:與主軸垂直的軸稱作側軸,默認是垂直方向的;

  • 方向:默認主軸從左向右,側軸默認從上到下;

  • 主軸和側軸并不是固定不變的,通過flex-direction可以互換

  • 必要元素:

  • 指定一個盒子為伸縮盒子 display: flex;

  • 設置屬性來調整此盒的子元素的布局方式,例如:flex-direction;

  • 明確主側軸及方向;

  • 可互換主側軸,也可改變方向。

各屬性詳解
  1. flex-direction調整主軸方向(默認為水平方向)該屬性通過定義flex容器的主軸方向來決定felx子項在flex容器中的位置:
  • row,水平方向;

  • reverse-row,反轉(也反序),從最右邊開始向左排列,順序發生改變,從最右邊開始;

  • column,垂直方向;

  • reverse-column 反轉列。

  • justify-content設置或檢索彈性盒子元素在主軸(橫軸)方向上的對齊方式:

  • flex-start,起點對齊;

  • flex-end,終點對齊,順序不變;

  • center,中間對齊;

  • space-around,環繞(自動平分空白區域);

  • space-between,兩端對齊(中間空白區域自動平分)。

  • flex:多個子項目在主軸的縮放比例,不指定flex屬性,則不參與伸縮分配;

  • align-items設置或檢索彈性盒子元素在側軸(豎軸)方向上的對齊方式:

  • flex-start,起點對齊;

  • flex-end,終點對齊;

  • center,居中對齊;

  • stretch,拉伸。

  • flex-wrap控制是否換行;

案例
  • 微信底部;
  • 攜程;

多列布局

  • 類似報紙或雜志中的排版方式,上要用以控制大篇幅文本。
/* 分幾列*/
-webkit-column-count:3;
/* 分割線*/
-webkit-column-rule:1px dashed red;
/*設置列間距*/
-webkit-column-gap:60px;
/* 列寬度*/
-webkit-column-width: 400px;
  • 如果給標題設置跨列等屬性:
-webkit-column-span:all;
text-align:center;
  • 了解即可,實際意義不大。
案例
  • 新聞

Web字體

  • 開發人員可以為自已的網頁指定特殊的字體,無需考慮用戶電腦上是否安裝了此特殊字體,從此把特殊字體處理成圖片的時代便成為了過去。支持程度比較好,甚至IE低版本瀏覽器也能支持。

字體格式(認識字體)

  • 不同瀏覽器所支持的字體格式是不一樣的,我們有必要了解一下有關字體格式的知識。

  • TureType(.ttf)格式:

  • .ttf字體是Windows和Mac的最常見的字體,是一種RAW格式,支持這種字體的瀏覽器有IE9+、Firefox3.5+、Chrome4+、Safari3+、Opera10+、iOS Mobile、Safari4.2+;

  • OpenType(.otf)格式

  • .otf字體被認為是一種原始的字體格式,其內置在TureType的基礎上,支持這種字體的瀏覽器有Firefox3.5+、Chrome4.0+、Safari3.1+、Opera10.0+、iOS Mobile、Safari4.2+;

  • Web Open Font Format(.woff)格式

  • .woff字體是Web字體中最佳格式,他是一個開放的TrueType/OpenType的壓縮版本,同時也支持元數據包的分離,支持這種字體的瀏覽器有IE9+、Firefox3.5+、Chrome6+、Safari3.6+、Opera11.1+;

  • Embedded Open Type(.eot)格式

  • .eot字體是IE專用字體,可以從TrueType創建此格式字體,支持這種字體的瀏覽器有IE4+;

  • SVG(.svg)格式

  • .svg字體是基于SVG字體渲染的一種格式,支持這種字體的瀏覽器有Chrome4+、Safari3.1+、Opera10.0+、iOS Mobile Safari3.2+;

  • 了解了上面的知識后,我們就需要為不同的瀏覽器準備不同格式的字體,通常我們會通過字體生成工具幫我們生成各種格式的字體,因此無需過于在意字體格式間的區別差異。

  • 下載字體網站:推薦http://www.zhaozi.cn/http://www.youziku.com/ 查找更多中文字體。

  • 如果要在網頁中使用web字體(用戶電腦上沒有這種字體),具體使用步驟:

  • 導入對應的字體包;

  • 聲明字體:告訴瀏覽器,去哪里找這個字體;

  • 定義一個類,誰用這個類名,就會使用相應的字體。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>web字體使用</title>

    <style>
        /*聲明字體*/
        @font-face {font-family: 'webfont';
            src: url('font/webfont.eot'); /* IE9*/
            src: url('font/webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
            url('font/webfont.woff') format('woff'), /* chrome、firefox */
            url('font/webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
            url('font/webfont.svg#webfont') format('svg'); /* iOS 4.1- */
        }

        /*定義對應的字體類*/
        .webfont{
            font-family:"webfont" !important;
            font-size:16px;font-style:normal;
            -webkit-font-smoothing: antialiased;
            -webkit-text-stroke-width: 0.2px;
            -moz-osx-font-smoothing: grayscale;}

    </style>
</head>
<body>

    <p class="webfont">尋尋覓覓,在無聲無息中消失。。。</p>
    <p>尋尋覓覓,在無聲無息中消失。。。</p>
</body>
</html>

字體圖標

  • 其實我們可以把文字理解成是一種特殊形狀的圖片,反之我們是不是也可以把圖片制作成字體呢?

  • 答案是肯定的。

  • 常見的是把網頁常用的一些小的圖標,借助工具幫我們生成一個字體包,然后就可以像使用文字一樣使用圖標了。

  • 優點:

  • 將所有圖標打包成字體庫,減少請求;

  • 具有矢量性,可保證清晰度;

  • 使用靈活,便于維護;

  • Font Awesome 使用介紹:http://fontawesome.dashgame.com/

  • 定制自已的字體圖標庫:http://iconfont.cn/https://icomoon.io/

  • SVG素材:http://www.iconsvg.com/

  • 使用:

  • 首先在阿里文字圖片里面找到需要的圖片,然后加載到本地,引入到項目中;

  • 聲明圖標文字;

  • 定義一個類;

  • 在需要的地方使用這個類,要配合對應的圖片編碼(圖片編碼在demo中)使用。

  • 需要什么圖標查找對應的編碼即可:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>web字體使用</title>

    <style>
        /*聲明字體*/
        @font-face {font-family: 'iconfont';
            src: url('iconfont/iconfont.eot'); /* IE9*/
            src: url('iconfont/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
            url('iconfont/iconfont.woff') format('woff'), /* chrome、firefox */
            url('iconfont/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
            url('iconfont/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
        }

        /*定義對應的字體類*/
        .iconfont{
            font-family:"iconfont" !important;
            font-size:16px;font-style:normal;
            -webkit-font-smoothing: antialiased;
            -webkit-text-stroke-width: 0.2px;
            -moz-osx-font-smoothing: grayscale;
        }

        span::before{
            content: "\e628";
            font-family: iconfont;
            color: red;
        }
    </style>
</head>
<body>
    <span>掃碼取件</span>
    <p class="iconfont">&#xe628;</p>
</body>
</html>

兼容性

  • 通過http://caniuse.com/ 可查詢CSS3各特性的支持程度,一般兼容性處理的常見方法是為屬性添加私有前綴,如不能解決,應避免使用,無需刻意去處理CSS3的兼容性問題。

  • 我們需要知道每個屬性,能被哪個版本的瀏覽器支持。

高級應用

360 案例:

  • 監聽滾輪
document.onmousewheel=function(){}
  • 需要處理兼容(我們是靠監聽滾輪的事件來處理的);

  • 我們需要使用到插件,(滾屏插件) 基于jQuery 的一個插件jQuery fullPage,全屏滾動插件,中文網址:http://www.dowebok.com; 相關說明:http://www.dowebok.com/77.html

  • 對應的顏色

sectionsColor:['#0da5d6', '#2AB561', '#DE8910', '#16BA9D', '#0DA5D6']
  • loopTop:true,滾到頂部,回到最后一屏;

  • js代碼:

$(function(){
    $('#dowebok').fullpage({
        sectionsColor:['#0da5d6', '#2AB561', '#DE8910', '#16BA9D', '#0DA5D6'],
        loopTop:true,
        afterLoad:function( anchorLink ,index){
            console.log(index);

            $('.section').removeClass('current');
            setTimeout(function(){
                $('.section').eq(index-1).addClass('current');
            },100);
        }
    });
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,780評論 1 92
  • 1、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,652評論 0 7
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 1,787評論 0 2
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    love2013閱讀 2,326評論 0 11
  • 這座城里有一所房子, 在朝陽的愛撫下, 它的大門永遠敞開, 那里,光明的使命已經完成。 在籬邊,在花園, 鮮花已經...
    姓尹者不遇閱讀 160評論 0 2