自适应宽_移动端实现自适应缩放界面的方法汇总

e617d15e2e402402db2500acba83e0cf.gif

作者 | 唐宋元明清2188来源 | http://www.cnblogs.com/kybs0/在开发App端的网页时,要适配iphone、ipad、ipod、安卓等各种机型,一般是直接使用em、px转em、界面缩放。本章是通过将界面缩放,等比例显示在各机型上。过程中遇到了些问题和大坑~然后下面是具体的自适应实现方式的尝试~

方案一:设置tranform/scale

首先设置内容固定宽度、自动高度(以下举例)
  width: 375px;  height: auto;
通过获取窗口的宽度与固定宽度相除,获得缩放比例
const scaleValue=window.innerWidth / 375
在html层,添加一段script:
添加一段设置zoom值的函数:
 getScript() {    return `      const zoomValue=window.innerWidth / 375;      document.documentElement.style.transform="scale("+zoomValue+")";      document.documentElement.style.transformOrigin="left top";     ;  }
注:以上也可以直接写script,我上面返回一段html是因为项目是通过服务端渲染的。样式的设置必须在界面加载之前,否则会因界面显示变更出现闪现问题。因为添加了服务端渲染,所以无法在界面一开始初始时,无法获取window、document等对象。而上面html的注入,对服务端渲染机制的一个黑科技~上面的方案完成后,看看效果。然后坑出来了:
  1. 项目设置的absolue元素width 100%失效了 -- 可以设置固定的宽度解决

  2. 弹框position=fixed位置飞到天边去了 -- 这个无法规避。

网上找到了一篇文章 CSS3 transform对普通元素的N多渲染影响 ,介绍了transform的一堆坑。我这个项目一些布局需要position=fixed,所以tranform不适合~放弃这个坑的其它介绍可以参考下:
  • transform限制position:fixed的跟随效果

  • 关于在transform下的子元素设置fixed无效的困惑

总结:
  1. position:fixed不支持,所以想做标题栏置顶,上面方案是无法实现的。

  2. ipad有遗留问题:微信浏览器,横竖屏切换时,有些机型在打开一瞬间,横向拖动有空白问题。这个问题无法处理~

  3. 以上方案因为使用了scale,同时窗口的宽高window.innerHeight无法准确获取,需要除以比例,比如: window.innerHeight / (window.innerWidth / 375)

方案二:设置zoom

在上一个方案的基础上,尝试zoom缩放:
 getScript() {return `const zoomValue=window.innerWidth / 375;document.documentElement.style.zoom = zoomValue;;}
emmm,很简单,调试效果看起来很不错。模拟机上,看起来都正常~但是坑来了:真机有问题,发现在ipad的safari上,页面是放大了,但是字段根本就没变化!原因竟然是:苹果在ipad的网页,改动渲染方面的相关规则。有点坑~https://apple.stackexchange.com/questions/377216/css-zoom-does-not-work-ipad-os-v13-latest-safarihttps://stackoverflow.com/questions/7907760/why-the-font-size-wont-change-with-browser-zoom-in实现没办法,我后面尝试,通过userAgent对ipad机型(ipad、macintosh)特殊处理,直接获取所有包含了文字的div、p、span等元素,放大font-size。发现可以处理,没毛病!但是也有些缺陷,没办法在一开始处理字体,因为元素还没有初始化,而等界面加载后再刷字体大小,界面会闪现一次。

方案三:设置viewport-scare

在html中添加默认viewport:
ps:minimal-ui 与本文无关,它可以在safari加载网页时隐藏地址栏与导航栏添加viewport更新:
getScript() { return `const zoomValue=window.innerWidth / 375;var viewport = document.querySelector("meta[name=viewport]");viewport.content="width=device-width,initial-scale="+zoomValue+", maximum-scale="+zoomValue+", minimum-scale="+zoomValue+",user-scalable=no, minimal-ui" ; }
运行代码,emmm,有一些小问题。
  • margin:auto,在某些布局下会让页面偏移 -- 删除就好

  • 设置background-image的区域,背景图片并没有填充满 -- 添加width:100%解决

  • position:fixed,宽高显示有问题 -- 设置固定宽度,比如375px,固定高度;如果需要全屏,可以使用height: 100vh。

fixed布局建议:以弹框为例添加fixed布局的容器,水平竖直方向靠边距离分别设置一个就行了,left:0,bottom:0。然后添加absolute布局的内容容器.如果需要居中,可以在js中设置bottom=window.innerHeight / 2 - 元素的高度/2总结:
  • 以上方案不支持fixed布局,修改完成后,ipad的水平滚动条依然存在,无法解决

兼容适配

采用第二个zoom缩放方案,同时对ipad机型特殊处理,另外采用scale缩放方案。完整代码如下:1. 初始化适配(支持服务端渲染)html-header添加script
{/* app contentAutoFit */} 
自适应可执行代码文本。
  //返回自适应html字符串  getZoomScript() {   return `      const zoomValue = window.innerWidth / 375;      const userAgentInfo = window.clientInformation.appVersion;      //如果是ipad      if (userAgentInfo.indexOf("iPad") != -1 || userAgentInfo.indexOf("Macintosh") != -1) {       //内容自适应 - 设置transform-scale。        //fixed布局时需要修改下left/margin-left等,同时窗口的宽高无法准确获取,需要除以比例,详见windowSizeWithScaleHelper       //ipad有遗留问题:微信浏览器加载时,横竖屏切换一瞬间,有空白问题。不过可以忽略~       document.documentElement.style.transform = "scale(" + zoomValue + "," + (zoomValue < 1 ? 1 : zoomValue) + ")";       document.documentElement.style.transformOrigin = "left top";       var html = document.querySelector("html");       html.style.width = '375px';      html.style.overflow = 'hidden';       html.style.overflowY = 'auto';     } else {       //内容自适应 - 设置zoom。通过zoom来缩放界面,在ipad的safari浏览器等会存在字体无法缩放的兼容问题。       document.documentElement.style.zoom = zoomValue;     }     // 内容自适应 - 设置viewport,整体okay。但是ipad的水平滚动条无法解决     // var viewport = document.querySelector("meta[name=viewport]");     // viewport.content = "width=device-width,initial-scale=" + zoomValue + ", maximum-scale=" + zoomValue + ", minimum-scale=" + zoomValue + ",user-scalable=no, minimal-ui"    `; }
2. 添加加载及界面变更刷新机制
  • 微信浏览器横竖屏切换时,某些机型不会触发窗口大小变更,所以需要额外添加orientationchange监听

  • 加载过程中,微信浏览器切换横竖屏会有显示问题,需要加载完成后适配

 componentDidMount() {      //window.onresize = this.adjustContentAutoFit;      //解决微信横竖屏问题      window.addEventListener("orientationchange", this.adjustContentAutoFit);     //解决加载过程中,切换横竖屏,导致界面没有适配的问题      this.adjustContentAutoFit();    }    componentWillUnmount() {      window.removeEventListener("orientationchange", this.adjustContentAutoFit);   }   //监听窗口尺寸变更,刷新自适应   adjustContentAutoFit() {    const zoomValue = window.innerWidth / 375;     const userAgentInfo = window.clientInformation.appVersion;     //如果是ipad     if (userAgentInfo.indexOf("iPad") != -1 || userAgentInfo.indexOf("Macintosh") != -1) {       //内容自适应 - 设置transform-scale。      //fixed布局时需要修改下left/margin-left等,同时窗口的宽高无法准确获取,需要除以比例,详见windowSizeWithScaleHelper       //ipad有遗留问题:微信浏览器,横竖屏切换时,有些机型在打开一瞬间,有空白问题。不过可以忽略~       document.documentElement.style.transform = "scale(" + zoomValue + "," + (zoomValue < 1 ? 1 : zoomValue) + ")";       document.documentElement.style.transformOrigin = "left top";     var html = document.querySelector("html") as HTMLElement;      html.style.width = '375px';       html.style.overflow = 'hidden';      html.style.overflowY = 'auto';     } else {       // 内容自适应 - 设置zoom。通过zoom来缩放界面,在ipad的safari浏览器等会存在字体无法缩放的兼容问题。       document.documentElement.style.zoom = zoomValue;    }    // 内容自适应 - 设置viewport,整体okay。但是ipad的水平滚动条无法解决     // var viewport = document.querySelector("meta[name=viewport]");     // viewport.content = "width=device-width,initial-scale=" + zoomValue + ", maximum-scale=" + zoomValue + ", minimum-scale=" + zoomValue + ",user-scalable=no, minimal-ui"  }
此方案的一些小遗留问题:
  • ipad不支持position:fixed,所以无法实现标题栏置顶等功能

  • 微信浏览器,横竖屏切换时,有些机型在打开一瞬间,有空白问题

参考:
  • IOS环境下固定定位position:fixed带来的问题与解决方案

  • 小技巧css解决移动端ios不兼容position:fixed属性,无需插件

  • 踩坑路上——IOS Safari浏览器下固定定位position:fixed带来的问题与解决方案

  • iphone safari不支持position fixed的解决办法

  • orientationchange事件、监测微信移动端横竖屏

本文完~98f5de391cf6f2d9e03a52b7ba4b474f.png

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

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

相关文章

Java继承简介

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性&#xff0c;从而减少代码冗余&#xff0c;提高程序运行效率。 Java 中的继承就是在已经存在类的基础上进行扩展&#xff0c;从而产生新的类。已经存在的类称为父类、基类或超类&…

各种说明方法的答题格式_初中语文阅读答题公式 语文阅读理解万能公式大全...

很多人想知道初中语文阅读理解有哪些答题公式&#xff0c;语文阅读理解的万能公式有哪些呢?下面小编为大家介绍一下!初中语文阅读理解答题公式大全(一)某句话在文中的作用&#xff1a;1、文首&#xff1a;开篇点题;渲染气氛(散文)&#xff0c;埋下伏笔(记叙类文章)&#xff0c…

esp8266手机端网络调试助手_esp8266定时控制

要实现定时控制&#xff0c;需要先实现手动控制&#xff0c;或者app控制。实测定时精度&#xff0c;北京时间&#xff0c;误差不超过1秒。第一、远程App控制或手动控制下载esp8266示例程序下载地址: 点击下载本demo 是利用arduino IDE开发&#xff0c;关于arduino IDE 的ESP826…

集成学习之Adaboost(提升方法)

Adaboost 提升方法就是从弱学习器出发&#xff0c;反复学习&#xff0c;得到一系列弱分类器&#xff08;基本分类器&#xff09;&#xff0c;然后组合这些弱分类器&#xff0c;构成一个强分类器。 基本思路 待解决问题 1、每一轮如何改变训练数据的权值或概率分布 2、如何将…

93没有了_杭州1米93程序员征婚贴火了!年薪50万,孩子随妈姓,没有皇位要继承...

文丨三秋桂子自从二胎政策开放以来&#xff0c;很多宝妈都希望二宝能随自己姓&#xff0c;但有些男方家庭却不同意&#xff0c;双方就孩子的“冠名权”一事争论不休。可最近有位小伙却因为征婚贴火了&#xff0c;原因有两个&#xff0c;一是小伙瞩目的身高&#xff0c;二是小伙…

李航《统计学习方法》之HMM隐马尔可夫模型

李航《统计学习方法》之HMM隐马尔可夫模型 文章目录前言一、基本概念1、语言描述&#xff1a;2、符号表示3、基本假设4、例子5、隐马尔可夫模型解决的三个基本问题二、概率计算算法1、向前算法算法&#xff1a;例题2、向后算法三、学习算法1、监督学习算法背景方法2、无监督学习…

6000毫安以上智能手机_展望2021年智能手机市场:这5大技术要爆发

2020年是极不平凡的一年&#xff0c;在黑天鹅、政治动荡等事件的冲击下&#xff0c;许多行业都按下了暂停键&#xff0c;智能手机行业自然也不例外。销售渠道受阻、供应链生产紧张&#xff0c;导致智能手机市场整体出货量呈现持续下跌的状况&#xff0c;严峻的市场行情让智能手…

无监督学习之聚类方法(K-Means、层次聚类)

一、导入 无监督学习中需要对无标记样本进行训练学习进而找到数据的内在性质和逻辑结构&#xff0c;聚类方法是为了为无监督学习的数据分析提供的基础学习方法。 聚类将数据集划分为若干个子集&#xff08;每个子集称为类或者簇&#xff09;&#xff0c;如果一个样本只属于一个…

js调用python接口_JavaScript如何调用Python后端服务

欢迎关注【无量测试之道】公众号&#xff0c;回复【领取资源】, Python编程学习资源干货、 PythonAppium框架APP的UI自动化、 PythonSelenium框架Web的UI自动化、 PythonUnittest框架API自动化、 资源和代码 免费送啦~ 文章下方有公众号二维码&#xff0c;可直接微信扫一扫关注…

详细地图_一目了然:蒙城学区划分详细地图

从明天(8月5日)起&#xff0c;小学一年级&#xff0c;初中一年级可在网上注册、报名了。根据区域内适龄学生人数、学校分布、学校规模、班额规定、交通状况等因素&#xff0c;以街道、路段、门牌号、居住小区、村组等构成要件&#xff0c;按照确保公平和免试就近入学的原则&…

奇异值分解SVD(证明全部省略)

SVD知识梳理一、引入二、SVD的定义、性质定义例题奇异值分解一定存在紧奇异值分解和截断奇异值分解几何解释三、SVD算法计算过程四、SVD与矩阵近似五、python实现六、应用一、引入 主成分分析PCA、潜在语义分析都会用到SVD 不要求A矩阵是方阵&#xff0c;SVD是线性代数中相似对…

jq 比较两个时间是否在同一天_jq: 属性-class

.aadClass() 添加class用法和前面的text方法一样&#xff0c;可以传字符串&#xff0c;可以传函数。值用空格隔开可以增加多个class<.removeClass() 移出class值<他们在一起也可以链式调用。链式调用: 取值的时候返回return结果&#xff0c;赋值返回this,表示可以继续调用…

李航《统计学习方法》之EM算法及其推广

EM算法是一种迭代方法&#xff0c;可以看作用坐标下降法来最大化对数似然估计下界的过程。 一、引入 &#xff08;一&#xff09;算法介绍 1、例题 有三枚硬币&#xff0c;ABC他们出现正面的概率分别是Π&#xff0c;p和q。进行如下投掷实验&#xff1a;先投掷A&#xff0c…

获取选中_【字节】如何实现选中复制的功能

Barnett Demesne公园中在白雪覆盖的山坡上玩耍的一家&#xff0c;北爱尔兰贝尔法斯特(© Stephen Barnes/Alamy)本题摘自于我 github 上的面试每日一题&#xff1a;https://q.shanyue.tech&#xff0c;并有大厂面经及内推信息&#xff0c;可在左下角打开本题原文链接在一些…

c语言 bool_程序的数据要放到哪里呢?|C语言第二篇

在C语言第一篇里我写到了编译器&#xff0c;在这里补充一个点&#xff0c;文本编辑器&#xff0c;编译器&#xff0c;IDE(集成开发环境)的区别。文本编辑器是用作编写普通文字的应用软件&#xff0c;如window的记事本&#xff0c;atom&#xff0c;sublime&#xff0c;它常用来编…

项目职责_项目经理的9个职责

虽说懂技术是项目经理的一个必要项&#xff0c;但事实上&#xff0c;很多技术出身的人&#xff0c;根本干不好项目经理。当项目经理之前&#xff0c;是活儿管你&#xff0c;让你干什么你就干什么&#xff0c;只对任务结果负责&#xff0c;对整体目标不负责。当项目经理之后&…

jenkins 安装插件失败_Jenkins 自动化安装插件

手工安装 Jenkins 插件的方法通常&#xff0c;我们有两种方法安装 Jenkins 插件。第一种方法是到 Jenkins 插件管理页面搜索插件&#xff0c;然后安装。第二种方法是上传 Jenkins 插件的 hpi 文件安装。这两种方法能满足大多数人的需求。第一种方法&#xff0c;如下图所示&…

anaconda下python中matplotlib画图无法显示中文

第一步&#xff1a;在自己电脑里选择喜欢的字体&#xff0c;搜索位置为C:\Windows\Fonts&#xff0c;我选择的是SimSun 第二步 查找Matplotlib默认字体目录 打开anaconda prompt,输入python&#xff0c;接下来进入查找过程 查找代码如下 import matplotlib print(matplotlib.…

Python编程及高级数据分析

一、介绍&#xff08;11月22日&#xff09; 小问题找函数 大问题找包 python数据分析常用的包 数据库实现的功能的在panda包里面找 其中M\S\P是数据可视化工具 深度学习使用的包是pytorch(facebook支持) 中文的nlp&#xff1a;Jieba、pynlpir 英文的nlp:NLTK 学python前的准…

helm安装_Helm部署和体验jenkins

运行在Kubernetes上的Jenkins下图来自rancher官方博客&#xff0c;在kubernetes环境下&#xff0c;jenkins任务被交给各个pod执行&#xff0c;这些pod在需要时被创建&#xff0c;任务结束后被销毁&#xff0c;这样既能合理利用资源&#xff0c;又能给每个任务提供一致的干净的初…