移动端基础

浏览器现状

  • 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 。

常见的移动端屏幕尺寸

1656501267544

  • 注:以上数据均参考自 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 用来衡量打印机等。

1659588896358

物理像素比

  • 物理像素点指的是屏幕显示的最小颗粒,是物理真实存在的。这是厂商在出厂时就设置好了,比如苹果 6\7\8 是 750* 1334
  • 我们开发时候的 1px 不是一定等于 1 个物理像素的
  • PC 端页面,1 个 px 等于 1 个物理像素的,但是移动端就不尽相同
  • 一个 px 的能显示的物理像素点的个数,称为物理像素比或屏幕像素比

1656501267544

  • PC 端 和 早前的手机屏幕 / 普通手机屏幕: 1 CSS 像素 = 1 物理像素的
  • Retina(视网膜屏幕)是一种显示技术,可以将把更多的物理像素点压缩至一块屏幕里,从而达到更高的分辨率,并提高屏幕显示的细腻程度。

1656505788678

移动端调试方法

  • Chrome DevTools(谷歌浏览器)的模拟手机调试
  • 搭建本地 web 服务器,手机和服务器一个局域网内,通过手机访问服务器
  • 使用外网服务器,直接 IP 或域名访问

小结

  • 移动端浏览器我们主要对 webkit 内核进行兼容
  • 我们现在开发的移动端主要针对手机端开发
  • 现在移动端碎片化比较严重,分辨率和屏幕尺寸大小不一
  • 学会用谷歌浏览器模拟手机界面以及调试

PC 端视口

1
2
3
4
console.log(document.documentElement.clientWidth) // 宽度 = 内容区域宽度
console.log(window.innerWidth) // 宽度 = 内容区域 + 滚动条
console.log(window.outerWidth) // 宽度 = 内容区域 + 滚动条 + 浏览器边框
console.log(screen.width) // 宽度 = 当前显示器显示的分辨率的横向值

布局视口

  • 视口( viewport )就是浏览器显示页面内容的屏幕区域。 视口可以分为 布局视口、视觉视口和理想视口

  • 一般移动设备的浏览器都默认设置了一个布局视口,用于解决早期的 PC 端页面在手机上显示的问题。

  • iOS, Android 基本都将这个视口分辨率设置为 980px,所以 PC 上的网页大多都能在手机上呈现,只不过元素看上去很小,一般默认可以通过手动缩放网页。

1656501478263

视觉视口

  • 字面意思,它是用户正在看到的网站的区域。注意:是网站的区域。
  • 我们可以通过缩放去操作视觉视口,但不会影响布局视口,布局视口仍保持原来的宽度。

1656501520825

理想视口

  • 为了使网站在移动端有最理想的浏览和阅读宽度而设定

  • 理想视口,对设备来讲,是最理想的视口尺寸

  • 需要手动添写 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" />

1656505546837

标准的 viewport 设置

  • 视口宽度和设备保持一致
  • 视口的默认缩放比例 1.0
  • 不允许用户自行缩放
  • 最大允许的缩放比例 1.0
  • 最小允许的缩放比例 1.0
  • viewport-fit 设置为 cover 值, 可以解决刘海屏的留白问题

多倍图

  • 对于一张 50px * 50px 的图片,在手机 Retina 屏中打开,按照刚才的物理像素比会放大倍数,这样会造成图片模糊
  • 在标准的 viewport 设置中,使用倍图来提高图片质量,解决在高清设备中的模糊问题
  • 通常使用二倍图, 因为 iPhone 6\7\8 的影响,但是现在还存在 3 倍图, 4 倍图的情况,这个看实际开发公司需求
  • 背景图片 注意缩放问题
1
2
3
4
5
6
7
8
9
10
11
/* 在 iphone8 下,物理像素比为 2  */
img {
/*原始图片100*100px*/
width: 50px;
height: 50px;
}

.box {
/*原始图片100*100px*/
background-size: 50px 50px;
}
  • 尚硅谷:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<style>
.logo {
width: 200px;
height: 200px;
}

/* 当物理像素比最小为 2 时,使用 2 倍图, 区分匹配的先后顺序 */
@media screen and (-webkit-min-device-pixel-ratio: 2) {
.logo {
/* 修改 img 的 src 属性 */
content: url('../img/logo@2x.jpg');
}
}

/* 当物理像素比最小为 3 时,使用 3 倍图, 区分匹配的先后顺序 */
@media screen and (-webkit-min-device-pixel-ratio: 3) {
.logo {
/* 修改 img 的 src 属性 */
content: url('../img/logo@3x.jpg');
}
}
</style>

<img class="logo" src="./img/logo.jpg" alt="" />

背景图缩放

  • background-size 属性规定背景图像的尺寸
  • background-size: 背景图片宽度 背景图片高度;
1
background-size: 100px 100px;
  • 可选值: 长度 | 百分比 | cover | contain;
  • cover : 把背景图像扩展至足够大,以使背景图像完全覆盖背景区域。
  • contain : 把图像图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域

多倍图切图

  • Photoshop 插件 : cutterman

移动端主流方案

    1. 单独移动端页面(主流)
    • 通常情况下,网址域名前面加 m(mobile) 可以打开移动端。通过判断设备,如果是移动设备打开,则跳到移动端页面。

1656510014638

    1. 响应式兼容 PC 移动端
    • 三星电子官网: www.samsung.com/cn/ ,通过判断屏幕宽度来改变样式,以适应不同终端。
    • 缺点:制作麻烦, 需要花很大精力去调兼容性问题
    1. 小结:
    • 现在市场常见的移动端开发有 单独制作移动端页面 和 响应式页面 两种方案
    • 现在市场主流的选择还是单独制作移动端页面

移动端浏览器的兼容性

  • 移动端浏览器基本以 webkit 内核为主,因此我们就考虑 webkit 兼容性问题。
  • 我们可以放心使用 H5 标签和 CSS3 样式。
  • 同时我们浏览器的私有前缀我们只需要考虑添加 webkit 即可

1656510420226

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
2
3
4
/*CSS3盒子模型*/
box-sizing: border-box;
/*传统盒子模型*/
box-sizing: content-box;
  • 传统 or CSS3 盒子模型:
    • 移动端可以全部 CSS3 盒子模型
    • PC 端如果完全需要兼容,我们就用传统模式,如果不考虑兼容性,我们就选择 CSS3 盒子模型
1
2
3
4
5
6
7
8
9
10
11
12
/*CSS3盒子模型*/
box-sizing: border-box;
-webkit-box-sizing: border-box;
/*点击高亮我们需要清除 设置为transparent 完成透明*/
-webkit-tap-highlight-color: transparent;
/*在移动端浏览器默认的外观在iOS上加上这个属性才能给按钮和输入框自定义样式*/
-webkit-appearance: none;
/*禁用长按页面时的弹出菜单*/
img,
a {
-webkit-touch-callout: none;
}

移动端常见布局

    1. 单独制作移动端页面(主流)
    • 流式布局(百分比布局)
    • flex 弹性布局(强烈推荐)
    • less+rem+媒体查询布局
    • 混合布局
    1. 响应式页面兼容移动端(其次)
    • 媒体查询
    • 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
2
3
ele.addEventListener('touchstart', function (e) {
e.preventDefault()
})

点击穿透解决方案二

  • 使背后的元素不具备 click 特性, 给背后的元素添加 touchXXX 事件,代替 click 事件
1
2
3
ele.addEventListener('touchstart', function (e) {
location.href = 'http://www.baidu.com'
})

点击穿透解决方案三

  • 让背后的元素暂时失去 click 事件,300 毫秒左右再复原
1
2
3
4
/*添加CSS样式,不再响应点击事件*/
#anode {
pointer-enents: none;
}
1
2
3
4
5
btn.addEventListener('touchstart', function (e) {
setTimeout(() => {
anode.style.pointerEvents = 'auto' //重新响应点击事件
}, 300)
})

点击穿透解决方案四

  • 延迟隐藏顶层元素
1
2
3
4
5
btn.addEventListener('touchstart', function (e) {
setTimeout(() => {
shade.style.display = 'none'
}, 300)
})