天天看點

05-移動web之流式布局

一、視口

1.常見螢幕知識

裝置 解釋 描述
螢幕的寬度 - (機關:英寸) 螢幕的寬度
螢幕的高度 -(機關:英寸) 螢幕的高度
對角線 螢幕的對角線的長度 英寸 一般說手機尺寸 是指以螢幕對角線為衡量 機關是 英寸
邏輯分辨率 螢幕的寬度 * 螢幕的高度 (機關:px) 描述螢幕的寬度和高度
裝置分辨率 實體像素點 螢幕裡面一共擁有的實體像素點的個數
PPI 像素密度 每英寸所擁有的實體像素點
裝置像素比 裝置分辨率和邏輯分辨率的比例(取寬度比較) 可以簡單了解為螢幕的清晰度的倍數

裝置分辨率就是手機中的發光點,數值越大,越清晰。

2.二倍圖

一倍圖:當裝置像素比為1:1時,使用1個裝置像素顯示1個CSS像素。

二倍圖:當裝置像素比為2:1時,使用4個裝置像素顯示1個CSS像素。

一張相同的圖檔放在裝置像素比為1的手機上和裝置像素比為2的手機上時,像素比為2的手機會出現失真現象。

在裝置像素比為2的手機上,原來的一個實體像素點能顯示的圖像卻變成了 由4個實體像素點來顯示,那麼就會造成 就近取色的效果,出現失真現象。

在标準的viewport設定中,使用倍圖來提高圖檔品質,解決在高清裝置中的模糊問題,就是統一将圖檔放大到2倍,使用時縮小2倍使用。

3.視口

視口(viewport)就是浏覽器顯示頁面内容的螢幕區域。 視口可以分為布局視口、視覺視口和理想視口。

視口就是一個包裹着html的容器,由喬布斯發明,預設寬度980px。

3.1 布局視口

在布局視口下,html标簽的寬度變成了 980px 而不是 和 螢幕等寬。

是所有手機端自帶的預設視口,預設視口分辨率為 980px,把一個980px寬的頁面放入到320px的小螢幕上,是以網頁元素元素都非常小。

3.2 标準理想視口(開發用)

<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no">
           
屬性名 取值 描述
width 正整數或device-width 定義視口的寬度,機關為像素
height 正整數或device-height 定義視口的高度,機關為像素,一般不用
initial-scale [0.0-10.0] 定義初始縮放值
minimum-scale [0.0-10.0] 定義縮小最小比例,它必須小于或等于maximum-scale設定
maximum-scale [0.0-10.0] 定義放大最大比例,它必須大于或等于minimum-scale設定
user-scalable yes/no 定義是否允許使用者手動縮放頁面,預設值yes

視口參數設定:

  • meta标簽用來描述或設定一個HTML網頁文檔的屬性
  • content 要設定或者描述的内容
  • content 要設定或者描述的内容
  • width 設定視口的寬度 device-width等于螢幕的寬度
  • initial-scale 頁面打開的時候視口放大的倍數 值:1
  • user-scalable 是否允許使用者縮放頁面 值:no
  • maximum-scale 如果允許放大的話 最大放大多少倍 值 :1
  • minimum-scale 如果允許放大的話 最小放大多少倍 值 :1

二、流式布局(百分比布局)

為了讓頁面中的元素能跟随螢幕的大小變換而變化,會使用百分比的形式來設定寬度或者高度
           

1.幾個經典布局

1.左側固定,右側自适應(padding)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            height: 50px;
            background-color: #f34;
        }

        .left {
            /* 1.左側盒子固定,寫死寬高 */
             70px;
            height: 50px;
            /* 2.左浮動 */
            float: left;
            background-color: #095;
        }

        .right {
            /* 3.不寫寬度,給右側盒子加paddign-left,将内容擠過去 */
            padding-left: 70px;
        }

        .right .info {
            /* 4.在裡面套一個盒子,使padding生效 */
            height: 50px;
            background-color: #06c;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="left"></div>
        <div class="right">
            <div class="info"></div>
        </div>
    </div>
</body>

</html>
           

2.左側固定,右側自适應(margin)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            height: 50px;
            background-color: #f34;
        }

        .left {
            /* 1.左側盒子固定,寫死寬高 */
             70px;
            height: 50px;
            /* 2.左浮動 */
            float: left;
            background-color: #095;
        }

        .right {
            height: 50px;
            /* 3.右側标準流,直接用margin擠過去 */
            margin-left: 70px;
            background-color: #06c;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>

</html>
           

3.左側固定,右側自适應(overflow)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            height: 50px;
            background-color: #f34;
        }

        .left {
            /* 1.左側盒子固定,寫死寬高 */
             70px;
            height: 50px;
            /* 2.左浮動 */
            float: left;
            background-color: #095;
        }

        .right {
            height: 50px;
            /* 3.右側标準流,由于浮動的元素壓不住overflow:hidden*/
            overflow: hidden;
            background-color: #06c;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>

</html>
           

4.右側固定,左側自适應(overflow)

其他兩個寫法與左側固定,右側自适應同理,隻需在body中将右側寫在前面即可

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            height: 50px;
            background-color: #f34;
        }

        .right {
            /* 1.右側盒子固定,寫死寬高 */
             70px;
            height: 50px;
            /* 2.右浮動 */
            float: right;
            background-color: #095;
        }

        .left {
            height: 50px;
            /* 3.左側标準流,由于浮動的元素壓不住overflow:hidden*/
            overflow: hidden;
            /* 用margin也可以實作 */
            /* margin-right: 70px; */
            background-color: #06c;
        }
    </style>
</head>

<body>
    <div class="box">
        <!-- 由于代碼從上往下執行,是以要将固定區域寫在前面, -->
        <!-- 如果自适應的區域寫在前面,由于沒寫寬,會将一行沾滿,浮動的固定區域隻會另起一行 -->
        <div class="right"></div>
        <div class="left"></div>
    </div>
</body>

</html>
           

5.左右固定,中間自适應

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            height: 50px;
            background-color: #f34;
        }

        .left {
            height: 50px;
            float: left;
             70px;
            background-color: #09f;
        }

        .right {
            height: 50px;
            float: right;
             50px;
            background-color: #90f;
        }

        /* 左右寬高寫死,左浮右浮動 */
        .center {
            height: 50px;
            /* 1.用margin擠開左右距離 */
            /* margin: 0 50px 0 70px; */
            /* 2.用overflow */
            overflow: hidden;
            background-color: #06c;
        }
    </style>
</head>

<body>
    <div class="box">
        <!-- 同理,這裡自适應的區域要寫在後面 -->
        <div class="left"></div>
        <div class="right"></div>
        <div class="center"></div>
    </div>
</body>

</html>
           

6.左右固定,中間自适應(聖杯布局)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            text-align: center;
            line-height: 50px;
        }

        header,
        footer {
            height: 50px;
            background-color: #ccc;
        }

        footer {
            clear: both;
        }

        .box {
            /* 1.用預留出左右盒子的位置 */
            padding: 0 50px 0 80px;
        }

        .box .center,
        .box .left,
        .box .right {
            /* 2.三個盒子都左浮 */
            float: left;
            height: 50px;
        }

        .box .center {
            /* 3.自适應區域寬度100% */
             100%;
            background-color: #90f;
        }

        .box .left {
             80px;
            background-color: #09f;
            /* 4.往回走一個父盒子寬度,就是往上移一行 */
            margin-left: -100%;
            position: relative;
            /* 5.利用相對定位,往回走自身的寬度 */
            left: -80px;
        }

        .box .right {
             50px;
            background-color: #f34;
            /* 6.向上移動自身的寬度 */
            margin-left: -50px;
            /* 7.向右移動自身的寬度 */
            position: relative;
            right: -50px;
        }
    </style>
</head>

<body>
    <header>header</header>
    <div class="box">
        <div class="center">center</div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>
    <footer>footer</footer>
</body>

</html>
           

7.左右固定,中間自适應(雙飛翼布局)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            text-align: center;
            line-height: 50px;
        }

        header,
        footer {
            height: 50px;
            background-color: #ccc;
        }

        footer {
            clear: both;
        }

        .content {
            /* 1.預留出左右位置 */
            margin: 0 50px;
        }

        .box .center,
        .box .left,
        .box .right {
            /* 2.三個盒子都左浮 */
            float: left;
            height: 50px;
        }

        .box .center {
            /* 3.自适應盒子寬100% */
             100%;
            background-color: #095;
        }

        .box .left {
             50px;
            background-color: #09f;
            /* 4.左邊盒子上移一行 */
            margin-left: -100%;
        }

        .box .right {
             50px;
            background-color: #90f;
            /* 5.右邊盒子也上去 */
            margin-left: -50px;
        }
    </style>
</head>

<body>
    <header>header</header>
    <div class="box">
        <div class="center">
            <div class="content">center</div>
        </div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>
    <footer>footer</footer>
</body>

</html>
           

2.京東案例

https://www.lanzous.com/ib5pw7a