自适应宽_移动端实现自适应缩放界面的方法汇总
作者 | 唐宋元明清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的注入,对服务端渲染机制的一个黑科技~上面的方案完成后,看看效果。然后坑出来了:
项目设置的absolue元素width 100%失效了 -- 可以设置固定的宽度解决
弹框position=fixed位置飞到天边去了 -- 这个无法规避。
网上找到了一篇文章 CSS3 transform对普通元素的N多渲染影响 ,介绍了transform的一堆坑。我这个项目一些布局需要position=fixed,所以tranform不适合~放弃这个坑的其它介绍可以参考下:
transform限制position:fixed的跟随效果
关于在transform下的子元素设置fixed无效的困惑
总结:
position:fixed不支持,所以想做标题栏置顶,上面方案是无法实现的。
ipad有遗留问题:微信浏览器,横竖屏切换时,有些机型在打开一瞬间,横向拖动有空白问题。这个问题无法处理~
以上方案因为使用了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事件、监测微信移动端横竖屏
本文完~
自适应宽_移动端实现自适应缩放界面的方法汇总相关推荐
- antd option宽度自适应_Web移动端实现自适应缩放界面的方法汇总
作者 | 唐宋元明清2188来源 | http://www.cnblogs.com/kybs0/在开发App端的网页时,要适配iphone.ipad.ipod.安卓等各种机型,一般是直接使用em.px ...
- 地图容器自适应浏览器是什么意思_Web移动端实现自适应缩放界面的方法汇总
前端媛猿 读完需要 5分钟 速读仅需 3 分钟 作者 | 唐宋元明清2188来源 | http://www.cnblogs.com/kybs0/在开发App端的网页时,要适配iphone.ipad ...
- 【Web技术】706- 移动端实现自适应缩放界面的方法汇总
作者 | 唐宋元明清2188 来源 | http://www.cnblogs.com/kybs0/ 在开发App端的网页时,要适配iphone.ipad.ipod.安卓等各种机型,一般是直接使用em. ...
- wordpress自适应表格_给WordPress添加自适应表格 让表格自适应屏幕
wordpress自带的表格不能自适应屏幕宽带,每次新建了表格,电脑上显示正常的,结果换到手机上就超出屏幕宽度了,很麻烦,更重要的是很不美观,本次我就问为大家带来一个添加自适应表格的教程. 案列分析 ...
- 怎么退出自适应巡航_吉利ICON ACC自适应巡航系统
随着科技的进步,智能化程度的不断提升,汽车也跟随着科技的脚步不断实现智能化.首先自适应巡航系统(ACC)即是汽车智能化的代表作之一,启停型自适应巡航则是在传统自适应巡航系统上进行的升级. 功能选择 驾 ...
- 移动端页面inputfile打不开_移动端input“输入框”常见问题及解决方法
转自 https://www.cnblogs.com/ljx20180807/p/9837748.html 1. ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱: 当页input存在 ...
- 移动端页面不需要在meta加_移动端适配viewport缩放方案
1. 前言 设计师交付给前端开发一张宽度为750px的视觉稿,设计稿上元素的尺寸.颜色.位置等已做过标注,要求工程师工在适配不同屏幕尺寸的设备时采用等比缩放的方案. 采用viewport缩放的方案能又 ...
- antd 能自适应吗_一种能自适应识别母线运行方式的备自投装置应用探讨
中山供电局的研究人员江清楷,在2019年第8期<电气技术>杂志上撰文,介绍了一种220kV备自投装置,列出了母联备自投和线路备自投的充电条件及起动条件.以220kV逸仙变电站为例,指出该备 ...
- 怎么退出自适应巡航_什么是ACC自适应巡航
2020年10月21日第五课 汽 车 小 课 堂 开课啦 Small Class 随着时代的进步,科技的发展 人们逐渐以智能化科技化为发展方向 生活中已经处处充满了智能科技的味道 包括我们现在所使用的 ...
最新文章
- Maven中的dependencyManagement 意义
- 希尔排序Linux下C实现
- 容器和云服务器集群,什么是docker集群与镜像
- java中的规范是什么意思_Java中的异常规范有什么好处?
- file表单元素怎样设置浏览按钮的样式
- classcastexception异常_让你为之颤抖的Java常见的异常exception
- 生日祝福html_更新,礼包选择,头像框及太子生日金币活动
- mergsort.c
- 使用 JavaScript 下载文件
- 禅道类似软件_推荐几款不错的项目管理软件
- jquery第三章练习三(制作京东常见问题分类页面)
- 【非原创 遥感卫星信息整理汇总-02】国外遥感卫星信息汇总
- android studio项目中将普通文件夹变成moudle
- python 群发邮件数量限制_python群发邮件
- qt MD5 和AES 加密
- rgb到yuv的转换
- 【嵌入式】任意波特率的合理计算——高波特率、低误差
- 山世光:AI产业需要赋能平台
- 计算机网络——(6)网络互联技术与设备
- 密码开锁:浙大版C语言程序设计
热门文章
- mysql删除外键_MySQL删除外键定义的方法
- win7输入密码界面背景怎么更改
- 学习Spring Boot:(十七)Spring Boot 中使用 Redis
- Linux环境下安装Mysql5.7
- 中国为什么不发展民用计算机,为什么大多数人都错估了计算机与AI的发展?
- java打印两个小人_[原创]Java画小人与阶梯问题的解答
- mybatis plus 导出sql_软件更新丨mybatis-plus 3.0.7 发布,辞旧迎新
- 脚手架 mixin (混入)
- linux驱动日志格式,( 转)嵌入式Linux驱动Makefile
- matlab怎么求hadamard,hadamard matlab