移动端h5项目的兼容和适配问题

解决兼容性问题的关键在于对移动端产品的生存环境进行梳理,在此基础之上制定应对策略。

所谓生存环境主要分为三个维度:
硬件环境,细分为品牌和机型,决定了屏幕大小、性能等硬件限制
操作系统,比如iOS6和iOS7,或者安卓各家的定制系统的不同版本
浏览器,主要分为App容器,原生浏览器,各品牌浏览器

为什么要做页面适配?
不同机型的屏幕尺寸、物理像素和逻辑像素都有差异,而ui 的尺寸一一般是固定的,如果都使用px的写法,会导致不同手机上样式的错乱。
在这里插入图片描述

如何做页面适配?
什么是像素?像素(Pel,pixel;pictureelement),为组成一幅图像的全部亮度和色度的最小图像单元。单位面积内的像素越多,图像的效果就越好。
什么叫分辨率呢? 屏幕分辨率是指纵横向上的像素点数,单位是px。屏幕分辨率高时(例如 1600 x 1200),在屏幕上显示的像素多,单个像素尺寸比较小.
不同系统的不同浏览器对小数点的px有不同的处理,例如:手机上观察iOS的Chrome会画出0.5px的边,而安卓(5.0)原生浏览器是不行的。所以如果我们把单位设置成小数的px包括宽高等,其实不太可靠,因为不同浏览器表现不一样。

最早的解决方案:rem
rem(font size of the root element)是CSS3新增的一个相对单位,是指相对于根元素的字体大小的单位。flexible 的原理就是这个。

const scale = root.clientWidth / 10  设备视口宽度,例如375px
root.style.fontSize = scale + 'px'   可自定义根元素的比例,1rem = 37.5px
后续使用的时候,需要转为rem , 可以和less配合使用
/*rem.less*/
@device-width: 375; /*设备布局视口*/
@rem: (@device-width/10rem);

由于viewport单位得到众多浏览器的兼容,lib-flexible这个过渡方案已经可以放弃使用,不管是现在的版本还是以前的版本,都存有一定的问题。建议大家开始使用viewport来替代此方。

解决方案二:vw、vh适配
vw(Viewport Width)、vh(Viewport Height)是基于视图窗口的单位,是css3中提出来的,基于视图窗口的单位。
vh、vw方案即将视觉视口宽度 window.innerWidth和视觉视口高度 window.innerHeight 等分为 100 份。
如果按视觉视口为375px,那么1vw = 3.75px,这时UI给定一个元素的宽为75px(设备独立像素),我们只需要将它设置为75 / 3.75 = 20vw

// 还是rem.less 我们加一个@vw变量
@device-width: 375;
@rem: (@device-width/10rem);
@vw: (100vw/@device-width);

解决方案三:viewport+PX
这种方案可以让我们在开发时不用关注设备屏幕尺寸的差异,直接按照设计稿上的标注进行开发,也无需单位的换算,直接用px。
在 HTML 的 head 标签里加入

<meta name="viewport" content="width={设计稿宽度}, initial-scale={屏幕逻辑像素宽度/设计稿宽度}" > 。export function initViewport() {const width = 375;  // 设计稿宽度const scale = window.innerWidth / width// console.log('scale', scale)let meta = document.querySelector('meta[name=viewport]')let content = `width=${width}, init-scale=${scale}, user-scalable=no`if(!meta) {meta = document.createElement('meta')meta.setAttribute('name', 'viewport')document.head.appendChild(meta)}meta.setAttribute('content', content)
}

自适应布局方案:
1、媒体查询
2、flex

 @media screen and (min-device-width:800px) {.div div {width: 33.3%;}}

遇到的兼容性问题记录:
问题一 、
自动播放: ios safariiPhone Safari中不支持,但在webview中可能被开启;iOS开发文档明确说明蜂窝网络下不允许autoplay;
chrome中,设置mouted后可以自动播放
微信中不允许自动播放。但是可以借助WeixinJSBridge实现

单例问题
ios safari中的音频对象是单例的,ios中是无法播放多个音频文件的
循环播放
ios部分机型不支持循环播放
解决方案:监听播放完成事件ended,手动触发播放

<!doctype html>
<html>
<head><title>Looping Audio</title><script type="text/javascript">function init() {var myAudio = document.getElementById("audio");myAudio.addEventListener('ended', loopAudio, false);}function loopAudio() {var myAudio = document.getElementById("audio");myAudio.play();}</script>
</head>
<body onload="init();"><audio id="audio" src="myAudio.m4a" controls></audio>
</body>
</html>

问题二 、video 的 preload,ios下是不支持的。
通用的方法是对视频进行play()后立即停止
ios视频自动全屏播放:设置内联属性playsinline webkit-playsinline

问题三 、Android浏览器下line-height垂直居中为什么会偏离?
原因:
推测可能是Android在排版计算的时候参考了primyfont字体的相关属性(即HHead Ascent、HHead Descent等),而primyfont的查找是看font-family里哪个字体在fonts.xml里第一个匹配上,而原生Android下中文字体是没有family name的,导致匹配上的始终不是中文字体,所以解决这个问题就要在font-family里显式申明中文,或者通过什么方法保证所有字符都fallback到中文字体

作者:虎三刀
链接:https://juejin.cn/post/7103835385280593957
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
ios 的不存在这个情况。安卓下低于12px都会出现渲染上浮的情况
display: flex;
align-items: center;

问题四 、安卓部分版本input的placeholder偏上
input的line-height设为normal
input{
line-height:normal;
}

问题五、ios日期转换NAN问题
具体就是,new Date(‘2020-11-12 00:00:00’)在ios中会为NAN
决绝方案:用new Date(‘2020/11/12 00:00:00’)的日期格式,或者写个正则转换

问题六、windo.open 实现在ios上非用户触发得被拦截
修改交互

问题七、input上传文件multitype在安卓机上存在兼容问题,图片可以选择多个,文件只能选一个(使用企微的api解决,原生能力)

问题八、ios手机上将图片转成base64失败
原因:
转换需要给图片设置允许跨域,但是在ios手机上允许跨域和给src赋值有顺序的区别,在chrome模拟没顺序问题
解决方案:
先给Image对象设置允许跨域,再给Image对象的src赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88113.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:101-120)

第101题 可用于多种路由协议,由 ​​if-match​​​和 ​​apply​​子句组成的路由选择工具是 A、​​route-policy​​ B、​​IP-Prefix​​ C、​​commnityfilter​​ D、​​as-path-filter​​ 答案&#xff1a;A 解析&#xff1a; Route-policy&#xff08;路由策…

理虚实一体化全栈全场景云计算应用实训室解决方案

一、 云计算应用统概述 云计算应用系统是指基于云计算技术构建的应用系统&#xff0c;它将软件、数据、计算和存储资源部署在云服务器上&#xff0c;通过网络根据应用按照一定策略为用户提供相关服务。云计算应用系统广泛应用于各个领域&#xff0c;包括但不限于金融、教育、政…

Android Gradle 同步优化

作者&#xff1a;究极逮虾户 很多人听到方法论三个字&#xff0c;就觉得我要开始pua&#xff0c;说我阿里味&#xff0c;但是我觉得这个查问题的方式可能会对大家有点帮助。 很多人都会有这样的困扰&#xff0c;给你的一个工作内容是一个你完全陌生的东西&#xff0c;第一选择…

vue中解决ajax跨域问题(no “access-control-allow-origin”)

文章目录 跨域报错信息产生原因举例解决方法方式一优缺点方式二优缺点 跨域报错信息 产生原因 跨域是是因为浏览器的同源策略限制&#xff0c;是浏览器的一种安全机制&#xff0c;服务端之间是不存在跨域的。 所谓同源指的是两个页面具有相同的协议、主机和端口&#xff0c;三…

【Qt学习】05:自定义封装界面类

OVERVIEW 自定义封装界面类1.QListWidget2.QTreeWidget3.QTableWidget4.StackedWidget5.Others6.自定义封装界面类-显示效果&#xff08;1&#xff09;添加设计师界面类&#xff08;2&#xff09;在ui中设计自定义界面&#xff08;3&#xff09;在需要使用的界面中添加&#xf…

深入分析负载均衡情景

本文出现的内核代码来自Linux5.4.28&#xff0c;为了减少篇幅&#xff0c;我们尽量不引用代码&#xff0c;如果有兴趣&#xff0c;读者可以配合代码阅读本文。 一、有几种负载均衡的方式&#xff1f; 整个Linux的负载均衡器有下面的几个类型&#xff1a; 实际上内核的负载均衡…

激活潜能:探索职场中的自我效能感之道

引言&#xff1a;自我效能感的定义与重要性 自我效能感&#xff0c;简而言之&#xff0c;是个体对自己能够成功完成某项任务的信心。这种信心不仅影响我们的思考方式和情感&#xff0c;还影响我们的行为和动机。在职场中&#xff0c;高自我效能感的人往往更有动力&#xff0c;…

智能工厂移动式作业轻薄加固三防平板数据采集终端

在这个高度自动化和数字化的环境中&#xff0c;数据采集变得尤为重要。为了满足这个需求&#xff0c;工业三防平板数据采集终端应运而生。工业三防平板数据采集终端采用了轻量级高强度镁合金材质&#xff0c;这使得它在保持轻薄的同时具有更强的坚固性。这种材质还具有耐磨防损…

lab9 fs

文章目录 Large filestaskhints思路 Symbolic linkstaskhints思路sys_symlinksys_open Large files 目标&#xff1a;11256256*256个block inode的格式在fs.h的struct dinode中被定义&#xff0c;你需要特别注意以下几点 NDIRECTNINDIRECTMAXFILEaddrs[] 在磁盘上找一个文件…

ChatGPT癌症治疗“困难重重”,真假混讲难辨真假,准确有待提高

近年来&#xff0c;人工智能在医疗领域的应用逐渐增多&#xff0c;其中自然语言处理模型如ChatGPT在提供医疗建议和信息方面引起了广泛关注。然而&#xff0c;最新的研究表明&#xff0c;尽管ChatGPT在许多领域取得了成功&#xff0c;但它在癌症治疗方案上的准确性仍有待提高。…

如何将储存在Mac或PC端的PDF文件传输到移动设备呢?

iMazing是一款iOS设备管理软件&#xff0c;用户借助它可以将iPad或iPhone上的文件备份到PC或Mac上&#xff0c;还能实现不同设备之间的文件传输&#xff0c;能很大程度上方便用户进行文件管理。 在阅读方面&#xff0c;iPad和iPhone是阅读PDF的优秀选择&#xff0c;相较于Mac或…

如何制作党建专题汇报片

通过展示党组织的凝聚力和战斗力&#xff0c;增强党员的组织归属感和团结合作意识。通过宣传片&#xff0c;可以加强党组织的凝聚力&#xff0c;推动党的事业发展。制作党建专题汇报片需要一定的前期准备和后期制作技巧。下面是由深圳党建专题汇报片制作公司老友记小编为您整理…