详解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 相关文章推荐
innerText和innerHTML 一些问题分析
May 18 Javascript
jquery 延迟执行实例介绍
Aug 20 Javascript
js左侧三级菜单导航实例代码
Sep 13 Javascript
jQuery常用且重要方法汇总
Jul 13 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
学习vue.js中class与style绑定
Dec 03 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
Bootstrap 模态框实例插件案例分析
Dec 28 Javascript
Angular2 组件间通过@Input @Output通讯示例
Aug 24 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
Apr 11 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
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 文件夹删除、php清除缓存程序
2009/08/25 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
微信小程序开发探究
2016/12/27 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
对python中的装包与解包实例详解
2019/08/24 Python
python logging日志模块原理及操作解析
2019/10/12 Python
pygame实现非图片按钮效果
2019/10/29 Python
python计算二维矩形IOU实例
2020/01/18 Python
python 如何调用远程接口
2020/09/11 Python
大学生的创业计划书就该这么写
2014/01/30 职场文书
销售人员获奖感言
2014/02/05 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
2015年中秋节主持词
2015/07/30 职场文书
spring boot实现文件上传
2022/08/14 Java/Android