前端(八)—— 高級布局:文檔流、浮動布局、流式布局、定位布局、flex布局、響應布局


高級布局:文檔流、浮動布局、流式布局、定位布局、flex布局、響應布局

一、文檔流

1、什么是文檔流

將窗體自上而下分成一行一行,塊級元素從上至下、行內元素在每行中從左至右的順序依次排放元素

2、本質

文檔流本質是 nomal flow (普通流、常規流)

3、BFC(Block Formatting Contxt)

塊級格式化上下文,它是一個獨立的渲染區域,只有Block-level box參與,它規定了內部的Block-level Box如何布局,並且與這個區域外部毫不相干

4、BFC的規則

  •  內部的Box會在垂直方向,一個接一個地放置;
  •  Box自身垂直方向的位置由margin-top決定,屬於同一個BFC的兩個相鄰Box的margin會發生重疊(取最大值);
  •  Box自身水平方向的位置由margin左或右決定(具體已經參照BFC方位),屬於同一個BFC的兩個相鄰Box的margin會發生疊加。

 

二、浮動布局

float: left | right

1、目的

float的目的是讓block同行顯示(在父級規定的寬度內、不完全脫離文檔流)

2、文檔流、完全脫離文檔流、不完全脫離文檔流

1、文檔流:子標簽在父級標簽沒有設置高度時,會自動撐開父級

2、完全脫離文檔流:子標簽不再為父級撐開高度,子標簽高於文檔流,不占用盒子模型的空間,有一個z-index

3、不完全脫離文檔流:這是浮動后的結果,不清浮動,不會撐開父級高度,清浮動后,會重新撐開父級高度

3、清浮動

(1)原因

在子級中使用浮動布局,若是父級有兄弟標簽,會出現布局問題

(2)解決方法

原理:在浮動布局情況下,讓父級獲得合適的高度

/*方法1. 浮動的父級設置高度*/ super { height: npx;
}

/*方法2. 浮動的父級設置overflow*/ super { overflow: hidden;
}

/*方法3. 浮動的父級兄弟設置clear,一般利用both同時清左右兩邊的浮動*/ brother { clear: left | right | both;
}

/*方法4. 浮動的父級偽類清浮動,一般利用both同時清左右兩邊的浮動*/ super:after { content: ""; display: block; clear: left | right | both;
}

 

三、流式布局

1、目的

讓布局脫離固定值限制,可以根據頁面情況改變相應發生改變

<style type="text/css"> .wrap { max-width: 1200px; min-width: 800px; width: 90%; height: 600px; margin: 0 auto; background-color: orange;
    }
</style>
<div class="wrap"></div>

2、常用操作

  •  百分比設置 %    參考最近父級
  •  窗口比設置 vw | vh
  •  字體控制 em | rem  ,em最近設置字體大小的父級規定的字體大小,rem為html字體大小
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>流式布局</title>
    <style type="text/css">
        html, body {
            width: 100%;
            margin: 0;
        }
        .box {
            /*百分比流式*/
            /*參考最近父級*/
            width: 90%;
            /*max-width: 1000px;*/
            /*min-width: 600px;*/

            /*窗口比*/
            /*width: 90vw;*/
            /*max-width: 1000px;*/
            /*min-width: 600px;*/

            height: 300px;
            background-color: orange;
            margin: 0 auto;
        }
        .b {
            width: 100px;
            height: 100px;
            background-color: red;
            border-radius: 50%;
            float: left;
        }
        
        
        body {
            font-size: 30px;
        }
        /*.sup {
            font-size: 20px;
        }*/
        .txt {
            /*1em = 16px*/
            /*font-size: 16px;*/
            /*font-size: 0.4em;*/
            /*總結:em為最近設置字體大小的父級規定的字體大小*/
            font-size: 1rem;
            /*總結:rem為html字體大小*/
        }
        html {
            font-size: 50px;
        }
    </style>
</head>
<body>
    <!-- 流式布局: -->
    <!-- 目的:讓布局脫離固定值限制,可以根據頁面情況改變相應發生改變 -->
    <div class="box">
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
         <div class="b"></div>
     </div> 

     <div class="sup">
         <div class="txt">文本</div>
     </div>
</body>
</html>
流式布局案例

 

四、定位布局

1、目的

讓目標(要被布局的)標簽在指定參考系下任意布局

2、語法

<!-- 基本語法: -->
<!-- 1.通過position設置定位是否開啟 -->
<!-- static:靜態,未定位(默認值) -->
<!-- relative: 相對定位, 未脫離文檔流 -->
<!-- absolute: 絕對定位, 完全脫離文檔流 -->
<!-- fixed: 固定定位, 完全脫離文檔流 -->
<!-- 2.定位開啟后,四個定位方位便會開啟,且四個方位均參與布局 -->
<!-- 如果發生沖突,左右取左,上下取上 -->

position: static | relative | absolute | fixed
布局方位:left | right | top | bottom

 

3、相對定位(relative)

未脫離文檔流,相對布局方位只改變盒子顯示區域,不改變盒子原有位置,

簡單的說相當於靈魂出竅,在原有位置仍然占一塊區域,margin-top改變會影響兄弟盒子

相對定位主要用於給父級定位,從而輔助子級的絕對定位

(1)開啟定位

position relative;

(2)方位布局,方位改變上盒子不會影響下盒子(靈魂出竅),四個方位如果發生沖突,左右取左,上下取上

left:30px;
top:30px;

(3)參考系

相對定位參考系為自身原有位置

(4)案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>相對定位</title>
    <style type="text/css">
        div {
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .b2 {
            background-color: orange;
        }

        /*不做定位操作*/
        /*b1,b2均在文檔流中,b1的布局會影響到b2*/
        /*.b1 {
            margin-top: 30px;
            margin-bottom: 30px;
        }*/

        /*固定定位后*/
        .b1 {
            /*1.未脫離文檔流*/
            /*BFC規則下margin布局,上盒子依舊會影響下盒子*/
            /*margin-top: 30px;
            margin-bottom: 30px;*/

            /*開啟定位*/
            position: relative;
            /*具有定位方位*/
            /*2.方位布局下,上盒子不會影響下盒子*/
            left: 30px;
            top: 30px;
            /*總結:方位布局只改變盒子顯示區域,不改變盒子原有位置*/

            /*margin-top: 30px;*/
            /*3.參考系:相對定位參考系為自身原有位置*/
            /*right: 30px;*/

            /*總結:方位布局就是 顯示區域上|下|左|右距離自身原始位置上|下|左|右的間隔*/

            /*4.left=-right top=-bottom,同時存在,左右取左,上下取上*/
            /*left: -30px;
            right: -100px;*/
        }
    </style>
</head>
<body>
    <div class="b1"></div>
    <div class="b2"></div>
</body>
</html>
相對布局案例

 

4、絕對定位(absolute)

完全脫離文檔流,有一個z-index可以控制兩個絕對定位的優先級,不在文檔流中占位,也永遠不會撐開父級高度,永遠不會影響兄弟布局,顯示層高於文檔流層

margin依舊可以影響自身布局,但不會影響兄弟布局,margin改變兄弟標簽布局不會改變

(1)開啟定位

position:absolute;

(2)定位布局

left:30px;
top:30px;

(3)參考系

最近的已定位的父級,sup(未定位) -> body(未定位) -> html(文檔窗口)

(4)案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>絕對定位</title>
    <style type="text/css">
        div {
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .b2 {
            background-color: orange;
        }
        .b1 {
            /*1.完全脫離文檔流*/
            position: absolute;
            /*總結:不在文檔流中占位,也永遠不會撐開父級高度,永遠不會影響兄弟布局,顯示層高於文檔流層*/
            /*打開定位方位*/
            /*margin-left: 100px;
            margin-top: 100px;*/
            /*總結:margin依舊可以影響自身布局,但不會影響父級即兄弟布局*/

            /*2.參考系:?*/
            left: 100px;
            right: -100px;

            /*3.同時存在,左右取左,上下取上*/
        }


    </style>
    <style type="text/css">
        .sup {
            width: 500px;
            height: 500px;
            background-color: orange;
        }
        .sub {
            width: 200px;
            height: 200px;
            background-color: red;
        }

        .sup {
            /*采用了盒模型布局*/
            margin: 0 auto;
            /*需求:sub應該參考sup,sup需要定位:相對|絕對|固定*/
            /*相對定位好處:父級不會脫離文檔流,滿足所有的盒模型布局*/
            /*position: relative;*/
            /*絕對定位好處:如果自身已經采用絕對定位布局了,那么子級一定參考自身進行定位*/
            position: absolute;
            margin: 100px 100px;
            /*注:如果父級只是輔助子級進行絕對定位,那么一定優選相對定位,因為絕對定位會產生新的BFC,導致盒模型布局會受影響*/
            /*注:margi-top|left依舊起作用,只是sup已經脫離文檔流,不會獲得到body寬度,所以auto沒有參考值*/
        }
        .sub {
            /*2.參考坐標系為最近的定位父級*/
            position: absolute;
            left: 0;
            right: 0;
            top: 0;
            /*父級: sup(未定位) -> body(未定位) -> html(文檔窗口)*/

            /*3.同時存在,左右取左,上下取上*/
        }
    </style>
</head>
<body>
    <!-- <div class="b1"></div>
    <div class="b2"></div> -->
    <div class="sup">
        <div class="sub"></div>
    </div>
</body>
</html>
絕對定位案例

 

5、固定定位(fixed)

完全脫離文檔流,有一個z-index可以控制兩個絕對定位的優先級不在文檔流中占位,也永遠不會撐開父級高度,永遠不會影響兄弟布局,顯示層高於文檔流層

margin依舊可以影響自身布局,但不會影響兄弟布局,margin改變兄弟標簽布局不會改變

(1)開啟定位

position:fixed;

(2)定位布局

left:30px;
top:30px;

(3)參考系

頁面窗口

(4)案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>固定定位</title>
    <style type="text/css">
        .sup {
            width: 500px;
            height: 500px;
            background-color: orange;
            margin: 0 auto;
        }
        .sub {
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .sup {
            position: relative;
            position: absolute;
        }
        .sub {
            position: fixed;
            left: 0;
            /*top: 0;*/
            bottom: 0;
        }
    </style>
</head>
<body>
    <!-- 固定定位 -->
    <!-- 1.完全脫離文檔流 -->
    <!-- 2.參考系為文檔窗口 -->
    <!-- 3.左右取左,上下取上 -->
    <div class="sup">
        <div class="sub"></div>
    </div>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>

</body>
</html>
固定定位案例

 

五、flex布局

1、目的

Flex是Flexible Box的縮寫,意為”彈性布局”,用來為盒狀模型提供最大的靈活性。設為Flex布局以后,子元素的float、clear和vertical-align屬性將失效。

flex可以很好的解決垂直居中問題

2、名詞概念

  • 采用Flex布局的元素,稱為Flex容器(flex container),簡稱”容器”。它的所有子元素自動成為容器成員,稱為Flex項目(flex item),簡稱”項目”。

  • 水平為軸(main axis),主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end。

  • 垂直為交叉軸(cross axis),交叉軸的開始位置叫做cross start,結束位置叫做cross end。

  • 項目默認沿主軸排列。單個項目占據的主軸空間叫做main size,占據的交叉軸空間叫做cross size。

3、容器屬性

1. flex-direction 屬性 決定主軸的方向(即項目的排列方向)
flex-direction: row | row-reverse | column | column-reverse;
     row(默認值):主軸為水平方向,起點在左端。
     row-reverse:主軸為水平方向,起點在右端。
     column:主軸為垂直方向,起點在上沿。
     column-reverse:主軸為垂直方向,起點在下沿。

2. flex-wrap 屬性 定義,如果一條軸線排不下,如何換行。
flex-wrap: nowrap | wrap | wrap-reverse;
     nowrap(默認):不換行。
     wrap:換行,第一行在上方。
     wrap-reverse:換行,第一行在下方。

3. flex-flow 屬性 是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap。
flex-flow: <flex-direction> <flex-wrap>;

4. justify-content 屬性 定義了項目在主軸上的對齊方式。
justify-content: flex-start | flex-end | center | space-between | space-around;

5. align-items 屬性 定義項目在交叉軸上如何對齊。
align-items: flex-start | flex-end | center | baseline | stretch;

6. align-content 屬性 定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。
align-content: flex-start | flex-end | center | space-between | space-around | stretch;

4、項目屬性

1. order 屬性 定義項目的排列順序。數值越小,排列越靠前,默認為0。 order: <integer>; 2. flex-grow 屬性 定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。 flex-grow: <number>; /* default 0 */ 3. flex-shrink 屬性 定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。 flex-shrink: <number>; /* default 1 */ 4. flex-basis 屬性 定義了在分配多余空間之前,項目占據的主軸空間(main size)。 flex-basis: <length> | auto; /* default auto */ 5. flex 屬性 是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值為0 1 auto。后兩個屬性可選。 flex: <flex-grow> <flex-shrink> <flex-basis> 6. align-self 屬性 允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch。 align-self: auto | flex-start | flex-end | center | baseline | stretch;

5、主要了解

1.將父級display屬性設置為flex,則父級成為container,子級成為item
2.container設置item的排列方向flex-direction
3.item對於container的空間占比flex-grow

6、案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>flex布局</title>
    <style type="text/css">
        .container {
            width: 600px;
            height: 600px;
            border: 1px solid black;
            margin: 0 auto;
        }
        .item {
            /*width: 200px;*/
            /*height: 200px;*/
            /*border-radius: 50%;*/
            background-color: orange;
            font-size: 80px;
        }
        /*容器:規定容器為flex,則容器內的標簽會成為該容器的項目(item)*/
        .container {
            display: flex;
        }
        .item {
            /*默認只能一行排列,所有item總寬不允許超出container寬度*/
            /*width: 300px;*/
            /*默認情況下item可以不規定高度,高度會自適應父級*/
            /*item沒有設置寬度下,可以通過flex-grow決定對於父級的占比*/
        }
        /*.it1, .it3 {
            flex-grow: 1;
        }
        .it2 {
            flex-grow: 3;
            background-color: pink
        }*/
        /*container屬性*/
        .container {
            /*flex-direction: row | row-reverse | column | column-reverse; 方向*/
            /*flex-direction: column-reverse;*/

            /*flex-wrap: nowrap | wrap | wrap-reverse;換行方式*/
            /*flex-wrap: wrap;*/

            /*justify-content: flex-start | flex-end | center | space-between | space-around;水平對齊方式*/
            /*item為沾滿父級區域*/
            justify-content: space-around;
        }
        /*item屬性*/
        .item {
            /*width: 300px;
            height: 200px;*/
        }

        .item {
            width: 100px;
        }
    </style>
    <!-- 總結 -->
    <!-- 1.將父級display屬性設置為flex,則父級成為container,子級成為item -->
    <!-- 2.container設置item的排列方向flex-direction -->
    <!-- 3.item對於container的空間占比flex-grow -->
</head>
<body>
    <div class="container">
        <div class="item it1">1</div>
        <div class="item it2">2</div>
        <div class="item it3">3</div>
    </div>
</body>
</html>
flex布局案例

 

六、響應式布局

當響應式布局中樣式塊起作用時,會與正常樣式塊設置協同布局,遵循選擇器的優先級規則

1、目的

設置在不同頁面寬度下的布局,滿足當前屏幕尺寸時,該樣式塊起作用,不滿足時,則樣式塊失效

2、語法

/*當頁面尺寸小於<integer>寬度時的樣式*/
@media only screen and (max-width: <integer>) {
    selector {
        
    }
}


/*當頁面尺寸大於<integer1>寬度,小於<integer2>寬度時的樣式*/
@media only screen and (min-width: <integer1>) and (max-width: <integer2>) {
    selector {
        
    }
}


/*當頁面尺寸大於於<integer3>寬度時的樣式*/
@media only screen and (min-width: <integer>) {
    selector {
        
    }
}

3、原則

(1)采用響應式布局的頁面,基本樣式塊只做共性樣式設置,需要根據頁面尺寸進行適應變化的樣式均有響應式布局處理
(2)要進行響應式布局的頁面要處理所有屏幕尺寸下的樣式塊

4、案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>響應式布局</title>
    <style type="text/css">
        /*基本樣式塊*/
        /*.box {
            max-width: 1200px;
            width: 95%;
            margin: 0 auto;
            background-color: red!important;
        }
        .it {
            width: 300px;
            height: 300px;
            font: 900 50px/300px 'STSong';
            text-align: center;
            float: left;
            border-radius: 50%;
            background-color: orange;
        }
        .box:after {
            content: "";
            display: block;
            clear: both;
        }*/
        
        html, body {
            margin: 0;
        }
        .it {
            height: 300px;
            background-color: orange;
            font: 900 50px/300px 'STSong';
            text-align: center;
            border-radius: 50%;
            float: left;
        }
        .box:after {
            content: "";
            display: block;
            clear: both;
        }
        /*屏幕寬度超出1200px*/
        @media only screen and (min-width: 1200px) {
            
            .box {
                background-color: pink;
            }
            .it {
                width: 25%;
            }

            
        }
        /*屏幕寬度間於600至1200px*/
        @media only screen and (min-width: 600px) and (max-width: 1200px) {
            .box {
                background-color: brown;
            }
            .it {
                width: 30%;
                margin: 0 calc(10% / 6);
            }

        }
        /*屏幕寬度小於600px*/
        @media only screen and (max-width: 600px) {
            .box {
                background-color: cyan;
            }
            .it {
                width: 80%;
                margin-left: 10%;
                min-width: 300px;
            }
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="it">1</div>
        <div class="it">2</div>
        <div class="it">3</div>
        <div class="it">4</div>
        <div class="it">5</div>
        <div class="it">6</div>
        <div class="it">7</div>
        <div class="it">8</div>
        <div class="it">9</div>
        <div class="it">10</div>
        <div class="it">11</div>
        <div class="it">12</div>
    </div>
</body>
</html>
響應式布局案例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM