移动端开发基础
移动端基础
浏览器现状
PC 端常见浏览器
- 360 浏览器、谷歌浏览器、火狐浏览器、QQ 浏览器、百度浏览器、搜狗浏览器、IE 浏览器。
移动端常见浏览器
- UC 浏览器,QQ 浏览器,欧朋浏览器,百度手机浏览器,360 安全浏览器,谷歌浏览器,搜狗手机浏览器,猎豹浏览器 ,以及其他各种杂牌浏览器。
国内的 UC 和 QQ,百度等手机浏览器都是根据 Webkit 修改过来的内核,国内尚无自主研发的内核,就像国内的手机操作系统都是基于 Android 修改开发的一样。
总结:兼容移动端主流浏览器,处理 Webkit 内核浏览器即可。
手机屏幕现状
- 移动端设备屏幕尺寸非常多,碎片化严重。
- Android 设备有多种分辨率:480x800, 480x854, 540x960, 720x1280,1080x1920 等,还有传说中的 2K,4k 屏。
- 近年来 iPhone 的碎片化也加剧了,其设备的主要分辨率有:640x960, 640x1136, 750x1334, 1242x2208 等。
- 作为开发者无需关注这些分辨率,因为我们常用的尺寸单位是 px 。
常见的移动端屏幕尺寸
- 注:以上数据均参考自 https://material.io/devices/ 。
- 注:作为前端开发,不建议大家去纠结 dp,dpi,pt,ppi 等单位。
物理像素
- 又称:设备像素,物理像素是一个长度单位,单位是 px,1 个物理像素就是屏幕上的一个物理成像点,就是屏幕中一个微小的发光物理元器件(可简单理解为超级微小的灯泡),是屏幕能显示的最小粒度。它由屏幕制造商决定,屏幕生产后无法修改。
- 例如 iPhone 6 的横向上拥有的物理像素为 750、纵向上拥有的物理像素为 1334,我们也可以用: 750*1334 表示。
CSS 像素
- 又称:逻辑像素,css 像素是一个抽象的长度单位,单位也是 px,它是为 Web 开发者创造的,用来精确的度量 Web 页面上的内容大小。我们在编写 css、js、less 中所使用的都是 css 像素
屏幕分辨率
- 屏幕分辨率指屏幕在:横向、纵向上所拥有的物理像素点总数。一般表示用 n * m 表示。
- 例如: iPhone 6 的屏幕分辨率为 750 * 1334
- 注意点:
- 屏幕分辨率是一个固定值,屏幕生产出来就确定了,无法修改!!
- 屏幕分辨率、显示分辨率是两个概念,系统设置中可以修改的是:显示分辨率。
- 显示分辨率是设备当前所用到的物理像素点数,也可以说:屏幕分辨率 >= 显示分辨率。
- 手机屏幕尺寸参数查询: https://uiiiuiii.com/screen/
屏幕密度
- 又称:屏幕像素密度,是指屏幕上每英寸里包含的物理像素点个数,单位是 ppi(pixels per inch),其实这里还有另一个单位 dpi (dots per inch),两个值的计算方式都一样,只是使用的场景不同。ppi 主要用来衡量屏幕,dpi 用来衡量打印机等。
物理像素比
- 物理像素点指的是屏幕显示的最小颗粒,是物理真实存在的。这是厂商在出厂时就设置好了,比如苹果 6\7\8 是 750* 1334
- 我们开发时候的 1px 不是一定等于 1 个物理像素的
- PC 端页面,1 个 px 等于 1 个物理像素的,但是移动端就不尽相同
- 一个 px 的能显示的物理像素点的个数,称为物理像素比或屏幕像素比
- PC 端 和 早前的手机屏幕 / 普通手机屏幕: 1 CSS 像素 = 1 物理像素的
- Retina(视网膜屏幕)是一种显示技术,可以将把更多的物理像素点压缩至一块屏幕里,从而达到更高的分辨率,并提高屏幕显示的细腻程度。
移动端调试方法
- Chrome DevTools(谷歌浏览器)的模拟手机调试
- 搭建本地 web 服务器,手机和服务器一个局域网内,通过手机访问服务器
- 使用外网服务器,直接 IP 或域名访问
小结
- 移动端浏览器我们主要对 webkit 内核进行兼容
- 我们现在开发的移动端主要针对手机端开发
- 现在移动端碎片化比较严重,分辨率和屏幕尺寸大小不一
- 学会用谷歌浏览器模拟手机界面以及调试
PC 端视口
1 | console.log(document.documentElement.clientWidth) // 宽度 = 内容区域宽度 |
布局视口
视口( viewport )就是浏览器显示页面内容的屏幕区域。 视口可以分为 布局视口、视觉视口和理想视口
一般移动设备的浏览器都默认设置了一个布局视口,用于解决早期的 PC 端页面在手机上显示的问题。
iOS, Android 基本都将这个视口分辨率设置为 980px,所以 PC 上的网页大多都能在手机上呈现,只不过元素看上去很小,一般默认可以通过手动缩放网页。
视觉视口
- 字面意思,它是用户正在看到的网站的区域。注意:是网站的区域。
- 我们可以通过缩放去操作视觉视口,但不会影响布局视口,布局视口仍保持原来的宽度。
理想视口
为了使网站在移动端有最理想的浏览和阅读宽度而设定
理想视口,对设备来讲,是最理想的视口尺寸
需要手动添写 meta 视口标签通知浏览器操作
meta 视口标签的主要目的:布局视口的宽度应该与理想视口的宽度一致,简单理解就是设备有多宽,我们布局的视口就多宽
小结
- 视口就是浏览器显示页面内容的屏幕区域
- 视口分为布局视口、视觉视口和理想视口
- 我们移动端布局想要的是理想视口就是手机屏幕有多宽,我们的布局视口就有多宽
- 想要理想视口,我们需要给我们的移动端页面添加 meta 视口标签
meta 视口标签
1 | <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> |
标准的 viewport 设置
- 视口宽度和设备保持一致
- 视口的默认缩放比例 1.0
- 不允许用户自行缩放
- 最大允许的缩放比例 1.0
- 最小允许的缩放比例 1.0
- viewport-fit 设置为 cover 值, 可以解决刘海屏的留白问题
多倍图
- 对于一张 50px * 50px 的图片,在手机 Retina 屏中打开,按照刚才的物理像素比会放大倍数,这样会造成图片模糊
- 在标准的 viewport 设置中,使用倍图来提高图片质量,解决在高清设备中的模糊问题
- 通常使用二倍图, 因为 iPhone 6\7\8 的影响,但是现在还存在 3 倍图, 4 倍图的情况,这个看实际开发公司需求
- 背景图片 注意缩放问题
1 | /* 在 iphone8 下,物理像素比为 2 */ |
- 尚硅谷:
1 | <style> |
背景图缩放
- background-size 属性规定背景图像的尺寸
- background-size: 背景图片宽度 背景图片高度;
1 | background-size: 100px 100px; |
- 可选值: 长度 | 百分比 | cover | contain;
- cover : 把背景图像扩展至足够大,以使背景图像完全覆盖背景区域。
- contain : 把图像图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域
多倍图切图
- Photoshop 插件 : cutterman
移动端主流方案
- 单独移动端页面(主流)
- 通常情况下,网址域名前面加 m(mobile) 可以打开移动端。通过判断设备,如果是移动设备打开,则跳到移动端页面。
- 响应式兼容 PC 移动端
- 三星电子官网: www.samsung.com/cn/ ,通过判断屏幕宽度来改变样式,以适应不同终端。
- 缺点:制作麻烦, 需要花很大精力去调兼容性问题
- 小结:
- 现在市场常见的移动端开发有 单独制作移动端页面 和 响应式页面 两种方案
- 现在市场主流的选择还是单独制作移动端页面
移动端浏览器的兼容性
- 移动端浏览器基本以 webkit 内核为主,因此我们就考虑 webkit 兼容性问题。
- 我们可以放心使用 H5 标签和 CSS3 样式。
- 同时我们浏览器的私有前缀我们只需要考虑添加 webkit 即可
CSS 初始化
- 移动端 CSS 初始化推荐使用 normalize.css
- 保护了有价值的默认值
- 修复了浏览器的 bug
- 是模块化的
- 拥有详细的文档
- 官网地址: http://necolas.github.io/normalize.css/
CSS 3 盒子模型
- 传统模式宽度计算:盒子的宽度 = CSS 中设置的 width + border + padding
- CSS3 盒子模型: 盒子的宽度 = CSS 中设置的宽度 width, 里面包含了 border 和 padding,也就是说,我们的 CSS3 中的盒子模型, padding 和 border 不会撑大盒子了
1 | /*CSS3盒子模型*/ |
- 传统 or CSS3 盒子模型:
- 移动端可以全部 CSS3 盒子模型
- PC 端如果完全需要兼容,我们就用传统模式,如果不考虑兼容性,我们就选择 CSS3 盒子模型
1 | /*CSS3盒子模型*/ |
移动端常见布局
- 单独制作移动端页面(主流)
- 流式布局(百分比布局)
- flex 弹性布局(强烈推荐)
- less+rem+媒体查询布局
- 混合布局
- 响应式页面兼容移动端(其次)
- 媒体查询
- bootstarp
适配
- 为什么要做适配
- 由于移动端设备的屏幕尺寸大小不一,会出现:同一个元素,在两个不同的手机上显尔双果个一样(比例不同)。要想让同一个元素在不同设备上,显示效果一样,就需要适配,无论采用何种适配方式,中心原则永远是:等比。
- 主流的适配方式有三种:
- viewport 适配
- rem 适配(主流方式,几乎完美适配).
- vw 适配
viewport 适配
- 方法:拿到设计稿之后,设置布局视口宽度为设计稿宽度,然后直接按照设计稿给宽高进行布局即可。·优点:不用复杂的计算,直接使用图稿上标注的 px 值
- 缺点:
- 不能使用完整的 meta 标签,会导致在某些安卓手机上有兼容性问题
- 不希望适配的东西,例如边框,也强制参与了适配
- 图片会失真
vw 适配
- vw 和 vh 是两个相对单位
- 1 vw = 等于布局视口宽度的 1%
- 1 vh = 等于布局视口高度的 1%
移动端事件
事件类型
- 移动端事件列表
- touchstart 元素上触摸开始时触发.
- touchmove 元素上触摸移动时触发.
- touchend 手指从元素上离开时触发.
- touchcancel 触摸被打断时触发
- 这几个事件最早出现于 IOS safari 中,为了向开发人员转达一些特殊的信息。
应用场景
touchstart 事件可用于元素触摸的交互,比如页面跳转,标签页切换.
touchmove 事件可用于页面的滑动特效,网页游戏,画板
touchend 事件主要跟 touchmove 事件结合使用
touchcancel 使用率不高
注意:
- touchmove 事件触发后,即使手指离开了元素,touchmove 事件也会持续触发·
- 触发 touchmove 与 touchend 事件,一定要先触发 touchstart
- 事件的作用在于实现移动端的界面交互
事件对象
touches : 屏幕上的触点数
targetTouches : 当前元素上的触点数
changedTouches : 同时按下几个手指
点击穿透
- touch 事件结束后会默认触发元素的 click 事件,如没有设置完美视口,则事件触发的时间间隔为 300ms 左右,如设置完美视口则时间间隔为 30ms 左右(备注:具体的时间也看设备的特性). 如果 touch 事件隐藏了元素,则 click 动作将作用到新的元素上,触发新元素的 click 事件或页面跳转,此现象称为点击穿透
点击穿透解决方案一
- 给顶层元素,阻止默认行为 ( 类似于事件冒泡 )
1 | ele.addEventListener('touchstart', function (e) { |
点击穿透解决方案二
- 使背后的元素不具备 click 特性, 给背后的元素添加 touchXXX 事件,代替 click 事件
1 | ele.addEventListener('touchstart', function (e) { |
点击穿透解决方案三
- 让背后的元素暂时失去 click 事件,300 毫秒左右再复原
1 | /*添加CSS样式,不再响应点击事件*/ |
1 | btn.addEventListener('touchstart', function (e) { |
点击穿透解决方案四
- 延迟隐藏顶层元素
1 | btn.addEventListener('touchstart', function (e) { |
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自蜗牛浪迹天涯