详解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 相关文章推荐
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
让你的博客飘雪花超出屏幕依然看得见
Jan 04 Javascript
jquery实现智能感知连接外网搜索
May 21 Javascript
有关Promises异步问题详解
Nov 13 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
基于JS实现数字+字母+中文的混合排序方法
Jun 06 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
Aug 23 Javascript
json字符串传到前台input的方法
Aug 06 Javascript
Three.js实现3D机房效果
Dec 30 Javascript
vue开发环境配置跨域的方法步骤
Jan 16 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
js 解析 JSON 数据简单示例
Apr 21 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
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php文件上传类的分享
2017/07/06 PHP
ExtJS 入门
2010/10/29 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python使用插值法画出平滑曲线
2018/12/15 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
strstr()的简单实现
2013/09/26 面试题
安全教育心得体会
2013/12/29 职场文书
经营目标管理责任书
2014/07/25 职场文书
导游欢迎词范文
2015/01/23 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
MySQL分区以及建索引的方法总结
2022/04/13 MySQL
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL