详解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 有趣而诡异的数组
Apr 06 Javascript
jQuery学习笔记之jQuery的动画
Dec 22 Javascript
子窗体与父窗体传值示例js代码
Aug 01 Javascript
jquery右下角弹出提示框示例代码
Oct 08 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
JS实现DIV容器赋值的方法
Dec 14 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
Mar 27 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
jQuery实现B2B网站后台管理系统侧导航
Jul 08 jQuery
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 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
2.PHP入门
2006/10/09 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
php文件缓存类汇总
2014/11/21 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python下使用Psyco模块优化运行速度
2015/04/05 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
python梯度下降算法的实现
2020/02/24 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
python中round函数如何使用
2020/06/19 Python
Python执行时间的几种计算方法
2020/07/31 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
工伤调解协议书
2016/03/21 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
Python find()、rfind()方法及作用
2022/12/24 Python