[toc]
## 什么是响应式布局开发
让我们开发完成的产品,能够适配不同的设备屏幕:PC端(电脑)、PAD、PHONE(手机端)
## 当别人和你聊H5,他们想要聊的是什么?
现在H5已经成为移动端开发(响应式布局)标准代名词
## 移动端发展史
### native:native-app
智能生活(互联网+) 离不开各种APP(应用),这些应用离不开一代又一代的IT工程师
很久以前,APP开发和H5没什么太大关系,都是由专业的APP开发团队开发的
一般分为:
- 安卓系统:JAVA(java-native)
- IOS系统:C(object-c/swift)
我们把用上述语言开发的APP称之为native app(原生APP)
这种开发方式的步骤一般为
>1. 本地开发,打包成安装包,上传到应用商店(App Store 是有审核期的,7天左右)
>2. 用户从应用商店下载安装相关的APP,把当前APP源文件(源代码)安装在手机上,类似于在PC电脑上安装一个软件
>
好处在于:
> native app可以直接操作手机内部的软件或则硬件,(例如:通讯录、摄像头、相册、重力感应器等),因为它是直接运行在手机操作系统中的程序,因此进行操作和交互时,性能是比较不错的(相对于H5,因为H5还要在它内部运行而不是直接在操作系统中)
这种开发方式的问题是:
>手机操作系统不一样,使用的技术也不一样,所以需要两个不同的开发团队,开发不同版本的APP
>
>;除了开发成本,这样还有个问题就是有的版本升级快,有的版本升级慢(审核问题),并且用户可能不想更新,这样新内容就无法推广
>
---
### h5:web-app
>h5程序运行示例图
![](https://box.kancloud.cn/c8e6dd149509bb4247f1bdb00dd98820_254x366.png)
>由H5开发web-app的特点:
>1. 其实就是个HTML页面,需要基于浏览器运行(PC或则移动端浏览器再或则V8内核的工具也可以),如果想要操作手机内部的软件或则硬件,需要浏览器支持
>2. 相比于native-app来说,性能不好
>3. 所有的请求访问都必须基于连网的状态(除了有些是natvie-app把h5特殊处理了)
优势:
>H5只需要把服务器上的文件更新,用户每次访问看到的都是最新版本
劣势:
>H5页面部署到了自己的服务器上,源文件都在服务器上,用户想要看页面,必须从服务器上重新的拉取代码才可以
>虽然h5中支持manifest离线缓存,但现在并不成熟不大好用(什么时候更新什么时候不更新、稳定性、服务器支持、存储大小)
>而native-app不需要联网,是因为所有代码文件都在手机上,一些需要联网访问的,native-app都可以做离线缓存(缓存视频撒的)
---
### Hybrid
So,介于上面两种开发方式优缺点,
目前我们开发一款APP通常为 **Natvie+H5的介入** 的方式:
在native-app中嵌入H5页面(web-app),我们把这种模式称之为Hybrid,即混合APP开发
>Hybrid程序运行示例图
![](https://box.kancloud.cn/dee3cd0d38b5fb018b85191862a86e95_1004x414.png)
微信这个 **native-app** 的 **js-bridge** 就长这样
![](https://box.kancloud.cn/ecef645bfc2a38ef0b24c0b9ca90b2fa_601x356.png)
### 典型应用
>微信是最为经典的Hybrid混合开发模式,它支持我们的H5页面在微信这个 **native-app** 中运行,而且还可以调取微信提供的一些方法实现相关的操作(例如:微信的二次分享)
>
>微信现在的H5不是泡在web-view中而是qq浏览器中
>
#### 常见项目类型
>1. PC端和移动端公用一套项目(同一个地址),我们也要保持良好的展示性,例如:猎豹浏览器、华为官网等简单的展示网站
>
>2. PC端和移动端用的是不同的项目,例如:京东、淘宝等...【比第一种更常见】
>PC端固定布局即可
>移动端需要考虑响应式开发
>1)放在浏览器中运行
>2)放在第三方平台中运行(微信)
>3)放在自己公司的 **native-app** 中运行
>需要对运行环境进行判断,因为在不同地方运行api接口的样子可能不一样
>
## 开发
### 手机常用尺寸
>[苹果]
>iphone 5s 及以前:320px
>iphone4:320\*480
>iphone5:320\*568
>
>iphone6:375px
>iphone6plus:414px
>
>
>[安卓]
>320、360、480、540、640 ...
>
在做H5页面开发之前,需要先从设计师手里索要UI设计图(PSD格式的或则sketch设计稿)
如果是pc和移动端公用:
1360 1200 1100 1000 都有
如果是pc和移动端分开:
常用尺寸有
iphone4 -> 640\*960
iphone5 -> 640\*1136
iphone6 -> 750\*1334
### 设备像素密度比DPI
**主要是对图片影响比较大**
之所以有影响,是因为高清屏,原本1x1的 非得按照2x2来呈现,这样就可能会导致出现失真
![](https://box.kancloud.cn/38fb25183f324e3f09c80e82c3f1308e_829x338.png)
为什么设计师给我们的设计稿为什么比真实尺寸要放大二倍?
因为图片在高倍屏下,会被放大,比如二倍屏幕中,本来是100x100的图片会被放大为200x200,这就可能会失真
So,我们一般就直接给一个200x200的图片(在普通屏,1倍屏中当做100x100用(写css时))
### viewport
移动端和pc端不一样
pc端, 当前浏览器有多宽,html页面就有多宽
而手机浏览器是无法调整大小的,html页面宽度不是根据它也不是根据手机设备的宽度,而是一个固定的宽度**980**,这样当我们在一个320的手机上观看HTML页面,为了保证把页面呈现全,就需要让HTML页面大概缩小三倍,这样虽然看全了,但所有内容都变小了,用户想要看清楚,还需要手动把想看的部分放大
![](https://box.kancloud.cn/d86869466dd18c5d5fd9a3c5f5bfa1e1_524x704.png)
所以为了让 html 页面 在手机端中和手机视口宽度一样,需要:
```
//和手机视口一样大,不能缩放也不能放大
<meta name="viewport" content="width=device-width,user-scable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"></meta>
```
![](https://box.kancloud.cn/2f1d63f5f993c9cbe49f78f0d6aa5246_442x390.png)
加了以后
![](https://box.kancloud.cn/661fe2893cac2afdb2399287cd47fca4_897x426.png)
### REM
和**px**像素一样,它是一个CSS样式单位
它是相对于页面根元素[HTML]字体大小设定的单位
![](https://box.kancloud.cn/21b48c8a42259cd39508279037ac8a96_694x166.png)
然后在 body 中将字体大小重置为默认大小
```
body{font-size:.16rem}
```
#### 在项目中如何利用REM进行响应式开发
>1. 严格按照设计稿中的提供的尺寸进行样式编写(不管是宽高,还是MARGIN,还是字体等),例如:设计稿是750\*1336的,设计稿中有一个300\*150的图片,我们布局的时候依然按照300\*150布局
>
>2. 我们在编写样式的时候,不要使用**px**单位,所有的单位都统一换算为**REM**(此时我们需要让HTML的FONT-SIZE=100px)
>
>3. 上述完成后,在750的手机上是没有任何问题的,但是在375的手机上肯定存在问题了(页面太大了),此时我们需要让页面中的所有样式,都整体缩小,才能达到响应式适配的目的
>此时只需要把HTML的字体大小修改,那么之前所有以REM为单位的样式会自动跟着重新计算
>750设计稿:1REM=100px
>375的手机:375/750*\100 就是最新HTML的字体大小,也是最新REM和PX的换算比例
>当前设备的宽度/设计稿宽度\*100 = 当前手机下REM和PX的换算比例,也就是HTML的字体大小
- 空白目录
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13个核心属性
- DOM优化
- 回流与重绘
- 未整理
- 文档碎片
- DOM映射机制
- DOM库封装
- 事件
- 功能组件
- table
- 图片延迟加载
- 跑马灯
- 回到顶部
- 选项卡
- 鼠标跟随
- 放大镜
- 搜索
- 多级菜单
- 拖拽
- 瀑布流
- 数据类型的核心操作原理
- 变量提升
- 闭包(scope)
- this
- 练习题
- 各种数据类型下的常用方法
- JSON
- 数组
- object
- oop
- 单例模式
- 高级单例模式
- JS中常用的内置类
- 基于面向对象创建数据值
- 原型和原型链
- 可枚举和不可枚举
- Object.create
- 继承的六种方式
- ES6下一代js标准
- babel
- 箭头函数
- 对象
- es6勉强笔记
- 流程控制
- switch
- Ajax
- eval和()括号表达式
- 异常信息捕获
- 逻辑与和或以及前后自增
- JS中的异步编程思想
- 上云
- 优化技巧
- 跨域与JSONP
- 其它跨域相关问题
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历