详解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 多级checkbox选择效果
Aug 20 Javascript
用jquery生成二级菜单的实例代码
Jun 24 Javascript
简单时间提示DEMO从0开始一直进行计时
Nov 19 Javascript
javascript版2048小游戏
Mar 18 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
Aug 25 Javascript
javascript之Boolean类型对象
Jun 07 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
Jan 15 Javascript
Vue单页及多页应用全局配置404页面实践记录
May 22 Javascript
微信小程序实现分享商品海报功能
Sep 30 Javascript
Vue.js中Line第三方登录api的实现代码
Jun 29 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用正则表达式匹配URL的简单方法
2013/11/12 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python入门必须知道的11个知识点
2018/03/21 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
sklearn的predict_proba使用说明
2020/06/28 Python
python简单实现9宫格图片实例
2020/09/03 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
优秀毕业生推荐信范文
2014/03/07 职场文书
元旦晚会感言
2014/03/12 职场文书
教师一帮一活动总结
2014/07/08 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
计生个人工作总结
2015/02/28 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL