走在深夜的小碼農 Seventh Day

Css3 Seventh Day

writer:late at night code peasanthtml

 學習大綱:

1. 定位(position) 介紹

1.1 爲何使用定位

咱們先來看一個效果,同時思考一下用標準流或浮動可否實現相似的效果算法

場景1: 某個元素能夠自由的在一個盒子內移動位置,而且壓住其餘盒子.瀏覽器

 

場景2:當咱們滾動窗口的時候,盒子是固定屏幕某個位置的。佈局

 

 

結論:要實現以上效果,標準流 或 浮動都沒法快速實現學習

因此:網站

1.浮動可讓多個塊級盒子一行沒有縫隙排列顯示, 常常用於橫向排列盒子。ui

2.定位則是可讓盒子自由的在某個盒子內移動位置或者固定屏幕中某個位置,而且能夠壓住其餘盒子。atom

 

1.2 定位組成

定位:將盒子在某一個位置,因此定位也是在擺放盒子, 按照定位的方式移動盒子url

定位也是用來佈局的,它有兩部分組成:spa

定位 = 定位模式 + 邊偏移

定位模式 用於指定一個元素在文檔中的定位方式。邊偏移則決定了該元素的最終位置。

 

1.2.1 邊偏移(方位名詞)

邊偏移 就是定位的盒子移動到最終位置。有 top、bottom、left 和 right 4 個屬性。

邊偏移屬性 示例 描述
top top: 80px 頂端偏移量,定義元素相對於其父元素上邊線的距離
bottom bottom: 80px 底部偏移量,定義元素相對於其父元素下邊線的距離
left left: 80px 左側偏移量,定義元素相對於其父元素左邊線的距離
right right: 80px 右側偏移量,定義元素相對於其父元素右邊線的距離

定位的盒子有了邊偏移纔有價值。 通常狀況下,凡有定位地方一定有邊偏移。

1.2.2 定位模式 (position)

在 CSS 中,經過 position 屬性定義元素的定位模式,語法以下:

選擇器 { 
   position: 屬性值;
}

定位模式是有不一樣分類的,在不一樣狀況下,咱們用到不一樣的定位模式。

定位模式決定元素的定位方式 ,它經過 CSS 的 position 屬性來設置,其值能夠分爲四個:

語義
static 靜態定位
relative 相對定位
absolute 絕對定位
fixed 固定定位

 

1.3 定位模式介紹

1.3.1. 靜態定位(static) - 瞭解

  • 靜態定位是元素的默認定位方式,無定位的意思。它至關於 border 裏面的none,靜態定位static,不要定位的時候用。

  • 語法:


    選擇器 {
      position: static;
    }
  • 靜態定位 按照標準流特性擺放位置,它沒有邊偏移。

  • 靜態定位在佈局時咱們幾乎不用的

1.3.2. 相對定位(relative) - 重要

  • 相對定位是元素在移動位置的時候,是相對於它本身原來的位置來講的(自戀型)。

  • 語法:


選擇器 {
position: relative;
}
  • 相對定位的特色:(務必記住)

    • 1.它是相對於本身原來的位置來移動的(移動位置的時候參照點是本身原來的位置)。

    • 2.原來在標準流的位置繼續佔有,後面的盒子仍然以標準流的方式對待它。

      所以,相對定位並無脫標。它最典型的應用是給絕對定位當爹的。。。

  • 效果圖:

1.3.3. 絕對定位(absolute) - 重要

1.3.3.1 絕對定位的介紹
  • 絕對定位是元素在移動位置的時候,是相對於它祖先元素來講的(拼爹型)。

  • 語法:


    選擇器 {
    position: absolute;
    }

 

  1. 徹底脫標 —— 徹底不佔位置;

  2. 父元素沒有定位,則以瀏覽器爲準定位(Document 文檔)。

     

  3. 父元素要有定位

    • 元素將依據最近的已經定位(絕對、固定或相對定位)的父元素(祖先)進行定位。

 

 

 

  • 絕對定位的特色總結:(務必記住)

    1.若是沒有祖先元素或者祖先元素沒有定位,則以瀏覽器爲基準定位(Document 文檔)。

    2.若是祖先元素有定位(相對、絕對、固定定位),則以最近一級的有定位祖先元素爲參考點移動位置。

    3.絕對定位再也不佔有原先的位置。因此絕對定位是脫離標準流的。(脫標)

 

1.3.3.2 定位口訣 —— 子絕父相

弄清楚這個口訣,就明白了絕對定位和相對定位的使用場景。

這個「子絕父相」過重要了,是咱們學習定位的口訣,是定位中最經常使用的一種方式這句話的意思是:子級是絕對定位的話,父級要用相對定位。

 

由於絕對定位的盒子是拼爹的,因此要和父級搭配一塊兒來使用。

①子級絕對定位,不會佔有位置,能夠放到父盒子裏面的任何一個地方,不會影響其餘的兄弟盒子。

②父盒子須要加定位限制子盒子在父盒子內顯示。

③父盒子佈局時,須要佔有位置,所以父親只能是相對定位。

 

這就是子絕父相的由來,因此相對定位常常用來做爲絕對定位的父級

總結: 由於父級須要佔有位置,所以是相對定位, 子盒子不須要佔有位置,則是絕對定位

固然,子絕父相不是永遠不變的,若是父元素不須要佔有位置,子絕父絕也會遇到。

 

 

疑問:爲何在佈局時,子級元素使用絕對定位時,父級元素就要用相對定位呢?

觀察下圖,思考一下在佈局時,左右兩個方向的箭頭圖片以及父級盒子的定位方式。

分析

  1. 方向箭頭疊加在其餘圖片上方,應該使用絕對定位,由於絕對定位徹底脫標,徹底不佔位置。

  2. 父級盒子應該使用相對定位,由於相對定位不脫標,後續盒子仍然以標準流的方式對待它。

    • 若是父級盒子也使用絕對定位,會徹底脫標,那麼下方的廣告盒子會上移,這顯然不是咱們想要的。

結論父級要佔有位置,子級要任意擺放,這就是子絕父相的由來。

 

1.3.4. 固定定位(fixed) - 重要

  • 固定定位是元素固定於瀏覽器可視區的位置。(認死理型) 主要使用場景: 能夠在瀏覽器頁面滾動時元素的位置不會改變。

  • 語法:


    選擇器 {
    position: fixed;
    }
  • 固定定位的特色:(務必記住):

    1.以瀏覽器的可視窗口爲參照點移動元素。

    • 跟父元素沒有任何關係

    • 不隨滾動條滾動。

    2.固定定位不在佔有原先的位置

  • 固定定位也是脫標的,其實固定定位也能夠看作是一種特殊的絕對定位。(認死理型)

    • 徹底脫標—— 徹底不佔位置;

    • 只認瀏覽器的可視窗口 —— 瀏覽器可視窗口 + 邊偏移屬性 來設置元素的位置;

      • 跟父元素沒有任何關係;單獨使用的

      • 不隨滾動條滾動。

固定定位舉例:

 

提示:IE 6 等低版本瀏覽器不支持固定定位。

 

1.3.5 粘性定位(sticky) - 瞭解

  • 粘性定位能夠被認爲是相對定位和固定定位的混合。 Sticky 粘性的

  • 語法:


    選擇器 {
        position: sticky;
        top: 10px;
    }
  • 粘性定位的特色:

    1.以瀏覽器的可視窗口爲參照點移動元素(固定定位特色)

    2.粘性定位佔有原先的位置(相對定位特色)

    3.必須添加 top 、left、right、bottom 其中一個纔有效

    跟頁面滾動搭配使用。 兼容性較差,IE 不支持。

1.3.6 定位總結

定位模式 是否脫標 移動位置 是否經常使用
static 靜態定位 不能使用邊偏移 不多
relative 相對定位 否 (佔有位置) 相對於自身位置移動 基本單獨使用
absolute絕對定位 是(不佔有位置) 帶有定位的父級 要和定位父級元素搭配使用
fixed 固定定位 是(不佔有位置) 瀏覽器可視區 單獨使用,不須要父級
sticky 粘性定位 否 (佔有位置) 瀏覽器可視區 當前階段少
  • 必定記住 相對定位、固定定位、絕對定位 兩個大的特色: 1. 是否佔有位置(脫標否) 2. 以誰爲基準點移動位置。

  • 學習定位重點學會子絕父相。

  • 注意:

  1. 邊偏移須要和定位模式聯合使用,單獨使用無效

  2. topbottom 不要同時使用;

  3. leftright 不要同時使用。

2. 綜合案例:學成在線-hot 模塊添加

2. 1 案例截圖

2.2 案例分析

  1. 一個大的 li 中包含 一個課程圖片,課程介紹文字信息,還有hot的小圖標;

  2. hot圖片重疊在課程圖片上面—— 脫標,不佔位置,須要使用絕對定位

  3. hot圖片重疊li的右上方 —— 須要使用邊偏移肯定準確位置。

2.3 案例小結

  1. 子絕父相 —— 子元素使用絕對定位父元素使用相對定位

  2. 與浮動的對比

    • 絕對定位:脫標,利用邊偏移指定準確位置

    • 浮動:脫標,不能指定準確位置,讓多個塊級元素在一行顯示

課堂練習:模擬老師的隨堂案例完成哈根達斯案例(5 分鐘)。

結構修改:

<!-- 修改.box-bd裏面的li標籤內容,添加一個hot圖標 -->

<li>
<!-- 添加hot小圖片 -->
   <em>
       <img src="images/hot.png" alt="">
   </em>
   <img src="images/pic.png" alt="">
   <h4>
      Think PHP 5.0 博客系統實戰項目演練
   </h4>
   <div class="info">
       <span>高級</span> • 1125人在學習
   </div>
</li>

樣式修改:


.box-bd ul li {
   /* 子絕父相 */
   /* 父元素相對定位 */
   position: relative;
   float: left;
   width: 228px;
   height: 270px;
   background-color: #fff;
   margin-right: 15px;
   margin-bottom: 15px;
 
}
.box-bd ul li > img {
   width: 100%;
}
.box-bd ul li h4 {
   margin: 20px 20px 20px 25px;
   font-size: 14px;
   color: #050505;
   font-weight: 400;
}
.box-bd ul li em {
    /* 子元素絕對定位 */
   position: absolute;
   top: 4px;
   right: -4px;
}

 

3. 定位(position)的應用

3.1. 固定定位小技巧: 固定在版心左側位置。

小算法:

1.讓固定定位的盒子 left: 50%. 走到瀏覽器可視區(也能夠看作版心) 的一半位置。

2.讓固定定位的盒子 margin-left: 版心寬度的一半距離。 多走 版心寬度的一半位置

就可讓固定定位的盒子貼着版心右側對齊了。

案例效果:


<style>
       .w {
           width: 800px;
           height: 1400px;
           background-color: pink;
           margin: 0 auto;
      }
       .fixed {
           position: fixed;
           /* 1. 走瀏覽器寬度的一半 */
           left: 50%;
           /* 2. 利用margin 走版心盒子寬度的一半距離 */
           margin-left: 405px;
           width: 50px;
           height: 150px;
           background-color: skyblue;
      }
   </style>
</head>
<body>
   <div class="fixed"></div>
   <div class="w">版心盒子 800像素</div>
 
</body>

 

3.2. 堆疊順序(z-index)

  • 在使用定位佈局時,可能會出現盒子重疊的狀況。此時,可使用 z-index 來控制盒子的先後次序 (z軸)

  • 語法:


    選擇器 {
    z-index: 1;
    }
  • z-index 的特性以下:

    1. 屬性值正整數負整數0,默認值是 0,數值越大,盒子越靠上;

    2. 若是屬性值相同,則按照書寫順序,後來居上

    3. 數字後面不能加單位

    注意z-index 只能應用於相對定位絕對定位固定定位的元素,其餘標準流浮動靜態定位無效。

  • 應用 z-index 層疊等級屬性能夠調整盒子的堆疊順序。以下圖所示:

 

案例演示:堆疊順序。

 

 

4. 定位(position)的拓展

4.1 絕對定位的盒子居中

注意:加了絕對定位/固定定位的盒子不能經過設置 margin: auto 設置水平居中

可是能夠經過如下計算方法實現水平和垂直居中,能夠按照下圖的方法:

  1. left: 50%;:讓盒子的左側移動到父級元素的水平中心位置

  2. margin-left: -100px;:讓盒子向左移動自身寬度的一半

 

盒子居中定位示意圖

4.2 定位特殊特性

絕對定位和固定定位也和浮動相似。

1.行內元素添加絕對或者固定定位,能夠直接設置高度和寬度。

2.塊級元素添加絕對或者固定定位,若是不給寬度或者高度,默認大小是內容的大小。

 

前面咱們講過, display 是 顯示模式, 能夠改變顯示模式有如下方式:

  • 能夠用inline-block 轉換爲行內塊

  • 能夠用浮動 float 默認轉換爲行內塊(相似,並不徹底同樣,由於浮動是脫標的)

  • 絕對定位和固定定位也和浮動相似, 默認轉換的特性 轉換爲行內塊。

因此說, 一個行內的盒子,若是加了浮動固定定位絕對定位,不用轉換,就能夠給這個盒子直接設置寬度和高度等。

4.3 脫標的盒子不會觸發外邊距塌陷

浮動元素、絕對定位(固定定位)元素的都不會觸發外邊距合併的問題。 (咱們之前是用padding border overflow解決的)

也就是說,咱們給盒子改成了浮動或者定位,就不會有垂直外邊距合併的問題了。

 

4.4 絕對定位(固定定位)會徹底壓住盒子

浮動元素不一樣,只會壓住它下面標準流的盒子,可是不會壓住下面標準流盒子裏面的文字(圖片)

可是絕對定位(固定定位) 會壓住下面標準流全部的內容。

浮動之因此不會壓住文字,由於浮動產生的目的最初是爲了作文字環繞效果的。 文字會圍繞浮動元素

5. 綜合案例 - 淘寶輪播圖(重點)

5.1 效果圖

5.2 佈局分析

 

5.3 步驟

  1. 大盒子咱們類名爲: tb-promo 淘寶廣告

  2. 裏面先放一張圖片。

  3. 左右兩個按鈕 用連接就行了。 左箭頭 prev 右箭頭 next

    ​ 左按鈕樣式(border-radius:左上,右上,右下,左下),

    ​ 右按鈕定位,提取左右按鈕共同的樣式代碼(並集選擇器)

  4. 底側小圓點ul 繼續作。 類名爲 promo-nav

    ​ 中間長方形橢圓 ul的定位(水平居中,離底部15px)

    ​ 長方形須要五個小圓點,ul無序列表,li浮動,橢圓中小圓點的樣式

5.4 知識點:圓角矩形設置4個角

圓角矩形能夠爲4個角分別設置圓度, 可是是有順序的


border-top-left-radius:20px;
border-top-right-radius:20px;
border-bottom-right-radius:20px;
border-bottom-left-radius:20px;
  • 若是4個角,數值相同


    border-radius: 15px;
  • 裏面數值不一樣,咱們也能夠按照簡寫的形式,具體格式以下:


border-radius: 左上角 右上角 右下角 左下角;

仍是遵循的順時針。

 

5.5 代碼參考


<!DOCTYPE html>
<html lang="en">

<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>淘寶輪播圖作法</title>
   <style>
      * {
           margin: 0;
           padding: 0;
      }
       li {
           list-style: none;
      }

       .tb-promo {
           position: relative;
           width: 520px;
           height: 280px;
           background-color: pink;
           margin: 100px auto;
      }

       .tb-promo img {
           width: 520px;
           height: 280px;
      }

       /* 並集選擇器能夠集體聲明相同的樣式 */
       .prev,
       .next {
           position: absolute;
           /* 絕對定位的盒子垂直居中 */
           top: 50%;
           margin-top: -15px;
           /* 加了絕對定位的盒子能夠直接設置高度和寬度 */
           width: 20px;
           height: 30px;
           background: rgba(0, 0, 0, .3);
           text-align: center;
           line-height: 30px;
           color: #fff;
           text-decoration: none;
      }

       .prev {
           left: 0;
           /* border-radius: 15px; */
           border-top-right-radius: 15px;
           border-bottom-right-radius: 15px;
      }

       .next {
           /* 若是一個盒子既有left屬性也有right屬性,則默認會執行 left屬性 同理 top bottom 會執行 top */
           right: 0;
           /* border-radius: 15px; */
           border-top-left-radius: 15px;
           border-bottom-left-radius: 15px;
      }
       .promo-nav {
           position: absolute;
           bottom: 15px;
           left: 50%;
           margin-left: -35px;
           width: 70px;
           height: 13px;
           /* */
           background: rgba(255,255,255, .3);
           border-radius: 7px;
      }
       .promo-nav li {
           float: left;
           width: 8px;
           height: 8px;
           background-color: #fff;
           border-radius: 50%;
           margin: 3px;
      }
       /* 不要忘記選擇器權重的問題 */
      .promo-nav .selected {
           background-color: #ff5000;
      }
   </style>
</head>

<body>
   <div class="tb-promo">
       <img src="images/tb.jpg" alt="">
       <!-- 左側按鈕箭頭 -->
       <a href="#" class="prev"> &lt; </a>
       <!-- 右側按鈕箭頭 -->
       <a href="#" class="next"> &gt; </a>
       <!-- 小圓點 -->
       <ul class="promo-nav">
           <li class="selected"></li>
           <li></li>
           <li></li>
           <li></li>
           <li></li>
       </ul>
   </div>
</body>

</html>

 

6. 網頁佈局總結

經過盒子模型,清楚知道大部分html標籤是一個盒子。

經過CSS浮動、定位 可讓每一個盒子排列成爲網頁。

一個完整的網頁,是標準流、浮動、定位一塊兒完成佈局的,每一個都有本身的專門用法。

6.1. 標準流

可讓盒子上下排列或者左右排列,垂直的塊級盒子顯示就用標準流佈局

6.2. 浮動

可讓多個塊級元素一行顯示或者左右對齊盒子,多個塊級盒子水平顯示就用浮動佈局

6.3. 定位

定位最大的特色是有層疊的概念,就是可讓多個盒子先後疊壓來顯示。若是元素自由在某個盒子內移動就用定位佈局。

 

 

7. 元素的顯示與隱藏

  • 目的(本質)

    ​ 讓一個元素在頁面中消失或者顯示出來

  • 場景

    ​ 相似網站廣告,當咱們點擊關閉就不見了,可是咱們從新刷新頁面,會從新出現!

7.1. display 顯示(重點)

  • display 設置或檢索對象是否及如何顯示。


    display: none 隱藏對象

    display:block 除了轉換爲塊級元素以外,同時還有顯示元素的意思。
  • 特色: display 隱藏元素後,再也不佔有原來的位置。

  • 後面應用及其普遍,搭配 JS 能夠作不少的網頁特效。實際開發場景:

    配合後面js作特效,好比下拉菜單,原先沒有,鼠標通過,顯示下拉菜單, 應用極爲普遍

7.2. visibility 可見性 (瞭解)

  • visibility 屬性用於指定一個元素應可見仍是隱藏。


    visibility:visible ;  元素可視

    visibility:hidden;   元素隱藏
  • 特色:visibility 隱藏元素後,繼續佔有原來的位置。(停職留薪)

  • 若是隱藏元素想要原來位置, 就用 visibility:hidden

  • 若是隱藏元素不想要原來位置, 就用 display:none (用處更多 重點)

7.3. overflow 溢出(重點)

  • overflow 屬性指定了若是內容溢出一個元素的框(超過其指定高度及寬度) 時,會發生什麼。

屬性值 描述
visible 不剪切內容也不添加滾動條
hidden 不顯示超過對象尺寸的內容,超出的部分隱藏掉
scroll 無論超出內容否,老是顯示滾動條
auto 超出自動顯示滾動條,不超出不顯示滾動條
  • 通常狀況下,咱們都不想讓溢出的內容顯示出來,由於溢出的部分會影響佈局。

  • 可是若是有定位的盒子, 請慎用overflow:hidden 由於它會隱藏多餘的部分。

  • 實際開發場景:

  1. 清除浮動

  2. 隱藏超出內容,隱藏掉, 不容許內容超過父盒子。

7.4. 顯示與隱藏總結

屬性 區別 用途
display 顯示 (重點) 隱藏對象,不保留位置 配合後面js作特效,好比下拉菜單,原先沒有,鼠標通過,顯示下拉菜單, 應用極爲普遍
visibility 可見性 (瞭解) 隱藏對象,保留位置 使用較少
overflow 溢出(重點) 只是隱藏超出大小的部分 1. 能夠清除浮動 2. 保證盒子裏面的內容不會超出該盒子範圍

 

8 綜合案例:土豆網鼠標通過顯示遮罩

8.1. 效果圖

8.2. 案例目標

1.練習元素的顯示與隱藏

2.練習元素的定位

8.3. 核心原理

原先半透明的黑色遮罩看不見, 鼠標通過 大盒子,就顯示出來。

遮罩的盒子不佔有位置, 就須要用絕對定位 和 display 配合使用。

8.4. 代碼參考


<!DOCTYPE html>
<html lang="en">

<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>仿土豆網顯示隱藏遮罩案例</title>
   <style>
       .tudou {
           position: relative;
           width: 444px;
           height: 320px;
           background-color: pink;
           margin: 30px auto;
      }

       .tudou img {
           width: 100%;
           height: 100%;
      }

       .mask {
           /* 隱藏遮罩層 */
           display: none;
           position: absolute;
           top: 0;
           left: 0;
           width: 100%;
           height: 100%;
           background: rgba(0, 0, 0, .4) url(images/arr.png) no-repeat center;
      }

       /* 當咱們鼠標通過了 土豆這個盒子,就讓裏面遮罩層顯示出來 */
       .tudou:hover .mask {
           /* 而是顯示元素 */
           display: block;
      }
   </style>
</head>

<body>
   <div class="tudou">
       <div class="mask"></div>
       <img src="images/tudou.jpg" alt="">
   </div>
   <div class="tudou">
       <div class="mask"></div>
       <img src="images/tudou.jpg" alt="">
   </div>
   <div class="tudou">
       <div class="mask"></div>
       <img src="images/tudou.jpg" alt="">
   </div>
   <div class="tudou">
       <div class="mask"></div>
       <img src="images/tudou.jpg" alt="">
   </div>
</body>

</html>
相關文章
相關標籤/搜索