详解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 相关文章推荐
JavaScript 入门·JavaScript 具有全范围的运算符
Oct 01 Javascript
提高网站性能之 如何对待JavaScript
Oct 31 Javascript
jquery动态添加option示例
Dec 30 Javascript
jQuery的context属性用法实例
Dec 27 Javascript
Sea.JS知识总结
May 05 Javascript
js注入 黑客之路必备!
Sep 14 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
Sep 29 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 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
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
python读取word文档的方法
2015/05/09 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
Python Selenium库的基本使用教程
2021/01/04 Python
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
精彩的大学生自我评价
2013/11/17 职场文书
岗位职责风险防控
2014/02/18 职场文书
需求分析说明书
2014/05/09 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
爱心捐款感谢信
2015/01/20 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
党员带头倡议书
2015/04/29 职场文书
环保证明
2015/06/23 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android