05-移动web之流式布局

一、视口

1.常见屏幕知识

1584085824507.png

设备 解释 描述
屏幕的宽度 - (单位:英寸) 屏幕的宽度
屏幕的高度 -(单位:英寸) 屏幕的高度
对角线 屏幕的对角线的长度 英寸 一般说手机尺寸 是指以屏幕对角线为衡量 单位是 英寸
逻辑分辨率 屏幕的宽度 * 屏幕的高度 (单位:px) 描述屏幕的宽度和高度
设备分辨率 物理像素点 屏幕里面一共拥有的物理像素点的个数
PPI 像素密度 每英寸所拥有的物理像素点
设备像素比 设备分辨率和逻辑分辨率的比例(取宽度比较) 可以简单理解为屏幕的清晰度的倍数
设备分辨率就是手机中的发光点,数值越大,越清晰。

2.二倍图

一倍图:当设备像素比为1:1时,使用1个设备像素显示1个CSS像素。
二倍图:当设备像素比为2:1时,使用4个设备像素显示1个CSS像素。

一张相同的图片放在设备像素比为1的手机上和设备像素比为2的手机上时,像素比为2的手机会出现失真现象。

1584086195224.png

在设备像素比为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.左侧盒子固定,写死宽高 */
            width: 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.左侧盒子固定,写死宽高 */
            width: 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.左侧盒子固定,写死宽高 */
            width: 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.右侧盒子固定,写死宽高 */
            width: 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;
            width: 70px;
            background-color: #09f;
        }

        .right {
            height: 50px;
            float: right;
            width: 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% */
            width: 100%;
            background-color: #90f;
        }

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

        .box .right {
            width: 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>

UTOOLS1586483992027.png

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% */
            width: 100%;
            background-color: #095;
        }

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

        .box .right {
            width: 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

posted @ 2020-04-09 16:53  小艾同学喔  阅读(226)  评论(1编辑  收藏  举报