127 lines
2.8 KiB
JavaScript
127 lines
2.8 KiB
JavaScript
/**
|
||
* 响应式工具函数
|
||
* 用于检测设备类型、屏幕尺寸和横竖屏
|
||
*/
|
||
|
||
// 获取系统信息
|
||
function getSystemInfo() {
|
||
try {
|
||
return uni.getSystemInfoSync()
|
||
} catch (e) {
|
||
console.error('获取系统信息失败:', e)
|
||
return {
|
||
windowWidth: 375,
|
||
windowHeight: 667,
|
||
screenWidth: 375,
|
||
screenHeight: 667,
|
||
pixelRatio: 2
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断是否为平板设备
|
||
* 通常平板宽度 >= 768px (在rpx中约为 1536rpx)
|
||
*/
|
||
export function isTablet() {
|
||
const systemInfo = getSystemInfo()
|
||
const windowWidth = systemInfo.windowWidth || systemInfo.screenWidth || 375
|
||
// 在H5环境下,windowWidth是px单位
|
||
// 在UniApp中,通常以rpx为基准,750rpx = 屏幕宽度
|
||
// 平板判断:宽度 >= 768px (约等于 1536rpx / 2 = 768px)
|
||
return windowWidth >= 768
|
||
}
|
||
|
||
/**
|
||
* 判断是否为手机设备
|
||
*/
|
||
export function isMobile() {
|
||
return !isTablet()
|
||
}
|
||
|
||
/**
|
||
* 获取设备类型
|
||
* @returns {'mobile' | 'tablet'}
|
||
*/
|
||
export function getDeviceType() {
|
||
return isTablet() ? 'tablet' : 'mobile'
|
||
}
|
||
|
||
/**
|
||
* 是否横屏
|
||
*/
|
||
export function isLandscape() {
|
||
const systemInfo = getSystemInfo()
|
||
const width = systemInfo.windowWidth || systemInfo.screenWidth || 375
|
||
const height = systemInfo.windowHeight || systemInfo.screenHeight || 667
|
||
return width > height
|
||
}
|
||
|
||
/**
|
||
* 是否竖屏
|
||
*/
|
||
export function isPortrait() {
|
||
return !isLandscape()
|
||
}
|
||
|
||
/**
|
||
* 获取屏幕宽度(px)
|
||
*/
|
||
export function getScreenWidth() {
|
||
const systemInfo = getSystemInfo()
|
||
return systemInfo.windowWidth || systemInfo.screenWidth || 375
|
||
}
|
||
|
||
/**
|
||
* 获取屏幕高度(px)
|
||
*/
|
||
export function getScreenHeight() {
|
||
const systemInfo = getSystemInfo()
|
||
return systemInfo.windowHeight || systemInfo.screenHeight || 667
|
||
}
|
||
|
||
/**
|
||
* 响应式混入
|
||
* 可以在组件中使用
|
||
* this.isTablet, this.isMobile, this.deviceType
|
||
* this.isLandscape, this.isPortrait
|
||
*/
|
||
export const responsiveMixin = {
|
||
data() {
|
||
return {
|
||
deviceType: 'mobile',
|
||
screenWidth: 375,
|
||
screenHeight: 667,
|
||
isLandscape: false,
|
||
isPortrait: true
|
||
}
|
||
},
|
||
computed: {
|
||
isTablet() {
|
||
return this.deviceType === 'tablet'
|
||
},
|
||
isMobile() {
|
||
return this.deviceType === 'mobile'
|
||
}
|
||
},
|
||
onLoad() {
|
||
this.updateDeviceInfo()
|
||
},
|
||
onShow() {
|
||
this.updateDeviceInfo()
|
||
},
|
||
onResize() {
|
||
this.updateDeviceInfo()
|
||
},
|
||
methods: {
|
||
updateDeviceInfo() {
|
||
this.deviceType = getDeviceType()
|
||
this.screenWidth = getScreenWidth()
|
||
this.screenHeight = getScreenHeight()
|
||
this.isLandscape = isLandscape()
|
||
this.isPortrait = !this.isLandscape
|
||
}
|
||
}
|
||
}
|
||
|