详解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实现下拉收缩(展开与折叠)特效
Dec 25 Javascript
验证控件与Button的OnClientClick事件详细解析
Dec 04 Javascript
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
Aug 08 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
Nov 11 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 Javascript
layui表单验证select下拉框实现验证的方法
Sep 05 Javascript
Javascript Dom元素获取和添加详解
Sep 24 Javascript
vue设置一开始进入的页面教程
Oct 28 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
Jun 02 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在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python的类方法和静态方法
2014/12/13 Python
浅谈python中的占位符
2017/11/09 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
python利用tkinter实现屏保
2019/07/30 Python
Pytorch的mean和std调查实例
2020/01/02 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
PHP面试题及答案二
2015/05/23 面试题
群胜软件Java笔试题
2012/09/29 面试题
大学生预备党员自我评价分享
2013/11/16 职场文书
顶碗少年教学反思
2014/02/21 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
苏州园林导游词
2015/02/03 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL