移动端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.mzph.cn/news/57900.shtml

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

相关文章

四川玖璨电子商务有限公司:抖店运营攻略

抖店运营&#xff0c;是指在抖音平台上进行电商销售的一种新型商业模式。随着抖音平台越来越受到年轻人的喜爱和关注&#xff0c;抖店运营正变得越来越重要。那么&#xff0c;抖店运营应该如何做呢&#xff1f;我们来谈谈抖店运营的一些攻略。 第一&#xff0c;选对产品。选择…

什么是住宅ip,静态和动态怎么选?

上文我们介绍了数据中心代理&#xff0c;这次我们来介绍下住宅代理ip&#xff0c;住宅代理ip分类两种类型&#xff1a;静态住宅代理和动态住宅代理&#xff0c;他们有什么区别又能用在什么场景呢&#xff1f;我们先从他们是如何运作开始。 一、什么是住宅代理ip isp住宅代理i…

【java】【springboot】【idea】springboot项目pom.xml 灰色下划线

解决方案&#xff1a; 这里我们找到了原因&#xff0c;就是因为选择了Ignored Files导致pom.xml文件被设置在maven忽略文件清单中&#xff0c;所以我们将打勾的选项取消&#xff0c;点击Apply,然后点击OK

Spark 启动时,报JAVA_HOME is not set

文章目录 1、报错内容2、解决方式3、再次启动Spark集群 1、报错内容 Spark启动时报错&#xff1a; hadoop104: JAVA_HOME is not set2、解决方式 解决方式&#xff1a; 打开启动配置文件 cd /opt/module/spark-standalone/sbin/ vim spark-config.sh配置Java的环境变量 …

clickhouse一次异常排查记录

clickhouse中报错 关闭了自启动&#xff0c;删了status&#xff0c;重启了clickhouse还是报错 1&#xff0c;排查定时执行的脚本日志&#xff08;每小时第5分钟执行&#xff09; INSERT INTO quality0529.previously_reported_urls (url) SELECT url FROM quality0529.hourly_…

javacv基础02-调用本机摄像头并预览摄像头图像画面视频

引入架包&#xff1a; <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.5-1</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId…

null和undefined区别

1.undefined&#xff0c;表示无值。 比如下面场景&#xff1a; a. 变量被声明了&#xff0c;但是没有被赋值&#xff1b; b. 调用函数的时候&#xff0c;应该给函数传参却没有给函数传这个参数打印出来就是 undefined&#xff1b; c. 访问一个对象中没有的属性&#xff1b;…

Ribbon:listOfServers ,${variableName:defaultValue}

解释&#xff1a; 配置了address的地址,请求会走address&#xff0c;也就是http://127.0.0.1:8081&#xff0c;通常用户与别的后端服务进行联调设置为其本地服务的ip。 如果address的地址被注释掉&#xff0c;如下面所示&#xff0c;类似这样的占位符${variableName:defaultVa…

【Terraform学习】使用 Terraform 创建应用程序负载均衡器(Terraform-AWS最佳实战学习)

使用 Terraform 创建应用程序负载均衡器 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_elb 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secret_key…

算法通关村第6关【白银】| 树的层次遍历问题

一、基本层次遍历问题 1.二叉树的层次遍历 思路&#xff1a;使用队列可以很好的保存遍历状态&#xff0c;出队将结点左右子结点入队&#xff0c;用size记录下一层的元素个数&#xff0c;这样就能区分出层了 class Solution {public List<List<Integer>> levelOr…

【数据结构】树与二叉树

文章目录 &#x1f340;树型结构&#x1f431;‍&#x1f464;什么是树型结构&#x1f431;‍&#x1f453;树型结构的概念&#x1f431;‍&#x1f3cd;树的表示形式&#x1f431;‍&#x1f409;树的应用 &#x1f333;二叉树&#x1f431;‍&#x1f464;二叉树的概念&#…

LLM-chatgpt训练过程

流程简介 主要包含模型预训练和指令微调两个阶段 模型预训练&#xff1a;搜集海量的文本数据&#xff0c;无监督的训练自回归decoder&#xff1b; O T P ( O t < T ) O_TP(O_{t<T}) OT​P(Ot<T​)&#xff0c;损失函数CE loss指令微调&#xff1a;在输入文本中加入…

Android获取手机已安装应用列表JAVA实现

最终效果: 设计 实现java代码: //获取包列表private List<String> getPkgList() {List<String> packages new ArrayList<String>();try {//使用命令行方式获取包列表Process p Runtime.getRuntime().exec("pm list packages");//取得命令行输出…

图数据库Neo4j学习五渲染图数据库neo4jd3

文章目录 1.现成的工具2.Neo4j JavaScript Driver3.neovis4.neo4jd34.1neo4jd3和neovis对比4.2获取neo4jd34.3neo4jd3的数据结构4.4Spring data neo4.4.1 定义返回数据格式4.4.1.1NeoResults4.4.1.2GraphVO4.4.1.3NodeVO4.4.1.4ShipVO 4.4.2 SDN查询解析4.4.2.1 Repo查询语句4.…

【Rust日报】2023-08-25 SDXL in Rust,AIGC狂喜!

Stable-Diffusion-XL-Burn&#xff1a;SDXL in Rust 在reddit上看到这个项目 Stable-Diffusion-XL-Burn ,它 是一个基于 Rust 的项目&#xff0c;将stable diffusion xl 移植到了 Rust 深度学习框架 burn 中。在reddit回帖上&#xff0c;已经有小伙伴在热情的尝试&#xff0c;还…

Go测试之.golden 文件

Go测试中的.golden 文件是干什么用的&#xff1f;请举例说明 在Go语言中&#xff0c;.golden文件通常用于测试中的黄金文件&#xff08;golden files&#xff09;。黄金文件是在测试期间记录预期输出结果的文件。测试用例运行时&#xff0c;黄金文件用于比较实际输出与预期输出…

【IMX6ULL驱动开发学习】11.Linux之SPI驱动

参考&#xff1a;驱动程序开发&#xff1a;SPI设备驱动_spi驱动_邓家文007的博客-CSDN博客 目录 一、SPI驱动简介 1.1 SPI架构概述 1.2 SPI适配器&#xff08;控制器&#xff09;数据结构 1.2 SPI设备数据结构 1.3 SIP设备驱动 1.4 接口函数 二、SPI驱动模板 一、SPI驱动…

718. 最长重复子数组

718. 最长重复子数组 原题链接&#xff1a;完成情况&#xff1a;题解&#xff1a;方法一&#xff1a;动态规划方法二&#xff1a;滑动窗口方法三&#xff1a;二分查找 哈希 原题链接&#xff1a; 718. 最长重复子数组 https://leetcode.cn/problems/maximum-length-of-repe…

Android App的设计规范

Android App 设计规范是为开发者和设计师提供的一系列准则和建议&#xff0c;以确保应用在 Android 设备上的外观、交互和用户体验保持一致。以下是一些常见的 Android App 设计规范要点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

Apifox下载安装步骤

我们先访问网址 https://apifox.com/?utm_sourcebaidu&utm_mediumsem&utm_campaign251430236&utm_content7810722111&utm_termapifox%E6%9F%A5%E7%9C%8B%E7%89%88%E6%9C%AC&bd_vid8323327349775096324 然后 这里这个免费下载已经写的这么明显了 那就直接点…