详解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 精粹读书笔记(1,2)
Feb 07 Javascript
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
jquery 实现上下滚动效果示例代码
Aug 09 Javascript
原生javascript实现无间缝滚动示例
Jan 28 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
Jul 27 Javascript
Jquery技巧(必须掌握)
Mar 16 Javascript
js自定义select下拉框美化特效
May 12 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 Javascript
如何使用JavaScript实现栈与队列
Jun 24 Javascript
对TypeScript库进行单元测试的方法
Jul 18 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 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如何透过ODBC来存取数据库
2006/10/09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php array_search() 函数使用
2010/04/13 PHP
php数据访问之查询关键字
2016/05/09 PHP
JQuery验证工具类搜集整理
2013/01/16 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python不规范的日期字符串处理类
2014/06/10 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
python如何把字符串类型list转换成list
2020/02/18 Python
Python enumerate内置库用法解析
2020/02/24 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python绘制动态水球图过程详解
2020/06/03 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
给老师的道歉信
2014/01/11 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
运动会宣传语
2015/07/13 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android