---
url: /notes/前端/移动布局基础/index.md
---
## 移动开发基础

**浏览器现状**

|                            pc端                             |                            移动端                            |
| :---------------------------------------------------------: | :----------------------------------------------------------: |
| 360谷歌火狐QQ百度搜狗IE | UCQQ欧朋百度360谷歌搜狗猎豹 |

国内的UC，QQ，百度等都是根据**Webkit**修改过来的内核，暂无自主研发的内核

**手机屏幕**

碎片化严重

https://material.io/devices/

**移动端调试方法**

* **Chrome  DevTools（谷歌浏览器）的模拟手机调试**
* 搭建本地Web服务器，手机和服务器一个局域网内，通过手机访问服务器
* 使用外网服务器，直接IP或域名访问

### 视口

\*\*视口（viewport）\*\*浏览器显示页面内容的屏幕区域。可分为布局视口、视觉视口、理想视口

**布局视口 layout viewport**

* 移动设备浏览器默认设置了一个布局视口，用于解决早期PC端页面在手机上显示的问题
* IOS，Android基本都将这个视口设置为980px，PC上的网页大多都能在手机上呈现，但是元素看起来小，默认通过手动缩放网页

**视觉窗口 visual viewport**

* 用户正在看到的**网站的区域**
* 可以通过缩放去操作视觉窗口，但不会影响布局视口，布局视口仍保持原来的宽度

**理想视口 ideal viewport**

* 为了使网站在移动端有最理想的浏览和阅读宽度而设定
* 对设备来说，是最理想的视口尺寸
* 需要**手动添&#x52A0;****meta****&#x89C6;口标签**通知浏览器操作
* meta视口标签的主要目的：布局视口的宽度应该与理想视口的宽度一致（设备多宽，布局视口就有多宽）

**meta视口标签**

```html
<meta name="viewport" content="width=device-width, user-scalable=0, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
```

| **属性**      | **解释说明**                                             |
| ------------- | -------------------------------------------------------- |
| width         | 宽度设置的是viewport宽度，可以设置**device-width**特殊值 |
| initial-scale | 初始缩放比，大于0的数字                                  |
| maximum-scale | 最大缩放比，大于0的数字                                  |
| minimum-scale | 最小缩放比，大于0的数字                                  |
| user-scalable | 用户是否可以缩放，yes或no（1或0）                        |

### 二倍图

**物理像素 & 物理像素比**

* 物理像素点指的是屏幕显示的最小颗粒，是物理真实存在的。厂商出厂设置，苹果6/7/8是 750\*1334
* **开发时1px不一定等于1个物理像素**
* PC端页面，1px等于1个物理像素，移动端不同
* 一个px能显示的物理像素点的个数，称为**物理像素比**或**屏幕像素比**
* PC端和早前的手机屏幕/普通手机屏幕：1CSS像素=1物理像素
* Retina（视网膜屏幕）一种显示技术，可以将更多的物理像素点压缩至一块屏幕里，从而达到更高的分辨率，并提高屏幕显示的细腻程度

### 多倍图

对于一张50px \* 50px 的图片，在手机Retina屏中打开，物理像素会放大倍数，造成图片模糊

在标准的viewport设置中，使用倍图来提高图片质量，解决在高清设备中的模糊问题

通常使用二倍图，还存在3、4倍图，要看实际需求

**背景图片注意缩放问题**

```css
img {
    /* 原始图片100px*100px */
    width: 50px;
    height: 50px;
}
.box {
    /* 原始图片100px*100px */
    background-size: 50px 50px;
}
```

cutterman切出多倍图

**二倍精灵图**

（1）在firework把精灵图等比例缩放为原来的一半

（2）根据大小测量坐标

（3）background-size: 精灵图原来宽度的一半

### 背景缩放 **background-size**

规定背景图像的尺寸

```css
background-size: 背景图片宽度 背景图片高度;
```

单位：**长度**|**百分比**|**cover**|**contain**

cover把背景图像扩展至足够大，以使背景图像完全**覆盖背景区域**

contain把背景图像扩展至最大尺寸，以使其宽度和高度完全**适应内容区域**

### 移动开发选择

**单独制作移动端页面**

网址域名前面加**m（mobile）**可以打开移动端。通过判断设备，如果是移动端，则调到**移动端界面**

**响应式页面兼容移动端**

三星电子官网：[www.samsung.com/cn/](http://www.samsung.com/cn/)，通过判断屏幕宽度来改变样式，以适应不同终端

### 移动端技术解决方案

移动端浏览器基本以Webkit内核为主，可使h5标签和css3样式

浏览器私有前缀只考虑添加webkit

**css初始化 normalize.css**

移动端推荐使用

* 保护了有价值的默认值
* 修复了浏览器bug
* 模块化
* 拥有详细的文档

官网地址：http://necolas.github.io/normalize.css/ | https://github.com/necolas/normalize.css/

**css盒子模型 box-sizing**

传统模式宽度计算：width + border + padding

css3盒子模型：width里面包含border 和 padding

```css
/* css3盒子模型 */
box-sizing: border-box;
/* 传统盒子模型 */
box-sizing: content-box;
```

**特殊样式**

css3**盒子**模型

```css
box-sizing: border-box;
-webkit-box-sizing: border-box;
```

**点击高亮**需要清除 设置为transparent 透明

```css
* {
    -webkit-tap-highlight-color: transparent;
}
```

在移动端浏览器默认的外观在ios上加上这个属性才能给**按钮**和**输入框**自定义样式

```css
button,
input {
    -webkit-appearance: none;
}
```

禁用**长按页面**时的**弹出菜单**

```css
img,
a {
    -webkit-touch-callout: none;
}
```

## 移动端技术选型

**单独制作移动端页面**

* 流式布局（百分比布局）
* flex弹性布局（推荐）
* less+rem+媒体查询布局
* 混合布局

**响应式页面兼容移动端**

* 媒体查询
* bootstarp

## 流式布局(百分比布局)

**非固定像素布局-最常见布局**

通过盒子的宽度设置成百分比来根据屏幕的宽度进行伸缩，不受固定像素的限制，内容向两侧填充

**max-width** 最大宽度（**max-height** 最大高度）

**min-width** 最小宽度（**min-height** 最小高度）

## **flex布局**

操作方便，布局极其简单，移动端使用比较广泛

pc端浏览器支持情况比较差

IE11或更低版本不支持flex或仅支持部分

### **flex布局原理**

flex 是 flexible Box 的缩写，意为"弹性布局"，用来为盒状模型提供最大的灵活性，任何一个容器都可以指定为 flex 布局

当我们为父盒子设为 flex 布局以后，子元素的 float、clear 和 vertical-align 属性将**失效**

flex布局又叫伸缩布局 、弹性布局 、伸缩盒布局 、弹性盒布局

采用 Flex 布局的元素，称为 Flex 容器（flexcontainer），简称"容器"。它的**所有子元素自动成为容器成员**，称为 Flex 项目（flex item），简称"项目"

**总结**：就是通过给父盒子添加flex属性，来控制子盒子的位置和排列方式

### **父项常见属性**

| flex-direction  | 设置主轴的方向                                          |
| --------------- | ------------------------------------------------------- |
| justify-content | 设置主轴上的子元素排列方式                              |
| flex-wrap       | 设置子元素是否换行                                      |
| align-content   | 设置侧轴上的子元素的排列方式（多行）                    |
| align-items     | 设置侧轴上的子元素排列方式（单行）                      |
| flex-flow       | 复合属性，相当于同时设置了  flex-direction 和 flex-wrap |

**flex-direction 设置主轴的方向**

**主轴与侧轴**

在flex布局中，是分为主轴和侧轴两个方向，也称：行和列、x轴和y轴

* 默认主轴方向是x轴方向，水平向右
* 默认侧轴方向是y轴方向，水平向下

![image-20220420134538673](https://note-1259190304.cos.ap-chengdu.myqcloud.com/note/202204201345959.png)

**属性值**

flex-direction属性决定主轴的方向（即项目的排列方向）

注意：主轴和侧轴是会变化的，就看flex-direction设置谁为主轴，剩下的就是侧轴。子元素是跟着主轴来排列的

| **属性值**     | **说明**       |
| -------------- | -------------- |
| row            | 默认值从左到右 |
| row-reverse    | 从右到左       |
| column         | 从上到下       |
| column-reverse | 从下到上       |

**justify-content 设置主轴上的子元素排列方式**

此属性定义了项目在主轴上的对齐方式

注意：使用这个属性之前一定要确定好主轴是哪个

| **属性值**    | **说明**                                   |
| ------------- | ------------------------------------------ |
| flex-start    | 默认值 从头开始 如果主轴是x轴，则从左到右  |
| flex-end      | 从尾部开始排列                             |
| center        | 在主轴居中对齐（如果主轴是x轴则 水平居中） |
| space-around  | 平方剩余空间                               |
| space-between | 先两边贴边 再平分剩余空间                  |

**flex-wrap 设置子元素是否换行**

默认情况下，项目都排在一条线上（又称"轴线"）上。flex-wrap属性定义，flex布局中默认是不换行的

| **属性值** | **说明**       |
| ---------- | -------------- |
| nowrap     | 默认值，不换行 |
| **wrap**   | **换行**       |

**align-items 设置侧轴上的子元素排列方式（单行）**

该属性是控制子项在侧轴（默认是y轴）上的排列方式 在子项为单项的时候使用

| **属性值**     | **说明**                 |
| -------------- | ------------------------ |
| **flex-start** | **默**认值 从上到下      |
| flex-end       | 从下到上                 |
| **center**     | 挤在一起居中（垂直居中） |
| **stretch**    | 拉伸                     |

**align-content 设置侧轴上的子元素的排列方式（多行）**

设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况（多行），在单行下没有效果

| **属性值**        | **说明**                               |
| ----------------- | -------------------------------------- |
| **flex-start**    | 默认值在侧轴的头部开始排列             |
| **flex-end**      | 在侧轴的尾部开始排列                   |
| **center**        | 在侧轴中间显示                         |
| **space-around**  | 子项在侧轴平分剩余空间                 |
| **space-between** | 子项在侧轴先分布在两头，再平分剩余空间 |
| **stretch**       | 设置子项元素高度平分父元素高度         |

**flex-flow**

该属性是 **flex-direction** 和 **flex-wrap** 属性的**复合属性**

```css
Flex-flow: row wrap;
```

### **子项常见属性**

* flex子项目占的份数
* align-self控制子项自己在侧轴的排列方式
* order属性定义子项的排列顺序（前后顺序）

**flex 属性**

flex 属性定义子项目分配剩余空间，用flex来表示占多少份数

```css
.item {
    flex: <number>; /* 默认值 0 */
}
```

**align-self控制子项自己在侧轴上的排列方式**

align-self 属性允许单个项目有与其他项目不一样的对齐方式，可覆盖 align-items 属性

默认值为 auto，表示继承父元素的 align-items 属性，如果没有父元素，则等同于 stretch

```css
span:nth-child(2) {
    /* 设置自己在侧轴上的排列方式 */
    align-self: flex-end;
}
```

**order 属性定义项目的排列顺序**

数值越小，排列越靠前，默认为0

注意：和 z-index 不一样

```css
.item {
    order: <number>;
}
```

## **rem布局**

### rem基础

rem（root em）是一个相对单位，类似于em，em是父元素字体大小

不同的是rem的基准是相对于html元素的字体大小

根元素（html）设置font-size=12px；非根元素设置width：2rem；则换成px表示24px

```css
/* 根html 为 12px */
html {
    font-size: 12px;
}
/* 此时 div 的字体大小就是 24px */       
div {
     font-size: 2rem;
}
```

rem的优势：**父元素文字大小可能不一致，** **但是整个页面只有一个html，可以很好来控制整个页面的元素大小**

#### 媒体查询 **Media Query**

使用 @media查询，可以针对不同的媒体类型定义不同的样式

@media可以针对不同的屏幕尺寸设置不同的样式

当重置浏览器大小时，页面也会根据浏览器的宽度和高度重新渲染页面

**语法规范**

```css
@media mediatype and | not | only (media feature) {
    css-code;
}
```

* 用@media开头 注意 **@符号**
* mediatype **媒体类型**
* **关键字** and not only
* media feature 媒体特性 必须有小括号包含

**mediatype** **查询类型**

媒体类型：将不同的终端设置划分成不同的类型

| **值**     | **解释说明**                       |
| ---------- | ---------------------------------- |
| all        | 用于所有设备                       |
| print      | 用于打印机和打印预览               |
| **screen** | 用于电脑屏幕，平板电脑，智能设备等 |

**关键字**

将媒体类型或多个媒体特性连接到一起作为媒体查询的条件

* **and**：可以将多个媒体特性连接到一起，"且"
* **not**：排除某个媒体特性，"非"
* **only**：指定某个特性的媒体类型，可省略

**媒体特性**

每种媒体类型都具有各自不同的特性，根据不同媒体特性设置不同的展示风格，要加小括号包含

| **值**    | **解释说明**                       |
| --------- | ---------------------------------- |
| width     | 定义输出设备中页面可见区域的宽度   |
| min-width | 定义输出设备中页面最小可见区域宽度 |
| max-width | 定义输出设备中页面最大可见区域宽度 |

**媒体查询书写规则**

注意： 为了防止混乱，媒体查询我们要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写，这样代码更简洁

![image-20220420135514962](https://note-1259190304.cos.ap-chengdu.myqcloud.com/note/202204201355033.png)

#### rem实现元素动态大小变化

```html
<style>
        * {
            margin: 0;
            padding: 0;
        }
        
        .top {
            height: 1rem;
            font-size: 0.5rem;
            background-color: #98C36E;
            color: #fff;
            font-weight: 700;
            text-align: center;
            line-height: 1rem;
        }
        
        @media screen and (min-width: 320px) {
            html {
                font-size: 50px;
            }
        }
        
        @media screen and (min-width: 640px) {
            html {
                font-size: 100px;
            }
            .top {
                background-color: sandybrown;
            }
        }
    </style>
<body>
    <div class="top">胡梓卓</div>
</body>
```

#### 引入资源

当样式繁多的时候，可以针对不同的媒体使用不同的stylesheets（样式表）

**语法规范**

```html
<link rel="stylesheet" href="index_1.css" media="mediatype and|not|only (media feature)">
```

### less基础

CSS 是一门非程序式语言，冗余度高，不利于扩展，复用，没有计算能力

less（leaner style sheets）一门css扩展语言（css预处理器）

在css基础上，引入变量，Mixin（混入），运算以及函数等功能，简化css编写，降低css维护成本

less中文网址：http://lesscss.cn

常见的css预处理器：sass、less、stylus

**Less是一门css 预处理语言，扩展了css的动态特性**

**less安装**

①安装nodejs，可选择版本(8.0)，网址：http://nodejs.cn/download/

②检查是否安装成功，使用cmd命令（win10是window+r 打开运行输入cmd） ---输入“`node –v`”查看版本即可

③基于nodejs在线安装Less，使用cmd命令“`npm install -g less`”即可

④检查是否安装成功，使用cmd命令“ `lessc -v` ”查看版本即可

![image-20220420135858174](https://note-1259190304.cos.ap-chengdu.myqcloud.com/note/202204201358229.png)

**less使用**

新建一个后缀名为less的文件，即可编写

把一个less样式文件导入到另一个less样式文件

```less
@import "common";
```

#### less变量

```less
@变量名: 值;
@color: pink;
@font14: 14px;
body {
    background-color: @color;
}
a {
    font-size: @font14;
}
```

**变量命名规范**

* 必须有@为前缀
* 不能包含特殊字符
* 不能以数字开头
* 大小写敏感

**less编译**

本质上，Less包含一套自定义的语法及一个解析器，用户根据这些语法定义自己的样式规则，这些规则会通过解析器，编译生成对应的css文件

需要把less文件，编译生成css文件，html页面才能使用

**vscode Less** **插件** **--** **easy less**

ctrl+s保存自动把less文件自动编译为css文件

#### less嵌套

**子元素的样式直接写到父元素里面**

```less
// 将css改为less
#header .logo {
  width: 300px;
}
#header {
    .logo {
       width: 300px;
    }
}
```

如果遇见 （**交集|伪类|伪元素选择器**）

* 内层选择器的前面没有 **&** 符号，则它被解析为父选择器的后代
* 如果有 **&** 符号，它就被解析为父元素自身或父元素的伪类

```less
a:hover{
  color: red;
}
a{
    &:hover{
        color: red;
    }
}
```

#### less运算

任何**数字**、**颜色**或者**变量**都可以参与运算。就是Less提供了加（+）、减（-）、乘（\*）、除（/）算术运算

**注意：**

* 运算符中间左右有个**空格隔开** 1px + 5
* 对于两个不同的单位的值之间的运算，运算结果的值**取\*\*\*\*第一个值的单位**
* 如果两个值之间只有一个值有单位，则运算结果就**取该单位**

```less
background-color: #666 - #222;
font-size: 12px - 2;
font-weight: 300 + @font-weight400;
```

### rem适配方案

技术方案

![image-20220420140432023](https://note-1259190304.cos.ap-chengdu.myqcloud.com/note/202204201404089.png)

1.less+rem+媒体查询

总结：

①最后的公式：页面元素的rem值 = 页面元素值（px） / （屏幕宽度 / 划分的份数）

②屏幕宽度/划分的份数就是 htmlfont-size 的大小

③或者：页面元素的rem值 = 页面元素值（px） / html font-size 字体大小

2.**lflexible.js+rem**

github地址：https://github.com/amfe/lib-flexible

## 响应式布局

### 响应式开发原理

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

设备划分

| 手机（超小）         | <  768       |
| -------------------- | ------------ |
| 平板（小屏）         | >=768  < 992 |
| 桌面显示器（中屏）   | >=992  <1000 |
| 大桌面显示器（宽屏） | >=1200       |

**响应式布局容器**

响应式需要一个父级做为布局容器，来配合子级元素来实现变化效果

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

| 超小屏幕（手机，小于 768px）            | 设置宽度为 100%   |
| --------------------------------------- | ----------------- |
| 小屏幕（平板，大于等于 768px）          | 设置宽度为 750px  |
| 中等屏幕（桌面显示器，大于等于 992px）  | 宽度设置为 970px  |
| 大屏幕（大桌面显示器，大于等于 1200px） | 宽度设置为 1170px |

### 快速开发-Bootstrap框架

Bootstrap 来自 Twitter（推特），是目前最受欢迎的前端框架。Bootstrap 是基于HTML、CSS 和 JAVASCRIPT 的，它简洁灵活，使得 Web 开发更加快捷

中文官网：http://www.bootcss.com/

官网：http://getbootstrap.com/

推荐使用：http://bootstrap.css88.com/

#### bootstrap使用

**1.创建文件夹结构**

![image-20220420140620860](https://note-1259190304.cos.ap-chengdu.myqcloud.com/note/202204201406918.png)

**2.创建html骨架结构**

```html
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	<!--要求当前网页使用IE浏览器最高版本的内核来渲染-->
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<!--视口设置：视口的宽度和设备一致，默认的缩放比例和PC端一致，用户不能自行缩放-->
    <!-- 上述3个meta标签*必须*放在最前面，任何其他内容都*必须*跟随其后！ -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<!--解决IE9以下浏览器对html5新增标签的不识别，并导致css不起作用的问题-->
      <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<!--解决IE9以下浏览器对css3 Media Query的不识别-->
    <![endif]-->
  </head>
  <body>
    <h1>你好，世界！</h1>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>
```

**3.引入相关样式文件**

```html
<!-- Bootstrap 核心样式-->
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
```

**4.书写内容**

直接拿Bootstrap 预先定义好的样式来使用

修改Bootstrap 原来的样式，注意权重问题

学好Bootstrap 的关键在于知道它定义了哪些样式，以及这些样式能实现什么样的效果

#### bootstrap布局容器

Bootstrap 需要为页面内容和栅格系统包裹一个 **.container** 或者\*\*.container-fluid\*\* 容器，它提供了两个作此用处的类

.container

* 响应式布局的容器 固定宽度
* 大屏 ( >=1200px) 宽度定为 1170px
* 中屏 ( >=992px) 宽度定为 970px
* 小屏 ( >=768px) 宽度定为 750px
* 超小屏 (100%)

.container-fluid

* 流式布局容器 百分百宽度
* 占据全部视口（viewport）的容器

#### bootstrap栅格系统

https://bootstrap.css88.com/css/

Bootstrap提供了一套响应式、移动设备优先的流式栅格系统，随着屏幕或视口（viewport）尺寸的增加，系统会自动分为最多12列

**栅格选项参数**

用于通过一系列的行（row）与列（column）的组合来创建页面布局，内容可放入创建好的布局中

|                     | 超小屏幕（手机）  <768px | 小屏设备（平板）  >=768px | 中等屏幕（桌面显示器）  >=992px | 宽屏设备（大桌面显示器）  >=1200px |
| ------------------- | ------------------------ | ------------------------- | ------------------------------- | ---------------------------------- |
| .container 最大宽度 | 自动（100%）             | 750px                     | 970px                           | 1170px                             |
| 类前缀              | .col-xs-                 | .col-sm-                  | .col=md-                        | .col=lg-                           |
| 列（column）数      | 12                       | 12                        | 12                              | 12                                 |

* 行（row）必须放到container布局容器里面
* 实现列的平均划分 需要给列添加 类前缀
* xs-extra small：超小；sm-small：小；md-medium：中等；lg-large：大；
* 列（column）大于12，多余的“列（column）”所在的元素将作为一个整体另起一行排列
* 每一列默认有左右15像素的padding
* 可以同时为一列指定多个设备的类名，以便划分不同份数 例如class="col-md-4     col-sm-6"

**栅格嵌套**

栅格系统内置的栅格系统将内容再次嵌套

简单理解就是一个列内再分成若干份小列

可以通过添加一个新的 .row 元素和一系列 **.col-sm-\*** 元素到已经存在的 .col-sm-\*元素内

**列嵌套最好加1个行row，可以取消父元素的padding值，高度也会自动和父级一样**

```html
<!-- 列嵌套 -->
 <div class="col-sm-4">
    <div class="row">
         <div class="col-sm-6">小列</div>
         <div class="col-sm-6">小列</div>
    </div>
</div>
```

**列偏移**

使用 **.col-md-offset-\*** 类可以将列向右侧偏移

这些类实际是通过使用 \* 选择器为当前元素增加了左侧的边距（margin）

```html
<!-- 列偏移 -->
  <div class="row">
      <div class="col-lg-4">1</div>
      <div class="col-lg-4 col-lg-offset-4">2</div>
  </div>
```

**列排序**

通过使用 **.col-md-push-\*** 和 **.col-md-pull-\*** 类就可以很容易的改变列（column）的顺序

```html
<!-- 列排序 -->
  <div class="row">
      <div class="col-lg-4 col-lg-push-8">左侧</div>
      <div class="col-lg-8 col-lg-pull-4">右侧</div>
  </div>
```

**响应式工具**

为了加快对移动设备友好的页面开发工作，利用媒体查询功能，并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容

| 类名                            |     超小屏     |      小屏      |     中屏      |     大屏      |
| ------------------------------- | :------------: | :------------: | :-----------: | :-----------: |
| .hidden-xs          .visible-xs | 隐藏可见 | 可见隐藏 | 可见     隐藏 | 可见     隐藏 |
| .hidden-sm          .visible-sm | 可见     隐藏  | 隐藏     可见  | 可见     隐藏 | 可见     隐藏 |
| .hidden-md        .visible-md   | 可见     隐藏  | 可见     隐藏  | 隐藏     可见 | 可见     隐藏 |
| .hidden-lg          .visible-lg | 可见     隐藏  | 可见     隐藏  | 可见     隐藏 | 隐藏     可见 |
