详解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之更有效率的字符串替换
Aug 02 Javascript
自己的js工具 Cookie 封装
Aug 21 Javascript
Javascript 函数中的参数使用分析
Mar 27 Javascript
javascript学习之闭包分析
Dec 02 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
Jun 24 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
Feb 28 Javascript
浅谈addEventListener和attachEvent的区别
Jul 14 Javascript
vue环境搭建简单教程
Nov 07 Javascript
彻底理解js面向对象之继承
Feb 04 Javascript
微信小程序实现九宫格抽奖
Apr 15 Javascript
JS倒计时两种实现方式代码实例
Jul 27 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
php实现删除空目录的方法
2015/03/16 PHP
php计算一个文件大小的方法
2015/03/30 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
浅谈php调用python文件
2019/03/29 PHP
javascript Excel操作知识点
2009/04/24 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
Bootstrap的modal拖动效果
2016/12/25 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
小学运动会入场式解说词
2014/02/18 职场文书
综治宣传月活动总结
2014/04/28 职场文书
励志演讲稿范文
2014/04/29 职场文书
社区活动总结报告
2014/05/05 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
迎新生标语大全
2014/10/06 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
八达岭长城导游词
2015/01/30 职场文书
党校个人总结
2015/03/04 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
2019财务转正述职报告
2019/06/27 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技