详解mpvue实现对苹果X安全区域的适配


Posted in Javascript onJuly 31, 2019

一、业务背景

最近在利用mpvue+ts开发小程序的过程中,由于苹果X等手机会出现底部的按钮,会遮盖掉需要操作的按钮。由于在小程序开发,微信爸爸已经做了对机型的检查,相对与H5的处理来说方便很多了。下面就稍微罗列一下解决方案。

二、实现思路

  1. 判断机型方法
  2. 注入全局组件mixin
  3. 加入全局安全距离css
  4. 页面上进行class类处理

三、实现过程

1、判断机型方法

小程序的官方文档提供了一个方法wx.getSystemInfo,我们可以利用该方法来对小程序的对应的手机型号进行判断,是否需要加上安全距离。在工具类文件新建safe-area.js文件,编写下面代码,这里返回一个Project,方便取值。

let cache = null;
export default function getSafeArea() {
  return new Promise((resolve, reject) => {
    if (cache != null) {
    // 如果有缓存不行行调用
      resolve(cache);
    }
    else {
    // 获取系统信息
      wx.getSystemInfo({
        success: ({ model, screenHeight, statusBarHeight }) => {
          const iphoneX = /iphone x/i.test(model);
          const iphoneNew = /iPhone11/i.test(model) && screenHeight === 812;
          cache = {
            isIPhoneX: iphoneX || iphoneNew,
            statusBarHeight
          };
          resolve(cache);
        },
        fail: reject
      });
    }
  });
}

2、注入全局组件mixin

因为mpvue是具有mixin这个属性的,我们可以利用混入安全距离的处理方法。用法基本跟vue一致。新建mixins.js,注入插件,在这个过程中需要注意一点,就是如果不进行页面类型的判断,会出现如果引用组件也会进行注入该方法。所以需要加入进行判断

Vue.prototype.$isPage = function isPage() {
  return this.$mp && this.$mp.mpType === 'page'
 }

在mounted过程中进行处理,可以避免不必要的注入。

import getSafeArea from '../utils/safe-area'
let MyPlugin = {};
MyPlugin.install = function (Vue) {
 // 添加全局方法或属性
 Vue.prototype.$isPage = function isPage() {
  return this.$mp && this.$mp.mpType === 'page'
 }
 // 注入组件
 Vue.mixin({
  data() {
   return {
    isIPhoneX: this.isIPhoneX,
   }
  },
  mounted() {
   if (this.$isPage()) {
    getSafeArea().then(({ isIPhoneX, statusBarHeight }) => {
     this.isIPhoneX = isIPhoneX
    });
   }
  }
 })
}
export default MyPlugin

在main.js中注册该插件

import MyPlugin from './minxins'
Vue.use(MyPlugin)

3、加入全局安全距离css

为了我们不需要在每一个文件进行样式的声明,我们可以在全局样式中写入安全距离的类

.safeArea {
 padding-bottom: 34px!important;
}

4、页面上进行class类处理

处理完以上部分我们可以对页面上需要处理的区域,加入:class="{safeArea: isIPhoneX}"进行修改,例如:

<div class="handle" :class="{safeArea: isIPhoneX}">
   <div class="home" @click="goHome"></div>
   <div class="submit" @click="buy">立即购买</div>
  </div>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery获取特定name所有选中的checkbox,支持IE9标准模式
Mar 18 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
Apr 28 Javascript
原生javascript实现隔行换色
Jan 04 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 Javascript
微信小程序 配置文件详细介绍
Dec 14 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
Dec 19 Javascript
ES6新特性六:promise对象实例详解
Apr 21 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
Jun 14 Javascript
AjaxUpLoad.js实现文件上传
Mar 05 Javascript
微信小程序自定义组件实现环形进度条
Nov 17 Javascript
深入了解JS之作用域和闭包
Jun 16 Javascript
vue将后台数据时间戳转换成日期格式
Jul 31 #Javascript
Vue Element UI + OSS实现上传文件功能
Jul 31 #Javascript
原生js代码能实现call和bind吗
Jul 31 #Javascript
微信小程序下拉框搜索功能的实现方法
Jul 31 #Javascript
javascript中undefined的本质解析
Jul 31 #Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
Jul 31 #Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 #Javascript
You might like
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
vue跨域解决方法
2017/10/15 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python字典简介以及用法详解
2016/11/15 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
获取Django项目的全部url方法详解
2017/10/26 Python
python获取代理IP的实例分享
2018/05/07 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python并行分布式框架Celery详解
2018/10/15 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
python字典排序的方法
2019/10/12 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
保护环境标语
2014/06/09 职场文书
职工小家建设活动方案
2014/08/25 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python