前端開發基礎(四)——HTML5 / CSS3 進階

目錄

一.HTML5(取代 HTML4 + XHTML)

二.CSS3選擇器

三.2D 轉換(transform)

四.動畫(animation)

五.3D 轉換


一.HTML5(取代 HTML4 + XHTML)

  • 廣義上的 HTML5:擁有強大的技術集,這些技術是指: HTML5CSS3 、javascript 

1.語義化標籤

  • 新增語義化標籤:
  • 語義化標籤:針對搜索引擎,可多次使用,移動端支持比較友好
  • 在“IE9”瀏覽器中,需要把語義化標籤轉換成 塊級元素 
        header,
        nav,
        section {
            <!-- IE9 中,語義標籤需要轉換成 塊級元素 -->
            display: block;
            ...
        }
<body>
    <!-- 可以書寫多個語義標籤 -->
    <header> header </header>
    <header> header </header>
    ...
</body>

2.音/視頻標籤

  • audio 音頻標籤:
  • 不同瀏覽器 支持 不同格式,所以要準備多個音頻文件,會按照資源給的順序 播放音頻
  • 一般 .ogg .mp3 可以支持絕大部分瀏覽器
  • chrome 禁用了 autoplay 屬性,除非靜音播放,muted 屬性(靜音播放)
  • controls:顯示播放按鈕等控件
  • loop:循環播放
  • poster:未播放時展示的海報 
  <audio src="media/snow.mp3" controls autoplay></audio>
  <audio controls>
    <source src="media/snow.mp3" type="audio/mpeg" />
    <source src="media/snow.ogg" type="audio/ogg" />
            您的瀏覽器不支持播放聲音( 此文字在上述兩種音頻均不可用時出現 )
  </audio>
  • video 視頻標籤:
  <!-- <video src="media/video.mp4" controls="controls"></video> -->
  <video controls="controls" autoplay muted loop poster="media/pig.jpg">
    <source src="media/video.mp4" type="video/mp4">
    <source src="media/video.ogg" type="video/ogg">
  </video>

3.input 標籤

  • type="email" :限制用戶輸入必須爲Email類型
  • type="url" :限制用戶輸入必須爲URL類型
  • type="date / time" :限制用戶輸入必須爲日期 / 時間類型
  • type="number" :限制用戶輸入必須爲數字類型
  • type="tel" :限制用戶輸入必須爲手機號碼
  • type="search" :搜索框 會出現 x 方便一次刪除輸入內容
  • type="color" :生成一個顏色選擇表單

4.表單屬性

  • required :內容不能爲空
  • placeholder :提示文本,存在默認值將不顯示
  • autofocus :自動聚焦
  • autocomplete :"off / on" 瀏覽器會提示歷史輸入,爲了隱私一般設置爲off
  • multiple :多選文件提交,file默認選一個文件
用戶名: <input type="text" required="required" placeholder="請輸入用戶名" autofocus="autofocus" name="username" autocomplete="off"> 
<input type="submit" value="提交"> 上傳頭像: 
<input type="file" name="" id="" multiple="multiple">

 

二.CSS3選擇器

  • CSS3現狀:瀏覽器支持度差,需要添加 私有前綴,移動端優於PC端

1.屬性選擇器 [ ]

  • 類選擇器、屬性選擇器、權重爲 10
        /* 選擇的是:  既是button 又有 disabled 這個屬性的元素 */
        button[disabled] {} /* 1.直接寫屬性 */ 
        input[type="search"] {} /* 2. 屬性等於值 */         
        div[class^="icon"] {} /* 3. 以某個值開頭的 屬性值 */  
        div[class$="icon"] {} /* 4. 以某個值結尾的 */
        div[class*="icon"] {} /* 5. 可以在任意位置的 */ 
<body>
    <button disabled="disabled">按鈕</button>
    <div class="icon1">圖標1</div>
    <div class="iicon3">圖標4</div>
    <div class="absicon">圖標5</div>
</body>

2.結構僞類選擇器 :

  • 類選擇器、屬性選擇器、權重爲 10
    <style>
        ul li:first-child {}    /* 父元素中第一個子元素 */
        ul li:last-child {}    /* 父元素中最後一個子元素 */
        ul li:nth-child(8) {}     /* 父元素中第n個子元素 */
        /* n 可是關鍵詞  even 是偶數 odd 是奇數 */
        /* n 可是公式  2n 是偶數 2n+1 是奇數 5n 是5的倍數 */
        ul li:nth-child(even/2n) {}
        ul li:nth-child(-n+5) {} /* -n + 5 就是選擇前面5個  */

        /* div span:nth-child(1) {選不到span 會選擇出p 因爲p是div的第一個子元素} */
/* 總結: :nth-child(n)  選擇父元素裏面的 第n個孩子, 它不管裏面的孩子 是span還是p */
        /*選擇 span 的方法 */
        div span:first-of-type {}
        div span:last-of-type {}   
        div span:nth-of-type(2) {}
    </style>
<body>
    <div>
        <p>我是一個p標籤</p>
        <span>我是span標籤</span>
        <span>我是span標籤</span>
    </div>

    <!-- ul 裏面我們只允許放li  所以 nth-child = nth-of-type -->
    <ul>
        <li>1</li>
        ...
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>
</body>
  • 區分 nth-child 和 nth-of-type
  1. nth-child 選擇父元素裏面的第幾個子元素,子元素可能不是同種類型,如span p同等看待
  2. nth-of-type 選擇指定類型的元素

3.僞元素選擇器 ::

  • 僞類選擇器,權重爲 1
        div::before {  
            content: "我"; /* before 和 after 必須有 content 屬性,可以爲空 */
            /* before 和 after 創建的是一個行內元素,要轉換類型設置寬高 */
            display: inline-block;
            width: 100px;
            ...}
        div::after {
            content: "小豬佩奇";
            ...}
<body>
    <div>是</div>
</body>
  • 僞類選擇器注意事項:
  1. before 和 after 必須有 content 屬性
  2. before 在內容前面,after 在內容後面
  3. before 和 after 創建的是一個行內元素,要轉換爲行內塊元素設置寬高
  4. 創建出來的元素在 DOM 中查找不到,所以稱爲僞元素
  5. 僞元素權重爲 1
  • 應用:僞元素字體圖標:
        @font-face {
            font-family: 'icomoon';
            src: url('fonts/icomoon.eot?cv013x');
            ...}       
         p::after {
            content: '\ea50'; /* 字體圖標代碼,可自行查看 */
            position: absolute;
            top: 10px;
            right: 10px;
            font-family: 'icomoon';  /* 務必務必務必不要忘記字體圖標需要引用自定義字體! */
        }
<body>
    <p></p>
</body>

 

三.2D 轉換(transform)

1.定義

  • 2D 轉換:改變標籤在二維平面上的位置和形狀,元素如下:
  1. 移動: translate
  2. 旋轉: rotate
  3. 縮放: scale

2.translate 語法(移動)

  • 2D 移動指:水平X、垂直Y方向上的移動,類似 定位
  • transform: translate(x, y); :transform: translate(100px, 100px);
  • transform:translate:(50%,50%);:%是相對於 本身 的寬高計算的
  • 只移動x座標:
  1. transform: translate(100px, 0);
  2. transform: translateX(100px);
  • translate 對 行內元素 是無效的,比如給 <span>設置,不會生效
  • 拓展:讓盒子實現水平垂直居中,使用 translate 就不需要計算了
  • translate(-50%, -50%) :盒子往上往左走,自己高度的一半

3.rotate 語法(旋轉)

  • rotate() 裏面跟度數,單位是 deg
  • 角度爲時,時針,角度爲時,時針
  • 默認旋轉的中心點是:元素中心點
  • CSS書寫三角形並旋轉:
        div {
            position: relative;
            ...}    
        div::after {/* 僞類選擇器相當於 添加行內元素 absolute自動使之變成塊元素 */
            content: "";
            position: absolute;
            top: 8px;
            right: 15px;
            width: 10px;
            height: 10px;
            border-right: 1px solid #000;  /* 只讓右邊和底邊顯示 構造一個直角 */
            border-bottom: 1px solid #000;
            transform: rotate(45deg); /* 順時針旋轉直角45° 使之看起來向下 */
            transition: all 0.2s; /* 過渡寫到本身上,誰做動畫給誰加 */
        }
        /* 鼠標經過div  裏面的三角旋轉 */
        div:hover::after {
            transform: rotate(225deg);  /* 使直角向上旋轉 注意旋轉角度225 = 45 + 180 */
        }
<body>
    <div></div>
</body>
  • 設置旋轉中心點:transform-origin:x y
  • 注意:x 和 y 用 空格 隔開
  1. x y 默認旋轉的中心點是元素的中心 (50% 50%),等價於 center center
  2. 可以給 x y 設置像素:transform-origin: 50px 50px;
  3. 可以給 x y 設置方位名詞:transform-origin: left bottom; 

4.scale 語法(縮放)

  • 注意:x 與 y使用 逗號 進行分隔
  • transform: scale(2): 只寫一個參數,第二個參數就和第一個參數一致,寬高都放大兩倍
  • transform:scale(0.5, 1): 寬縮小一倍,高保持不變
  • scale 最大的優勢:可以設置轉換中心點縮放,默認以中心點縮放,而且不影響其他盒子
  • 分頁按鈕實例:
        li {
            float: left;width: 30px;height: 30px;
            border: 1px solid pink;margin: 10px;
            text-align: center;line-height: 30px;list-style: none;
            border-radius: 50%; cursor: pointer;
            transition: all .4s; }
        li:hover {
            transform: scale(1.2);}
<body>
    <ul>
        <li>1</li>
        ...
        <li>7</li>
    </ul>
</body>

5.2D 轉換綜合寫法

  • 同時使用多個轉換,其格式爲 transform: translate() rotate() scale()
  • transform: translate(150px, 50px) rotate(180deg) scale(1.2);
  • 順序會影響到轉換的效果(先旋轉會改變座標軸方向),位移放到最前面

四.動畫(animation)

1.動畫使用步驟

  • 定義動畫:@keyframes...
  • 調用定義好的動畫
        /* 1. 定義動畫 */
        @keyframes move {
            0% {transform: translateX(0px);            /* 開始狀態 */}
            100% {
                transform: translateX(1000px);         /* 結束狀態 */}
        }
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
        /* 2. 調用動畫 */
            animation-name: move;            /* 動畫名稱 */
            animation-duration: 2s;          /* 持續時間 */  
        }

2.動畫序列 

  • 0% 是動畫的開始,100% 是動畫的完成。這樣的規則就是動畫序列
  • from to 等價於  0% 和  100%
        /* @keyframes move {
            from { transform: translate(0, 0);}
            to { transform: translate(1000px, 0);} } */
        @keyframes move {
            0% {transform: translate(0, 0);}
            25% {transform: translate(1000px, 0);}
            50% {transform: translate(1000px, 500px);}
            75% {transform: translate(0, 500px);}
            100% {transform: translate(0, 0);}}
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
            animation-name: move;
            animation-duration: 10s;
        }

3.動畫常見屬性

  • @keyframes :規定動畫,關鍵幀
  • animation :所有動畫屬性的簡寫屬性,除了 animation-play-state 屬性
  • animation-name(必寫):規定 @keyframes 動畫的名稱
  • animation-duration(必寫) :規定動畫完成一個週期所花費的秒或毫秒,默認是0
  • animation-timing-function :規定動畫的速度曲線,默認是“ease”先快後慢再快   “linear”勻速
  • animation-delay:規定動畫何時開始,默認是0
  • animation-iteration-count :規定動畫重複播放的次數,默認是1,還有 infinite"無限循環"
  • animation-direction :規定動畫是否在下一週期逆向播放,默認是 “normal“, alternate"逆播放”
  • animation-play-state :規定動畫是否播放或暫停,默認是 "running", 還有 "pause",鼠標經過暫停
  • animation-fill-mode :規定動畫結束後狀態,保持現狀 forwards 回到起始 backwards

4.動畫簡寫

  • animation: 動畫名稱 持續時間 運動曲線 何時開始 播放次數 是否反方向 起始與結束狀態
  • animation: name duration timing-function delay iteration-count direction fill-mode
  • 簡寫屬性裏面不包含 animation-paly-state
  • 暫停動畫 animation-paly-state: paused; 經常和鼠標經過等其他配合使用
  • 要想動畫走回來,而不是直接調回來:animation-direction: alternate
  • 盒子動畫結束後,停在結束位置:animation-fill-mode: forwards
  • 動畫實例之大數據熱點圖:

5.速度曲線 steps()

  • 模仿打印機打字效果用到 steps():分幾步來完成動畫
        div {
            font-size: 20px;
            width: 0;
            height: 30px;
            white-space: nowrap; /* 讓文字強制一行內顯示*/
            overflow: hidden;
            /* steps 就是分幾步來完成動畫 有了steps 就不寫 ease / linear */
            animation: w 4s steps(10) forwards停留在打印完的樣子;
        }
        @keyframes w {
            0% { width: 0;}
            100% { width: 200px;} /* 總共10個字,每個字像素20px,10*20=200 模仿打印 */
        }
<body>
    <div>世紀佳緣我在這裏等你</div>
</body>

​6.奔跑的熊

  • 結論:元素可以添加多個動畫, 用逗號分隔
       div {
            position: absolute;
            width: 200px;
            height: 100px;
            background: url(media/bear.png) no-repeat;
            /* 元素可以添加多個動畫, 用逗號分隔 */
            animation: bear .4s steps(8) infinite, move 3s forwards;
        }
        @keyframes bear {/* 這個動畫是實現熊的跑步動作 通過讓背景圖左移實現 */
            0% {background-position: 0 0; }
            100% {/* 熊的背景圖片是向左走的 所以是負值 左上負 右下正 */
                background-position: -1600px 0; }}
        @keyframes move {/* 這個動畫是實現熊的位移 */
            0% { left: 0; } /* 左移自身的 50% 實現居中效果 */
            transform: translateX(-50%);}}
<body>
    <div></div>
</body>

五.3D 轉換

1.三維座標系

  • x 軸:水平向右 -- 注意:x 軸右邊是正值,左邊是負值
  • y 軸:垂直向下 -- 注意:y 軸下面是正值,上面是負值
  • z 軸:垂直屏幕 -- 注意:往外邊的是正值,往裏面的是負值

2.3D 轉換元素

  1. 3D 位移:translate3d(x, y, z)
  2. 3D 旋轉:rotate3d(x, y, z)
  3. 透視:perspctive
  4. 3D呈現:transfrom-style

3.3D 位移 translate3d()

  • 3D 位移:在 2D 移動的基礎上多加了 z 軸移動方向
  • transform: translateX(100px):僅在 x 軸上移動
  • transform: translateZ(100px):僅僅是在 z 軸上移動,此處只能跟 px單位
  • transform: translate3d(x, y, z)x, y, z 對應的值不能省略,可用 0 進行填充
  • 因爲z軸是垂直屏幕,由裏指向外面,所以默認 看不到 元素在z軸的方向上移動,除非設置透視

4.透視 perspective

  • 想要網頁產生 3D 效果需要 透視,單位:像素
  • 透視也稱視距,即人的眼睛到屏幕的距離
  • 視距越小成像越大,越大成像越小
  • 注意:透視 需要寫在 被視察元素 父盒子 上面
        body {
            perspective: 200px; /* 透視寫到被觀察元素的父盒子上面 */ }
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            transform: translate3d(100px, 100px, 0); /* xyz是不能省略的,沒有就寫0 */
        }
  • translateZ 與 perspecitve 的區別:perspecitve 給 父級 進行設置,translateZ 給 子元素 進行設置
  • translateZ(100px):僅僅是在Z軸上移動,看不到變化;有了透視,就能看到translateZ 引起的變化

5.3D 旋轉 rotate3d()

  • 左手準則:左手的手拇指指向 x 軸的正方向,其餘手指的彎曲方向就是該元素沿着 x 軸旋轉的方向
  • transform: rotateX(45deg):沿着 x軸正方向旋轉 45 度  
  • transform: rotateY(45deg):沿着 y軸正方向旋轉 45 度 
  • 兩面翻轉盒子實例:
  1. 用大盒子 box 包裹住子盒子 front + back,給 body 設置透視
  2. 大盒子 box 在鼠標經過時會繞着 y軸旋轉180°
  3. 子盒子 back 本身需要旋轉180° 和 front 實現背靠背的效果
  4. 爲保證子盒子本身旋轉實現,要給父盒子添加 transform-style 屬性來保留子盒子立體空間
  • transform: rotate3d(x, y, z, deg):沿着自定義軸旋轉, deg 爲角度
  • x, y, z 表示旋轉軸的矢量,表示是否沿着該軸進行旋轉,最後一個標識旋轉的角度
  • transform: rotate3d(1, 1, 0, 45deg) -- 沿着對角線旋轉 45deg 
  • transform: rotate3d(1, 0, 0, 45deg) -- 沿着 x 軸旋轉 45deg

6.3D 呈現 transform-style(重要)

  • transform-style: preserve-3d 子元素開啓立體空間默認的值是 flat 不開啓
  • 代碼寫給 父級,但是影響的是 子盒子
    <style>
        body {
            perspective: 500px;     /* 透視效果 */  }
        .box {
            position: relative;
            ...
            transition: all 2s;
            /* 讓子元素保持3d立體空間環境 */
            transform-style: preserve-3d;   /* 若不設置 紫色盒子就無法繞着 x軸旋轉60° */
        }        
        .box:hover {
            transform: rotateY(60deg);     /* 父親盒子繞着 y軸轉60° */}        
        .box div {
            position: absolute;
            ...
            background-color: pink; }        
        .box div:last-child {  
            background-color: purple;   /* 紫色盒子繞着x軸轉60° */
            transform: rotateX(60deg);
        }
    </style>
</head>
<body>
    <div class="box">
        <div></div>
        <div></div>
    </div>
</body>

7.3D 導航欄

  1. 用父盒子 ul-li 包裹住 子盒子box ,box 再包住 front 和 bottom
  2. 給 li 設置透視,box 設置 transf-style 來保持 front 和 bottom 的立體空間, 動畫效果(鼠標經過 box 沿着x軸轉9.°)
  3. front 盒子 設置  z-index: 1保持永遠在上,transform: translateZ(17.5px); 保證旋轉中心在屏幕裏面17.5px處
  4. bottom 盒子設置transform: translateY(17.5px) rotateX(-90deg); 保證頂部對齊front 且面朝下 先移動 再旋轉
        ul li {
            /* 需要給box 旋轉 也需要透視 乾脆給li加 裏面的子盒子都有透視效果 */
            perspective: 500px;}
        .box {
            position: relative;
            transform-style: preserve-3d;
            ...
            transition: all .4s;
        }        
        .box:hover {
            transform: rotateX(90deg); }        
        .front,
        .bottom {
            position: absolute;
            ...}        
        .front {
            background-color: pink;
            z-index: 1;
            transform: translateZ(17.5px);
        }        
        .bottom {
            background-color: purple;
            /* x軸一定是負值 */
            /* 如果有移動 或者其他樣式,必須先寫我們的移動 */
            transform: translateY(17.5px) rotateX(-90deg);
        }
        <ul>
        <li>
            <div class="box">
                <div class="front">第五人格</div>
                <div class="bottom">茶茶子等你</div>
            </div>
        </li>
        ...

8.3D 旋轉木馬

  • 搭建HTML結構:
  • <section>       
  • <div></div>...<div></div>         
  • </section>
  • 裏面的6個div 分別是 6個狗狗圖片 ,注意最終旋轉是 section標籤 旋轉
  • CSS樣式:
  • ① 給body添加 透視效果 perspective: 1000px;
  • ② 給section 添加 大小,一定不要忘記添加 3d呈現效果 控制裏面的6個div
  • 注意:別忘記子絕父相,section要加相對定位
  • ③ 裏面6個div 全部絕對定位疊到一起,然後旋轉不同角度 和 移動距離
  • 注意:旋轉角度用rotateY 距離 用translateZ
  • ④ 給section 添加動畫 animation ,讓它可以自動旋轉即可
  • 源碼展示:
    <style>
        body {
            perspective: 1000px;}       
        section {
            position: relative;
            width: 300px;
            height: 200px;
            margin: 150px auto;
            transform-style: preserve-3d;    /*保持子盒子div 3D立體空間*/
            /* 添加動畫效果 */
            animation: rotate 10s linear infinite;
        }   
        section:hover {
            animation-play-state: paused;    /* 鼠標放入section 停止動畫 */
        }        
        @keyframes rotate {
            0% {
                transform: rotateY(0);
            }
            100% {
                transform: rotateY(360deg);
            } }        

        section div {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: url(media/dog.jpg) no-repeat;
        }        
        section div:nth-child(1) {
            /* 先旋轉好了再 移動距離 */
            transform: rotateY(0) translateZ(300px);
        }  
        section div:nth-child(2) {
            /* 先旋轉好了再 移動距離 */
            transform: rotateY(60deg) translateZ(300px);
        }
        ...
        section div:nth-child(6) {
            /* 先旋轉好了再 移動距離 */
            transform: rotateY(300deg) translateZ(300px);
        }
    </style>
</head>

<body>
    <section>
        <div></div>
        <!-- 6個div盒子 -->
    </section>
</body>

9.瀏覽器私有前綴

  • 瀏覽器私有前綴是 兼容老版本 的寫法,比較新版本的瀏覽器無須添加
  • -moz-:代表 firefox 瀏覽器私有屬性
  • -ms-:代表 ie 瀏覽器私有屬性
  • -webkit-:代表 safari、chrome 私有屬性
  • -o-:代表 Opera 私有屬性
  • 提倡寫法:
-moz-border-radius: 10px; 
-webkit-border-radius: 10px; 
-o-border-radius: 10px; 
border-radius: 10px;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章