IPhone X 移动端 兼容性问题

Iphone x 的刘海给屏幕增加了34pt的安全距离,就会导致我的页面布局错位。底部的tabbar 会被刘海挡住。

以下是专门针对vue 解决tabbar 被挡住的解决办法

1. 给index.html 页面添加 meta 属性

// 避免浏览器使用IE的兼容模式

<meta http-equiv="X-UA-Compatible" content="IE=edge">   

// 苹果手机全屏 显示  非常重要

<meta name="apple-touch-fullscreen" content="yes">

// 页面的是否可以缩放

<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">

2. 用storage 存储手机的类型  在util 下定义一个 storage.js 文件

/**

* 用于读取和存储localstorage

*

* @class LocalStorage

*/

class LocalStorage {

constructor (prefix = '__crm__', expired = null) {

// 存储前缀

this.prefix = prefix

// 过期时间 如果为零则永久

this.expired = expired

}

/**

*设置数据

*

* @param {*} key

* @param {*} [value={}]

* @param {*} [expired=null]

* @memberof LocalStorage

*/

setItem (key, value = {}, expired = null) {

const storage = this.getItem()

const row = {}

// 如果开启了全部默认设置过期时间

if (this.expired) {

row['expired'] = this.expired

row['time'] = (new Date()).getTime()

}

// 单独设置某个过期时间

if (expired) {

row['expired'] = expired

row['time'] = (new Date()).getTime()

}

row['value'] = value

storage[key] = row

this.setDataToLocalStorage(storage)

}

/**

*获取数据

*

* @param {*} key

* @memberof LocalStorage

*/

getItem (key = null) {

const storage = this.getLocalStorage(key)

// 不传参数则返回全部

if (!key) {

return storage

}

// 没有设置过期时间

if (storage[key] && !storage[key]['time']) {

return storage[key].value

}

if (storage[key] && this.isExpired(key, storage[key])) {

return storage[key].value

} else {

return null

}

}

/**

*把数据保存到本地缓存

*

* @param {*} storage

* @returns

* @memberof LocalStorage

*/

setDataToLocalStorage (storage) {

try {

return localStorage.setItem(this.prefix, JSON.stringify(storage))

} catch (error) {

throw error('设置失败...')

}

}

/**

*获取本地缓存数据

*

* @memberof LocalStorage

*/

getLocalStorage (key = null) {

let storage = {}

try {

storage = localStorage.getItem(this.prefix)

} catch (error) {

storage = {}

}

storage ? storage = JSON.parse(storage) : storage = {}

return storage

}

/**

*判断是否过期

*

* @param {*} value

* @memberof LocalStorage

*/

isExpired (key, value) {

const currentTime = (new Date()).getTime()

const storageTime = value.time

if ((currentTime - storageTime) <= Number(value.expired)) {

return true

} else {

this.clear(key)

return false

}

}

/**

*删除某个缓存

*

* @param {*} key

* @memberof LocalStorage

*/

clear (key = null) {

const storage = this.getItem()

if (!key) {

return localStorage.clear(this.prefix)

}

if (storage[key]) {

delete storage[key]

}

this.setDataToLocalStorage(storage)

return key

}

}

3. 定义一个存储手机类型的model.js  文件

export default {

'iPhone X': '30px',

'iPhone XR': '30px',

'iPhone XS': '30px',

'iPhone XS Max': '30px',

}

4. vue的 mixins 添加一个 model.js 文件 自定义一个vue 属性

import models from '@/utils/models'

import storage from '@/utils/storage'

export default {

data() {

return {

paddingBottom: '0px',

}

},

created() {

if (storage.getItem('model')) {

let type = 'iPhone X'

if (storage.getItem('model').indexOf(type) !== -1) {

this.paddingBottom = models[type]

}

}

},

}

5. 剩下的可以在任何一个页面,任何一个html 页面下面 添加 自己定义的paddingBottom属性。可以在Iphone x 手机完美兼容

举个例子 

<van-tabbar:style="{paddingBottom: paddingBottom}" />

猜你喜欢

转载自blog.csdn.net/qq_25687271/article/details/104944668
今日推荐