移动端
说说移动端的适配
-
设置meta的viewport
- 由于移动端会自动缩放页面,所以我们需要加入meta标签,使到页面不准缩放
-
布局使用rem、vw/vh 适配 以及 flex弹性布局
-
1px边框像素的问题
rem的缺点:
- 必须通过js来动态控制根元素
font-size的大小,可能会导致css样式和js代码耦合性
vw的缺点:
- vw虽然好用,因为相对于视口,所以失去了最大宽度/高度的限制
- 宽屏上看到完美,竖屏上就不忍直视了布局会出问题。这时需要你额外为元素添加最大宽度/高度来限制
rem响应式布局原理
rem 是相对于根元素 html 的 font-size 来做计算。通常在页面初始化时加载时通过对 document.documentElement.style.fontSize 设置来实现。
- 分辨率为1920px*1080px(1920px就是纵向,1080px就是横向了)
(function (doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function () {
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
//1080是自己当前电脑的屏幕分辨率像素,便于开发
var size = 10 * (clientWidth / 1080)
if(size<12){
size = 12
}
docEl.style.fontSize = size + 'px';
console.log(clientWidth)
};
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);
H5是什么?
H5 技术是一系列移动端 web 前端技术的集合
H5 技术本身是用于移动端的 web 网页。由于 App 本身有个 “ webview ” 的容器,在容器里可以运行 Web 前端相关代码,由此 H5 和原生 App 结合又衍生出来了 Hybrid App 技术。
H5和原生app的区别
原生app
原生App 优点
⊙ 比移动Web App运行快 ⊙ 一些商店与卖场会帮助用户寻找原生App ⊙ 官方卖场的应用审核流程会保证让用户得到高质量以及安全的App ⊙ 官方会发布很多开发工具或者人工支持来帮助你的开发
原生App 缺点
⊙ 开发成本高,尤其是当需要多种移动设备来测试时 ⊙ 因为是不同的开发语言,所以开发,维护成本也高 ⊙ 因为用户使用的App版本不同,所以你维护起来很困难 ⊙ 官方卖场审核流程复杂且慢,会严重影响你的发布进程
H5
H5 App 优点
⊙ 开发成本低
⊙ 从移动设备上的浏览器访问 ⊙ 不需要安装额外的软件 ⊙ 软件更新只需要服务器就够了
H5 App 缺点 ⊙ 无法使用很多移动硬件设备的独特功能 ⊙ 要同时支持多种移动设备的浏览器让开发维护的成本也不低 ⊙ 如果用户使用更多的新型浏览器,那问题就更不好处理了 ⊙ 对于用户来说,这种App很难被用户发现
移动端注意问题
参考:https://blog.51cto.com/u_9886022/1900575
1、autocomplete自动补全问题
- 输入框里的autocomplete自动完成功能,在电脑浏览器可能会出现,但是在手机真机上是不会出现的!
3、实现上拉加载:
- 一般做法是: 页码pageNum叠加,列表数据与之前数据进行合并
上拉加载一般是页面滚动到底部时触发,也可以选择在滚动到一定位置的时候触发。
以滚动到一定位置为例。实现原理是分别获得当前滚动条的scrollTop值、当前可视范围的高度值clientHeight以及文档的总高度scrollHeight。当scrollHeight - (scrollTop+clientHeight)小于一定值时,开始加载数据并添加到页面上。
- 滚动高度 - (滚动条顶部高度 + 可视高度)小于一定值时,开始加载数据
4、实现下拉刷新
1.监听原生touchstart事件,记录其初始位置的值;
2.监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值在Y轴上的差值,作为滑动的距离, 并借助CSS3的translateY属性使元素跟随手势向下滑动对应的差值;同时根据滑动的距离显示不同的文本信息, 例如"下拉刷新"->"释放立即更新";
3.监听原生touchend事件,如果滑动的距离小于设定的最小移动距离就取消加载, 否则进行加载操作; 同时将translateY重设为0,元素回到初始位置。
5、100vh在ios(safari)浏览器和ios的chrome浏览器问题
100vh 在safari和chrome浏览器中,100vh是指去掉地址栏和工具的高度,所以会出现滚动条。 解决办法:
1、使用window.innerHeight替代100vh
2、动态设置页面高度
const convertStyle = () => {
document.body.style.setProperty('height', `${window.innerHeight}px`);
}
window.addEventListener("resize", convertStyle);
window.addEventListener("DOMContentLoaded", convertStyle);
3、判断是否是苹果浏览器,然后去减掉工具栏高度
- /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)
if(/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)){
localStorage.setItem('isSafari',1)
}else{
localStorage.setItem('isSafari',0)
}
4、使用vh-check库
6、String.replaceAll()兼容问题
-
低版本浏览器、以及安卓浏览器不支持
-
解决:使用replace()正则来替代
7、底部安全区域横线适配 【iphoneX以上型号】
底部tabbar横线适配
在钉钉打开h5,底部tabbar没有问题,在钉钉可能自动适配了,在微信浏览器等其他浏览器需要自己去适配
通过css去设置:
viewport-fit-descriptor env() 和 constant() iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
第一步:设置网页在可视窗口的布局方式 新增 viweport-fit 属性,使得页面内容完全覆盖整个窗口:
H5网页设置viewport-fit=cover的时候才生效,小程序里的viewport-fit默认是cover
<meta name="viewport" content="width=device-width, viewport-fit=cover">
js如何获取底部安全区域是多少?
- 利用css变量
env()和constant(),是IOS11新增特性,Webkit的css函数,用于设定安全区域与边界的距离,有4个预定义变量:
- safe-area-inset-left:安全区域距离左边边界的距离
- safe-area-inset-right:安全区域距离右边边界的距离
- safe-area-inset-top:安全区域距离顶部边界的距离
- safe-area-inset-bottom :安全距离底部边界的距离
constant:兼容 IOS<11.2
env: 兼容 IOS>11.2
:root {
// iOS < 11.2
--sat: constant(safe-area-inset-top);
--sar: constant(safe-area-inset-right);
--sab: constant(safe-area-inset-bottom);
--sal: constant(safe-area-inset-left);
// iOS >= 11.2
--sat: env(safe-area-inset-top);
--sar: env(safe-area-inset-right);
--sab: env(safe-area-inset-bottom);
--sal: env(safe-area-inset-left);
}
在JavaScript中,通过以下方法,读取到css自定义变量
- 注意:返回的是带有px单位的
getComputedStyle(document.documentElement).getPropertyValue("--sat")
统一处理底部tabbar安全区域
// 统一处理tabbar安全区域
.taro-tabbar__tabbar-bottom {
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
margin-bottom: 0px;
}
8、1px像素问题
UI给你设计稿的时候标注这个边框是 1px,认真的前端直接在代码上写 border:1px,结果发现在有的手机中,1px会比实际效果粗.
为什么会有1px的问题
1px不是一定会出现的,比如pc基本不会出现,移动端有的手机也可能不会出现
像素 :指在由一个数字序列表示的图像中的一个最小单元,单位是 px,不可再次分割了。 设备像素比(DPR): 设备像素比 = 设备像素 / CSS像素。
window.devicePixelRatio=物理像素 /CSS像素
解决方案
-
viewport+rem
-
border-image
缺点:
- 修改颜色麻烦, 需要替换图片
-
box-shadow模拟边框
缺点:
- 边框有阴影
-
transform: scale(0.5) + 伪元素 模拟的方式
9、window.btoa 某些手机不兼容
- window.btoa生成二进制有些手机不兼容,可使用Base64库来解决
10、移动端浏览器高度问题
-
避免使用100vh
-
移动浏览器(Chrome和Safari)有一个“帮助”功能,地址栏有时可见,有时隐藏,改变了视口的可见大小。这些浏览器没有将
100vh的高度调整为视口高度变化时屏幕的可见部分,而是将100vh设置为隐藏地址栏的浏览器高度 -
当不展示地址栏时,浏览器的
100vh为屏幕可视区的高度,当展示地址栏时,顶部地址栏占了高度 -
100vh=当前视口可见高度,工具栏、地址栏的高度是不包含在100vh里面的
-
-
可使用
window.innerHeight