问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

HTML5可以实现夸屏适应?

发布网友 发布时间:2022-05-12 01:20

我来回答

3个回答

懂视网 时间:2022-05-12 05:42

本文主要和大家介绍了html5 分层屏幕适配的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

屏幕适配

屏幕适配应当指内容 适配区 和 屏幕区 间的适配关系。

单屏适配有 contain、cover 或 fill,多屏常见是 依宽 。

contain 和 cover 还需要 定位 来处理留白和超出的内容。

而同一个 H5 里不同内容往往用不同适配方式,即 分层。

优选CSS

  1. 页面加载后 js 往往需要延时至少 70ms 才能获取正确的 webview 宽高

  2. css 往往最先执行,且 cssom 的解析往往和 dom 在最开始并行构建

  3. js 会等待 dom 和 cssom 处理完后才能执行,而 css 只需等待 dom

  4. 相比 js 在切换横竖屏时要切换 2 次进程来重绘,css 无需切换

对于屏幕适配这类表现问题,能用 css 实现就应该用 css 实现。

整层适配

为确保各层元素同步缩放,不走样,每层的 适配区 应当等于设计稿大小。

直接的实现就是构造和 适配区 一样尺寸的 容器, 整层适配。

容器 内可以有若干个相同适配方式的 元素。

svg 实现为例:


<!doctype html>
<html>
<body>
<style>
.layer {
 position: absolute;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
}
</style>
<!-- fill -->
<svg class="layer" viewBox="0 0 1080 1920" preserveAspectRatio="none"> <!-- 容器 -->
 <rect x="0" y="0" width="1080" height="1920" fill="rgba(96,96,96,.08)"/> <!-- 元素 -->
</svg>
<!-- contain 居中 -->
<svg class="layer" viewBox="0 0 1080 1920" preserveAspectRatio="xMidYMid meet"> <!-- 容器 -->
 <rect x="0" y="233" width="1080" height="1407" fill="#1565C0"/> <!-- 元素 -->
</svg>
<!-- contain 居底 -->
<svg class="layer" viewBox="0 0 1080 1920" preserveAspectRatio="xMidYMax meet"> <!-- 容器 -->
 <rect x="444" y="1779" width="191" height="39" fill="#1565C0"/> <!-- 元素 -->
</svg>
</body>
</html>

实际效果:

整层适配 实现简单,开发时直接读取设计稿值,可以满足大部分静态页面需求。

但在 h5 动画多的时候,就得考虑动画流畅,页面性能了。

用可替换元素如 <img> <object> <svg> 等做 容器,以及用背景图做 元素 的,

在应用 css 动画时有性能缺陷:

  1. 对 容器 内 元素 应用 css 动画会造成频繁重排和重绘,导致卡顿。

  2. 将和 适配区 尺寸相同的 容器 提升为合成层时所占内存过大,有多少层内存就翻多少倍。

为这些实现方案提升性能就要针对 容器 动画,并减小 容器 的尺寸,最好是和一层里所有 元素 的最小总面积相等,做到 精简适配

精简适配

公式

推导过程见 H5 分层屏幕适配公式推导


设计稿
 宽 v
 高 g
 
适配前元素
 横坐标 x
 纵坐标 y
 宽 w
 高 h

适配后容器
 横坐标 x3 = x*u/v
 纵坐标 y3 = y*f/g

适配后元素
 横坐标 x4 = m*u + (x - m*v)/w*w1 = m*v/w*w3 + (x - m*v)/w*w1
 纵坐标 y4 = n*f + (y - n*g)/h*h1 = n*g/h*h3 + (y - n*g)/h*h1
 宽 w3 = (w/v)*u
 高 h3 = (h/g)*f
 当 contain 方式适配时
 缩放值 s = Math.min(f/g, u/v)
 横向左留白占总留白 o = (m*v - x)/w
 纵向上留白占总留白 p = (n*g - y)/h
 当 cover 方式适配时
 缩放值 s = Math.max(f/g, u/v)
 横向左超出占总超出 o = (x - m*v)/w
 纵向上超出占总超出 p = (y - n*g)/h

适配区
 垂直居顶时 m = 0
 垂直居中时 m = .5
 垂直居底时 m = 1 
 水平居左时 n = 0
 水平居中时 n = .5
 水平居右时 n = 1 

相比整层适配内存优化 (w3*h3)/(v1*g1) >= w*h/(v*g)

<img> 实现示例
当设 max-width 为 w/v,max-height 为 h/g 时对应 contain 适配。
当设 min-width 为 w/v,min-height 为 h/g 时对应 cover 适配。
当设 width 为 w/v,height 为 h/g 时表示 fill 适配。
contain 适配时,如果图片原始尺寸小于 max-width 和 max-height 时,用 zoom: 10 放大或者直接修改图片原始尺寸。
cover 适配时,如果图片原始尺寸大于 min-width 和 min-height 时,用 zoom: .1 缩小或者直接修改图片原始尺寸。
因 top left 中百分比是相对屏幕宽 u 和高 f 的,对应 m*u 和 n*f
因 transform 中百分比是相对适配后元素宽 w1 和高 h1 的,对应 (m*v + x)/w*w1 和 (n*f + y)/h*h1


<!doctype html>
<html>
<body>
<style>
img {
 /* min-width 和 min-height 构成了虚拟的容器 */
 min-width: 50.37037037037037%; /* w3 = (w/v)*u 其中 w = 544,v = 1080 */
 min-height: 7.395833333333333%; /* h3 = (h/g)*f 其中 h = 142,g = 1920 */
 zoom: .1;
 /* x4 = m*u + (x - m*v)/w*w1 */
 /* y4 = n*f + (y - n*g)/h*h1 */
 position: absolute;
 left: 50%; /* m*u 其中 m = .5*/
 top: 50%; /* n*f 其中 n = .5 */
 transform:
 translateX(-48.34558823529412%) /* (x - m*v)/w*w1 其中 x = 277,m = .5,v = 1080,w = 544 */
 translateY(378.8732394366197%); /* (y - n*g)/h*h1 其中 y = 1498,n = .5,g = 1920,h = 142 */
}
</style>
<img src="http://ui.qzone.com/544x142"/> <!-- 元素 -->
</body>
</html>

background 实现示例

  1. background-size 值为 contain 时对应 contain 适配。

  2. background-size 值为 cover 时对应 cover 适配。

  3. background-size 值为 100% 100% 时对应 `fill 适配。

  4. background-position 百分比和 o p 意义相同


<!doctype html>
<html>
<body>
<style>
p {
 position: absolute;
 width: 50.37037037037037%; /* w3 = w/v*u 其中 w = 544,v = 1080 */
 height: 7.395833333333333%; /* h3 = h/g*f 其中 h = 142,g = 1920 */
 background: url(http://ui.qzone.com/544x142) no-repeat; /* 背景图做元素 */
 background-size: cover;
 left: 25.64814814814815%; /* x3 = x/v*u 其中 x = 277, v = 1080 */
 top: 78.02083333333333%; /* y3 = y/g*f 其中 y = 1498, g = 1920 */
 background-position-x: -48.34558823529412%; /* o = (x - m*v)/w 其中 m = .5 , v = 1080,x = 277,w = 544*/
 background-position-y: 378.8732394366197%; /* p = (y - n*g)/h 其中 n = .5 , g = 1920,y = 1498,h = 142*/
}
</style>
<p></p> <!-- 容器 -->
</body>
</html>

<svg> 实现示例

  1. preserveAspectRatiomeetOrSlicemeet 时对应 contain 适配。

  2. preserveAspectRatiomeetOrSliceslice 时对应 cover 适配。

  3. preserveAspectRatio 值为 none 时对应 fill 适配。

  4. 这里 preserveAspectRatiomeetOrSlice 相对的是容器,不是 适配区 这里用 transform 来定位,而 preserveAspectRatiomeetOrSlice 固定为 xMinYMin


<!doctype html>
<html>
<body>
<style>
svg {
 position: absolute;
 width: 50.37037037037037%;
 height: 7.395833333333333%;
 /* x4 = m*v/w*w3 + (x - m*v)/w*w1 */
 /* y4 = n*g/h*h3 + (y - n*g)/h*h1 */
 top: 0;
 left: 0;
 transform:
 translateX(99.26470588235294%) /* m*v/w*w3 其中 m = .5,v = 1080,w = 544 */
 translateY(676.056338028169%); /* n*g/h*h3 其中 n = .5,g = 1920,h = 142 */
 overflow: visible;
}
svg image {
 transform:
 translateX(-48.34558823529412%) /* (x - m*v)/w*w1 其中 x = 277,m = .5,v = 1080,w = 544 */
 translateY(378.8732394366197%); /* (y - n*g)/h*h1 其中 y = 1498,n = .5,g = 1920,h = 142 */
}
</style>
<svg viewBox="0 0 544 142" preserveAspectRatio="xMinYMin meet"> <!-- 容器 -->
 <image width="544" height="142" xlink:href="http://ui.qzone.com/544x142"/> <!-- 元素 -->
</svg>
</body>
</html>

辅助工具

手动计算百分比及写 css 很麻烦,可以借助 sass 等工具来辅助简化。
设计稿宽 vg 一般是页面级常量。
只需读取设计稿里每个 元素 的横坐标 x 、纵坐标 y 、宽 w 和 高 h,然后工具生成 css 即可。
这下妈妈再也不用担心我还原问题、屏幕适配问题了。

文字处理

文字固定或单行不固定,svgtext 标签可以处理

文字固定或单行不固定还可以将文字转为图片

文字多行不固定,可以借助 svgforeignObject 嵌入普通 p

方案对比

屏幕适配方案非常多,选哪种方式实现 整层适配 或 精简适配,下面是对比

方案缩放定位文字缩放兼容
padding-top 百分比只能依宽???
viewport???支持情况复杂
object-fit???移动端 android 4.4.4+
svg preserveRatio???移动端 android 3.0+
(max/min)-(width/height)??固定文字?
background-size??文字转图片?

热心网友 时间:2022-05-12 02:50

1、使用meta标签,这也是普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统。
首先解释该标签的含义:
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
如果你完全不了解这个标签的使用需要先百度一下。
解释:content中的“width” 这个width指的是什么宽度,我看过的文章对这个都没有解释的很清楚,有几个备选:虚拟窗口的宽度、手机屏幕的宽度、还是页面的宽度等等?经试验这个指的是虚拟窗口的宽度。了解宽度之后,对后续的各种scale,就应该知道是谁与谁的比例,是 虚拟窗口宽度 / 页面宽度,这样就会有问题出现安卓设备尺寸差异很大光主流的就有宽度为 320 480 720 1080 等各种尺寸而以上标签只能支持一种尺寸,当然有些浏览器会自动缩放使其适应屏幕,但这不是统一标准,正确的做法是用js动态生成此标签,当然,应该先获取屏幕尺寸。

热心网友 时间:2022-05-12 04:08

理论上,是可以实现的,只要做好各种浏览器的适配。不过浏览器的标准慢慢在统一化,很多HTML5游戏也都上市了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 集成cr62241t可用么代换了? 集成电路CR6224T的1脚VDDG是啥意思,它的英文全称是啥? 白百何终于出来营业了,彩色条纹打满春日元气,大家觉得可爱吗? 时尚界的宠儿白百何,哪身穿搭既时髦又洋气? 白百何已经35岁了,是如何做到仍然有少女感的? 白百何虽不是盛世美颜,但超级会穿,她在国外看秀的造型好看吗? 脸上的毛孔比较大怎么办? 彩色手绘比较正规的一般用什么笔?? 画室内设计手绘效果图要用什么笔? 手绘漫画都用什么笔啊? 手绘漫画一般用什么笔,需要什么书么 这5个最常见的纳税信用等级扣分点你知道吗? 惠普1040g3和联想T460比哪个好? 为什么毛毛虫爬得那么慢? 怎么在手机上查高考成绩 为什么非要绑定银行卡,以前没绑定非常方便,现在为什么要制造麻烦? 我身份证没买过火车票,在网上不能够买是不是 用高铁管家买车票,用银行卡支付的,收到短信说商户是深圳活力旅行社,而且是免密支付,是怎么回事,怎么 为什么高铁管家付款的支付宝绑定卡号要重新填 ,填好又说不支持银行卡结算 毛毛虫变蝴蝶过程flash动画 40平方米的水果冷藏库需配多大的压缩机? 为什么我的电脑能连上网 就是打不开网页啊 金价涨幅与什么有关 黄金价格涨跌的因素有哪些 黄金走势与哪个标的高度相关? 电脑桌面上的东西有的不见了怎么办 分级基金上折后既不对其进行赎回也不拆分会有什么后果? 同花顺模拟炒股买入国防B,11号上折之后无法 暂停分级基金发行对股市的影响 分级基金不定期下折后的份额与净值有什么变化? 疫情下企业经营受到严重影响贷款可以延期还贷吗 疫情期间需要还代款能不能顺廷? 银行已发行的产品如何查询收益 如何查询工行增利理财产品收益? 教育管理的基础知识都有哪些? 嗯教育行政管理的首要基本原则是什么? 现代教育理论基础知识就是教育学和心理学么?还包括什么 801教育理论是什么 901教育管理学是指的考什么呢 关于教育教学评价的相关理论有哪些? 也就是教育评价的理论基础有哪些?国内外的最好详细介绍下 教育管理学的教学方法