响应式布局

响应式布局

搬运自个人博客:响应式布局

原理

使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备。

设备尺寸区间
手机<768px
平板[768px, 992px)
桌面显示器[992px, 1200px)
大桌面显示器(电脑)>=1200px

响应式布局容器

响应式布局需要一个父级作为布局容器,让子级元素实现变化效果

原理:在不同屏幕下,通过媒体查询来改变布局容器的大小,再改变里面子元素的排列方式和大小,从而实现在不同大小的屏幕下,看到不同的页面布局和样式。

常用的响应式尺寸划分:

设备尺寸区间宽度设置
手机<768px100%
平板[768px, 992px)750px
桌面显示器[992px, 1200px)970px
大桌面显示器(电脑)>=1200px1170px

除了手机的宽度设置是100%外,其他设备的宽度设置都会比设备的尺寸区间最小值小一点,原因是留空一点,不占满屏幕,然后容器可以居中显示。

例子:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Myself</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            height: 200px;
            background-color: pink;
            margin: 0 auto;
        }

        /*媒体查询,根据设备的宽度设置容器的宽度*/
        @media screen and (max-width: 767px) {
            .container {
                width: 100%;
            }
        }

        @media screen and (min-width: 768px) {
            .container {
                width: 750px;
            }
        }

        @media screen and (min-width: 992px) {
            .container {
                width: 970px;
            }
        }

        @media screen and (min-width: 1200px) {
            .container {
                width: 1170px;
            }
        }
    </style>
</head>

<body>
    <div class="container"></div>
</body>

</html>

Bootstrap

Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。

使用步骤

  1. 下载Bootstrap

  2. 把会用到的文件夹放到要用的站点文件夹下

    另外,要防止低版本ie没办法用h5、css3的新东西,导致出问题,html骨架需要加点料。

    <meta charset="UTF-8">
    
    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    
    <title>Myself</title>
    

    注意!这里if这一段是注释,但是,注释的部分只是说浏览器不渲染,不显示被注释的代码,但是,浏览器还是回去读注释的代码的(刷新想法)

    <!-- 解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题 -->
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    
    <!-- 解决ie9以下浏览器对css3 Media Query的不识别 -->
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    
  3. 引入要用的css文件等

     <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
    
  4. 全局 CSS 样式中选要用的东西,复制对应标签

    <button type="button" class="btn btn-danger">(危险)Danger</button>
    
  5. 根据自己需要修改

    <style>
         .container {
             width: 750px;
             margin: 0 auto;
         }
    
         .blue {
             background-color: skyblue !important;
         }
     </style>
    
    <body>
        <div class="container">
            <button type="button" class="btn btn-danger blue">登录</button>
        </div>
    
    </body>
    

组件使用例子:

<!-- 字体图标 -->
<div class="container">
    <span class="glyphicon glyphicon-ok"></span>
</div>

<!-- 巨幕 -->
<div class="jumbotron">
    <h1>Hello, world!</h1>
    <p>One plus one equals two!</p>
    <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>

Bootstrap布局容器

Bootstrap预定义了两个container容器

  1. container类
    • 响应式布局的容器,固定宽度
    • 大屏(电脑)(>=1200px):宽度固定为1170px
    • 中屏(桌面显示器)(>=992px):宽度固定为970px
    • 小屏(平板)(>=768px):宽度固定为750px
    • 超小屏(手机)(<768px):宽度固定为100%
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">

    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <title>Myself</title>
    <style>
        .container {
            height: 200px;
            background-color: pink;
        }
    </style>
    <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
    </div>
</body>

</html>

上面的例子等价于响应式布局容器的例子,简单来说就是,有大佬已经把它封装好了,可以直接用

  1. container-fluid类
    • 流式布局容器,100%宽度
    • 占据全部视口(viewport)的容器
    • 适合于单独做移动端开发

栅格系统

栅格系统是将页面布局划分为等宽的列,然后通过列数的定义来模块化页面布局。

Bootstrap提供了一套响应式、移动设备优先的流动栅格系统,会把container分为12列。

栅格系统通过一系列的行(row)和列(column)的组合来创建页面布局。

规则:

  • 行(row)必须要放在container布局容器里面

  • 要实现列的平均划分,需要给类添加类前缀

设备尺寸区间宽度设置类前缀
手机<768px100%.col-xs-
平板[768px, 992px)750px.col-sm-
桌面显示器[992px, 1200px)970px.col-md-
大桌面显示器(电脑)>=1200px1170px.col-lg-
  • xs(extra small):超小;sm(small):小;md(medium):中等;lg(large):大
  • 列的总和大于12的话,多余的列会另起一行排列
  • 每一列默认有左右15像素的padding
  • 可以同时为一列指定多个设备的类名,例如class="col-md-4 col-sm-6"

例子

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

<head>
    <meta charset="UTF-8">

    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <title>Myself</title>
    <style>
        .container {
            height: 200px;
        }

        [class^="col"] {
            border: 1px solid #ccc;
        }

        .container>div:nth-child(1) div {
            background-color: pink;
        }
    </style>
    <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <div class="row">
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">1</div>
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">2</div>
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">3</div>
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">4</div>
        </div>

        <div class="row">
            <div class="col-lg-6">1</div>
            <div class="col-lg-1">2</div>
            <div class="col-lg-1">3</div>
            <div class="col-lg-4">4</div>
        </div>

        <!-- 总份数小于12 -->
        <div class="row">
            <div class="col-lg-3">1</div>
            <div class="col-lg-3">2</div>
            <div class="col-lg-3">3</div>
            <div class="col-lg-1">4</div>
        </div>
        <br>

        <!-- 总份数大于12 -->
        <div class="row">
            <div class="col-lg-5">1</div>
            <div class="col-lg-5">2</div>
            <div class="col-lg-3">3</div>
            <div class="col-lg-3">4</div>
        </div>
    </div>
</body>

</html>

列嵌套

栅格系统可以将一个列再分成若干个小列。

例子:

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

<head>
    <meta charset="UTF-8">

    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <title>Myself</title>
    <style>
        .container {
            height: 200px;
        }

        [class^="col"] {
            border: 1px solid #ccc;
        }

        .container .row div {
            background-color: pink;
        }
    </style>
    <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <div class="row">
            <div class="col-md-3">
                <!-- 直接把列分成小列,会出现小列无法铺满原来的列,因为小列的父元素会有padding值 -->
                <div class="col-md-6" style="background-color: red">11</div>
                <div class="col-md-6" style="background-color: red">12</div>
            </div>
            <div class="col-md-3">2</div>
            <div class="col-md-3">3</div>
            <div class="col-md-3">4</div>
        </div>

        <div class="row">
            <div class="col-md-3">
                <!-- 把列分成行后,再把行分成小列,可以实现取消父元素的padding值 -->
                <div class="row">
                    <div class="col-md-6" style="background-color: red">11</div>
                    <div class="col-md-6" style="background-color: red">12</div>
                </div>

            </div>
            <div class="col-md-3">2</div>
            <div class="col-md-3">3</div>
            <div class="col-md-3">4</div>
        </div>
    </div>
</body>

</html>

列偏移

使用类前缀-offset-*类可以将列向右侧偏移,这些类实际是通过*选择器为当前元素增加了左边距(margin)

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

<head>
    <meta charset="UTF-8">

    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <title>Myself</title>
    <style>
        .container {
            height: 200px;
        }

        [class^="col"] {
            border: 1px solid #ccc;
        }

        .container .row div {
            background-color: pink;
        }
    </style>
    <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <div class="row">
            <!-- 两个div,空出中间一块,只需要右边的盒子偏移 12 - 左盒子占的份数 - 右盒子占的份数即可 -->
            <div class="col-md-4"></div>
            <div class="col-md-4 col-md-offset-4"></div>

            <!-- 一个盒子占中间位置,只需给这个盒子偏移 (12 - 盒子占的份数) / 2即可 -->
            <div class="col-md-6 col-md-offset-3"></div>
        </div>
    </div>
</body>

</html>

列排序

使用类前缀-push-*和类前缀-pull-*可以改变列的顺序(往左边是pull,往右边是push,写错的话得不到预期的结果

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

<head>
    <meta charset="UTF-8">

    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <title>Myself</title>
    <style>
        .container {
            height: 200px;
        }

        [class^="col"] {
            border: 1px solid #ccc;
        }

        .container .row div {
            background-color: pink;
        }
    </style>
    <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <div class="row">
            <!-- 两个div,空出中间一块,只需要右边的盒子偏移 12 - 左盒子占的份数 - 右盒子占的份数即可 -->
            <div class="col-md-4 "></div>
            <div class="col-md-5 col-md-offset-3"></div>
            <!-- 想要把左右盒子互换位置,可以pull(拉)右边的盒子过来,拉的份数为左盒子的份数 + 右盒子的偏移份数
            push(推)左边的盒子过去,推的份数为右盒子的份数 + 右盒子的偏移份数 -->
            <div class="col-md-4 col-md-push-8"></div>
            <div class="col-md-5 col-md-offset-3 col-md-pull-7"></div>


        </div>
    </div>
</body>

</html>

隐藏和显示内容

和上面相反的是visible-xs, visible-sm, visible-md, visible-lg,显示内容

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

<head>
    <meta charset="UTF-8">

    <!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- 视口标签的设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <title>Myself</title>
    <style>
        .container {
            height: 200px;
        }

        [class^="col"] {
            border: 1px solid #ccc;
        }

        .container .row div {
            background-color: pink;
        }

        span {
            font-size: 20px;
            color: #fff;
        }
    </style>
    <link rel="stylesheet" href="../bootstrap-3.4.1-dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <div class="row">
            <div class="col-xs-4">
                1
                <!-- 超小屏(手机)才会显示 -->
                <span class="visible-xs">Hello! 手机</span>
            </div>

            <!-- 小屏和大屏会隐藏 -->
            <div class="col-xs-4 hidden-sm hidden-lg">2</div>

            <div class="col-xs-4">3</div>
        </div>
    </div>
</body>

</html>

参考:
pink老师前端入门教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值