详解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 放大镜 移动镜片效果代码
May 09 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
Nov 14 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
Mar 03 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
Mar 02 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
详解JavaScript中基于原型prototype的继承特性
May 05 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 jQuery
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 Javascript
JS利用prototype给类添加方法操作详解
Jun 21 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
Sep 20 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中实现中文字符进制转换原理分析
2011/12/06 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python循环语句之break与continue的用法
2015/10/14 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python实现电脑自动关机
2018/06/20 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
Python实现一个论文下载器的过程
2021/01/18 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
生产副总岗位职责
2013/11/28 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
授权委托书
2015/01/28 职场文书
爱国电影观后感
2015/06/19 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
js不常见操作运算符总结
2021/11/20 Javascript
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS