移动端适配方案小结

简介:

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


流式布局

流式布局是一套典型的弹性布局,它的关键特点是:页面中的关键(布局)元素的宽高和位置都不会变化,只有容器元素在做拉伸变化,简单来说就是宽度的拉伸,快级盒子默认就能适应容器的宽度。这种布局对于页面简单的web app是足够了,比如拉钩的页面:

1

2

从上面的图片我们可以看到:

  • 顶部与底部的bar不管分辨率怎么变,它的高度和位置都不变
  • 中间每条招聘信息不管分辨率怎么变,招聘公司的图标等信息都位于条目的左边,薪资都位于右边,且高度也没有变化。

因此,对于这类简单的web app页面,我们如果要使用流式布局的话,只需要记住一个开发原则就可以了:文字流式、控件弹性,图片有需要等比缩放。 这种布局适配屏幕尺寸大于设计稿的设备是没有问题的,但是如果对于屏幕分辨率小于设计稿的设备,那么容器盒子里的内容可能放不小,需要媒体查询单独适配下。

rem布局

rem布局,开发过web app页面的童鞋,应该都很熟悉了。当分辨率变化的时候,我们通过js来改变html的font-size,然后我们就可以使用rem代替px了。

我们可以看到淘宝的页面在不同的屏幕下,页面有明显的等比变化。

3

4

直接上操作:

  • 先拿设计稿竖着的横向分辨率除以100(这个基数是为了计算方便而自己设定的,或者postcss-plugin-px2rem自动转换)得到body元素的宽度
  • 盒子高度为210px,写样式的时候css应该这么写:height: 2.1rem
  • 在header标签中加入,下面代码
var deviceWidth = document.documentElement.clientWidth
// 大于设计稿的横向分辨率时,始终按设计稿的宽来
if(deviceWidth > 750) deviceWidth = 750;

document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';

这里写这么多,其实有个更好的方案,那就是

  font-size: 100vw / 750 * 100;
}

某些情况font-size不能使用rem,需要额外的媒介查询单独设置

    .m-navlist{font-size:15px}
}

@media screen and (min-width:321px) and (max-width:400px){
    .m-navlist{font-size:16px}
}

@media screen and (min-width:400px){
    .m-navlist{font-size:18px}
}

flexible

flexible实现web app布局的前提是viewport的scale根据devicePixelRatio动态设置:

  • devicePixelRatio为2的时候,scale为0.5
  • devicePixelRatio为3的时候,scale为0.33333

这样设好了之后,页面的大小和设计稿上保持一致了,以设计稿为750为例,iphone6的devicePixelRatio为2,所以此时它的布局视口就是750px,我们就可以设定一个基数把页面尺寸转成rem了

var scale = 1 / window.devicePixelRatio;
document.querySelector('meta[name="viewport"]').setAttribute('content','initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no')

// 动态计算html的font-size
var baseFontSize = document.documentElement.clientWidth / 10;
document.documentElement.style.fontSize =  baseFontSize + 'px'
// 这样设置后,布局的时候css 的rem计算公式: css尺寸=设计稿标注尺寸/baseFontSize

less 函数转换rem

.px2rem(@name,@px) {
  @{name}: @px / @baseFontSize * 1rem
}

scale的处理

    var isAndroid = win.navigator.appVersion.match(/android/gi);
    var isIPhone = win.navigator.appVersion.match(/iphone/gi);
    var devicePixelRatio = win.devicePixelRatio;
    if (isIPhone) {
        // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
        if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                
            dpr = 3;
        } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
            dpr = 2;
        } else {
            dpr = 1;
        }
    } else {
        // 其他设备下,仍旧使用1倍的方案
        dpr = 1;
    }
    scale = 1 / dpr;
}

对安卓设备默认按dpr为1处理,而ios设备这样设置后,可以使用布局视口的宽度等于物理的分辨率,这意味着布局视口中的像素单位是和物理像素一一对应的,解决了 1px border 问题和高清图片的问题。另外淘宝的方案将 body 的 width 设为 100% 并对 overflow 进行 hidden,这个 100% width 会计算为布局视口的宽,也是 10rem,那么 body 内布局超出 10rem 的元素不会导致布局视口出现滚动条。

字体处理

字体使用px单位,需要对不同的视口宽度(dpr)的设备适配,flexible是将dpr 数值设置为 html 的 data-dpr 属性,通过css选择器选择不同 dpr 设备下的元素

    width: 1rem; 
    height: 0.4rem;
    font-size: 12px; // 默认写上dpr为1的fontSize
}
[data-dpr="2"] div {
    font-size: 24px;
}
[data-dpr="3"] div {
    font-size: 36px;
}

less 简写方案

  font-size: @fontSize
  [data-dpr="2"] & {
    font-size: @fontSize * 2;
  }

  [data-dpr="3"] & {
    font-size: @fontSize * 3;
  }
}

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-17
本文作者:前端小闲鱼
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
敏捷开发 Cloud Native 安全
云原生有哪些优缺点呢
云原生有哪些优缺点呢
|
安全 JavaScript Java
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
2614 0
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
|
编解码 前端开发 JavaScript
响应式设计与移动端适配技巧:打造无缝用户体验
【7月更文挑战第29天】响应式设计与移动端适配是提升网站和应用用户体验的关键环节。通过遵循响应式设计的核心原则,并结合一系列移动端适配技巧,我们可以打造出既美观又实用的跨平台应用,满足不同用户的多样化需求。随着技术的不断进步和用户需求的日益复杂,持续学习和实践这些技巧将是我们作为开发者的重要任务。
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####
|
消息中间件 存储 缓存
QPS多少,才算高并发 ?
本文详解高并发概念及 QPS 标准,大厂面试高频点,建议掌握收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
QPS多少,才算高并发 ?
|
人工智能 供应链 安全
|
数据采集 算法
sku算法实现
sku算法实现
638 0
sku算法实现
|
Web App开发 缓存 前端开发
WebKit简介及工作流程
WebKit简介及工作流程
|
机器学习/深度学习 自然语言处理 语音技术
智能语音助手的技术原理与实现
【7月更文挑战第31天】智能语音助手的技术原理与实现涉及语音识别、自然语言处理、知识图谱以及多模态交互等多个方面。随着人工智能技术的不断发展和创新,智能语音助手将更加智能化、高效化和普适化,为我们的生活带来更加便捷和丰富的体验。
2502 0
|
Linux 编译器 C语言
IMX6ULL —— ASCII 字符和中文字符的点阵显示
IMX6ULL —— ASCII 字符和中文字符的点阵显示