学习 中高级前端必须注意的40条移动端H5坑位指南 | 网易三年实践
1.调用系统功能
a标签能快速调用移动设备电话/短信/邮件功能,input标签可快速调用移动设备相册文件
<!-- 拨打电话 --> <a href="tel:10086">拨打电话给10086小姐姐</a> <!-- 发送短信 --> <a href="sms:10086">发送短信给10086小姐姐</a> <!-- 发送邮件 --> <a href="mailto:[email protected]">发送邮件给JowayYoung</a> <!-- 选择照片或拍摄照片 --> <input type="file" accept="image/*"> <!-- 选择视频或拍摄视频 --> <input type="file" accept="video/*"> <!-- 多选文件 --> <input type="file" multiple>
2.忽略自动识别
屏蔽部分浏览器对数字字母识别为电话/邮箱
<!-- 忽略自动识别电话 --> <meta name="format-detection" content="telephone=no"> <!-- 忽略自动识别邮箱 --> <meta name="format-detection" content="email=no"> <!-- 忽略自动识别电话和邮箱 --> <meta name="format-detection" content="telephone=no, email=no">
3.弹出数字键
使用<input type="tel">
弹起数字键盘会带上#
和*
,适合输入电话。推荐使用<input type="number" pattern="\d*">
弹起数字键盘,适合输入验证码等纯数字格式。
<!-- 纯数字带#和* --> <input type="tel"> <!-- 纯数字 --> <input type="number" pattern="\d*">
4.唤醒原生应用
通过location.href
与原生应用建立通讯渠道,这种页面与客户端的通讯方式称为URL Scheme,其基本格式为scheme://[path][?query]
- scheme:应用标识,表示应用在系统里的唯一标识
- path:应用行为,表示应用某个页面或功能
- query:应用参数,表示应用页面或应用功能所需的条件参数
URL Scheme
一般由前端与客户端共同协商。唤醒原生应用的前提是必须在移动设备里安装了该应用,有些移动端浏览器
即使安装了该应用也无法唤醒原生应用,因为它认为URL Scheme
是一种潜在的危险行为而禁用它,像Safari
和微信浏览器
。还好微信浏览器
可开启白名单让URL Scheme
有效。
若在页面引用第三方原生应用的URL Schema
,可通过抓包第三方原生应用获取其URL
。
<!-- 打开微信 --> <a href="weixin://">打开微信</a> <!-- 打开支付宝 --> <a href="alipays://">打开支付宝</a> <!-- 打开支付宝的扫一扫 --> <a href="alipays://platformapi/startapp?saId=10000007">打开支付宝的扫一扫</a> <!-- 打开支付宝的蚂蚁森林 --> <a href="alipays://platformapi/startapp?appId=60000002">打开支付宝的蚂蚁森林</a>
5.禁止页面缩放
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
6.禁止页面缓存
<meta http-equiv="Cache-Control" content="no-cache">
7.禁止输入框字母大写
<input autocapitalize="off" autocorrect="off">
8.Safari相关配置
<!-- 设置Safari全屏,在iOS7+无效 --> <meta name="apple-mobile-web-app-capable" content="yes"> <!-- 改变Safari状态栏样式,可选default/black/black-translucent,需在上述全屏模式下才有效 --> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- 添加页面启动占位图 --> <link rel="apple-touch-startup-image" href="pig.jpg" media="(device-width: 375px)"> <!-- 保存网站到桌面时添加图标 --> <link rel="apple-touch-icon" sizes="76x76" href="pig.jpg"> <!-- 保存网站到桌面时添加图标且清除默认光泽 --> <link rel="apple-touch-icon-precomposed" href="pig.jpg">
9.其他浏览器一些兼容配置
<!-- 强制QQ浏览器竖屏 --> <meta name="x5-orientation" content="portrait"> <!-- 强制QQ浏览器全屏 --> <meta name="x5-fullscreen" content="true"> <!-- 开启QQ浏览器应用模式 --> <meta name="x5-page-mode" content="app"> <!-- 强制UC浏览器竖屏 --> <meta name="screen-orientation" content="portrait"> <!-- 强制UC浏览器全屏 --> <meta name="full-screen" content="yes"> <!-- 开启UC浏览器应用模式 --> <meta name="browsermode" content="application"> <!-- 开启360浏览器极速模式 --> <meta name="renderer" content="webkit"
10.让:active有效,让:hover无效
有些元素的:active
可能会无效,而元素的:hover
在点击后会一直处于点击状态,需点击其他位置才能解除点击状态。给<body>
注册一个空的touchstart事件
可将两种状态反转。
<body ontouchstart></body>
11.自动适应布局
针对移动端,通常结合JS依据屏幕宽度
与设计图宽度
的比例动态声明<html>
的font-size
,以rem
为长度单位声明所有节点的几何属性,这样就能做到大部分移动设备的页面兼容,兼容出入较大的地方再通过媒体查询
做特别处理。将rem布局比例
设置成1rem=100px
,即在设计图上100px
长度在CSS代码上使用1rem
表示
function AutoResponse(width = 750) { const target = document.documentElement; if (target.clientWidth >= 600) { target.style.fontSize = "80px"; } else { target.style.fontSize = target.clientWidth / width * 100 + "px"; } } AutoResponse(); window.addEventListener("resize", () => AutoResponse());
还可依据屏幕宽度
与设计图宽度
的比例使用calc()
动态声明<html>
的font-size
html { font-size: calc(100vw / 7.5); }
若以iPad Pro
分辨率1024px
为移动端和桌面端的断点,还可结合媒体查询
做断点处理。1024px
以下使用rem布局
,否则不使用rem布局
@media screen and (max-width: 1024px) { html { font-size: calc(100vw / 7.5); } }
12.自动适应背景
.elem { width: 1rem; height: 1rem; background: url("pig.jpg") no-repeat center/100% 100%; }
13.监听屏幕旋转
/* 竖屏 */ @media all and (orientation: portrait) { /* 自定义样式 */ } /* 横屏 */ @media all and (orientation: landscape) { /* 自定义样式 */ }
14.支持弹性滚动
在苹果系统上非<body>
元素的滚动操作可能会存在卡顿,但安卓系统不会出现该情况。通过声明overflow-scrolling:touch
调用系统原生滚动事件优化弹性滚动
,增加页面滚动的流畅度。
body { -webkit-overflow-scrolling: touch; } .elem { overflow: auto; }
15.禁止滚动传播
与桌面端浏览器
不一样,移动端浏览器
有一个奇怪行为。当页面包含多个滚动区域时,滚完一个区域后若还存在滚动动量则会将这些剩余动量传播到下一个滚动区域,造成该区域也滚动起来。这种行为称为滚动传播。
若不想产生这种奇怪行为可直接禁止。
.elem { overscroll-behavior: contain; }
16.禁止屏幕抖动
对于一些突然出现滚动条的页面,可能会产生左右抖动的不良影响。在一个滚动容器里,打开弹窗就隐藏滚动条,关闭弹窗就显示滚动条,来回操作会让屏幕抖动起来。提前声明滚动容器的padding-right
为滚动条宽度,就能有效消除这个不良影响。每个移动端浏览器
的滚动条宽度都有可能不一致,甚至不一定占位置,通过以下方式能间接计算出滚动条的宽度。100vw
为视窗宽度,100%
为滚动容器内容宽度,相减就是滚动条宽度,妥妥的动态计算
body { padding-right: calc(100vw - 100%); }
17.禁止长按动作
有时不想用户长按元素呼出菜单进行点链接
、打电话
、发邮件
、保存图片
或扫描二维码
等操作,声明touch-callout:none
禁止用户长按操作。
有时不想用户复制粘贴
盗文案,声明user-select:none
禁止用户长按操作和选择复制。
* { /* pointer-events: none; */ /* 微信浏览器还需附加该属性才有效 */ user-select: none; /* 禁止长按选择文字 */ -webkit-touch-callout: none; }
但声明user-select:none
会让<input>
和<textarea>
无法输入文本,可对其声明user-select:auto
排除在外。
input, textarea { user-select: auto; }
18.禁止字体调整
旋转屏幕可能会改变字体大小,声明text-size-adjust:100%
让字体大小保持不变。
* { text-size-adjust: 100%; }
19.禁止高亮显示
* { -webkit-tap-highlight-color: transparent; }
20.禁止动画闪屏
在移动设备上添加动画,多数情况会出现闪屏,给动画元素的父元素构造一个3D环境
就能让动画稳定运行了。
.elem { perspective: 1000; backface-visibility: hidden; transform-style: preserve-3d; }
21.去除默认表单样式
button, input, select, textarea { appearance: none; /* 自定义样式 */ }
22.美化滚动占位
::-webkit-scrollbar { width: 6px; height: 6px; background-color: transparent; } ::-webkit-scrollbar-track { background-color: transparent; } ::-webkit-scrollbar-thumb { border-radius: 3px; background-image: linear-gradient(135deg, #09f, #3c9); }
23.美化输入占位
input::-webkit-input-placeholder { color: #66f; }
24.对齐输入占位
有强迫症的同学总会觉得输入框文本位置整体偏上,感觉未居中心里就痒痒的。桌面端浏览器
里声明line-height
等于height
就能解决,但移动端浏览器
里还是未能解决,需将line-height
声明为normal
才行。
input { line-height: normal; }
25.对齐下拉选项
下拉框选项默认向左对齐,是时候改改向右对齐了。
select option { direction: rtl; }
26.修复点击无效
在苹果系统上有些情况下非可点击元素监听click事件
可能会无效,针对该情况只需对不触发click事件
的元素声明cursor:pointer
就能解决。
.elem { cursor: pointer; }
27.识别文本换行
多数情况会使用JS换行文本,那就真的Out
了。若接口返回字段包含\n
或<br>
,千万别替换掉,可声明white-space:pre-line
交由浏览器做断行处理。
* { white-space: pre-line; }
28.识别文本换行
若接口返回字段包含\n
或<br>
,千万别替换掉,可声明white-space:pre-line
交由浏览器做断行处理。
* { white-space: pre-line; }
29.开启硬件加速
.elem { transform: translate3d(0, 0, 0); /* transform: translateZ(0); */ }
30.画1px边框
高清设备的一个像素点并不等于一个物理像素,一个css像素会被渲染成多个物理像素,从而看起来不清晰
处理:a.tranform进行缩放
.elem { position: relative; width: 200px; height: 80px; &::after { position: absolute; left: 0; top: 0; border: 1px solid #f66; width: 200%; height: 200%; content: ""; transform: scale(.5); transform-origin: left top; } }
b.图片或者svg代替
c.使用 box-shadow 模拟边框
标签:浏览器,坑位,height,注意事项,滚动,移动,声明,CSS,页面 From: https://www.cnblogs.com/foxing/p/17803858.html