详解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 相关文章推荐
编写兼容IE和FireFox的脚本
May 18 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
javascript中apply和call方法的作用及区别说明
Feb 14 Javascript
js判断游览器类型及版本号的代码
May 11 Javascript
改变状态栏文字的js代码
Jun 13 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
Mar 16 Javascript
jQuery UI插件实现百度提词器效果
Nov 21 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
详解JS获取HTML DOM元素的8种方法
Jun 17 Javascript
浅谈vue项目重构技术要点和总结
Jan 23 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
electron踩坑之remote of undefined的解决
Oct 06 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
Smarty模板配置实例简析
2019/07/20 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python 26进制计算实现方法
2015/05/28 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
基于python实现操作redis及消息队列
2020/08/27 Python
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
检察官就职演讲稿
2014/01/13 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
小学副班长竞选稿
2015/11/21 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
Golang gRPC HTTP协议转换示例
2022/06/16 Golang