H5 分层屏幕适配

作者 : 开心源码 本文共2682个字,预计阅读时间需要7分钟 发布时间: 2022-05-11 共209人阅读

H5 分层屏幕适配

LSGO软件技术团队

H5 分层屏幕适配

1 LSGO软件技术团队

贡献人:LSGO船长

假如喜欢这里的内容,你可以够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习。

If you like the content here, the greatest help you can give me is forwarding, so tell your friends and encourage them to learn together.

屏幕适配

屏幕适配应当指内容 适配区屏幕区 间的适配关系。 单屏适配有 containcover 或者 fill,多屏常见是 依宽containcover 还需要 定位 来解决留白和超出的内容。 而同一个 H5 里不同内容往往使用不同适配方式,即 分层

H5 分层屏幕适配

H5 分层屏幕适配

优选 CSS

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

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

  • js 会等待 dom 和 cssom 解决完后才可以执行,而 css 只要等待 dom

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

对于屏幕适配这类体现问题,可以使用 css 实现就应该使用 css 实现。

整层适配

为确保各层元素同步缩放,不走样,每层的 适配区 应当等于设计稿大小。 直接的实现就是构造和 适配区 一样尺寸的 容器整层适配容器 内能有若干个相同适配方式的 元素。 以 svg 实现为例:

.layer { position: absolute; top: 0; left: 0; width: 100%; height: 100%;}         

实际效果:

整层适配 实现简单,开发时直接读取设计稿值,能满足大部分静态页面需求。 但在 h5 动画多的时候,就得考虑动画流畅,页面性可以了。 使用可替换元素如 等做 容器,以及使用背景图做 元素 的, 在应使用 css 动画时有性可以缺陷:

  • 容器元素 应使用 css 动画会造成频繁重排和重绘,导致卡慢。

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

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

精简适配

公式

推导过程见 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)

实现示例

  • 当设 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-widthmax-height 时,使用 zoom:10 放大或者者直接修改图片原始尺寸。

  • cover 适配时,假如图片原始尺寸大于 min-widthmin-height 时,使用 zoom:.1 缩小或者者直接修改图片原始尺寸。

  • top left 中百分比是相对屏幕宽 u 和高 f 的,对应 m*un*f

  • transform 中百分比是相对适配后元素宽 w1 和高 h1 的,对应 (m*v + x)/w*w1 和(n*f + y)/h*h1

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 */} 

background 实现示例

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

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

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

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

div { 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*/}

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » H5 分层屏幕适配

发表回复