84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
/**
|
||
* 运行环境:区分手机微信与 PC 微信(Windows / Mac)。
|
||
* 大屏适配只认官方 platform,开发者工具手机预览不要走 PC 布局。
|
||
*/
|
||
|
||
export const PC_PAGE_MAX_WIDTH = 1200
|
||
|
||
const PC_PLATFORMS = { windows: true, mac: true }
|
||
|
||
export function isPcWeixin() {
|
||
try {
|
||
const sys = uni.getSystemInfoSync() || {}
|
||
const platform = String(sys.platform || '').toLowerCase()
|
||
return !!PC_PLATFORMS[platform]
|
||
} catch (e) {
|
||
return false
|
||
}
|
||
}
|
||
|
||
export function getWindowWidth() {
|
||
try {
|
||
const sys = uni.getSystemInfoSync() || {}
|
||
return Number(sys.windowWidth) || 375
|
||
} catch (e) {
|
||
return 375
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 宽屏商品列数:卡片跟着窗口变窄、一行变多。
|
||
* 手机仍双列;iPad / PC 中窗起加列,避免 rpx 把两列撑得过大。
|
||
*/
|
||
export function goodsColsByWidth(width) {
|
||
const w = Number(width) || 375
|
||
if (w >= 1200) return 5
|
||
if (w >= 900) return 4
|
||
if (w >= 600) return 3
|
||
return 2
|
||
}
|
||
|
||
/**
|
||
* 首页分类宫格列数:格子比商品卡更小,更早加列。
|
||
* mosaic / featured 这种非对称布局不要用这个函数去覆盖。
|
||
*/
|
||
export function catColsByWidth(width) {
|
||
const w = Number(width) || 375
|
||
if (w >= 1100) return 6
|
||
if (w >= 800) return 5
|
||
if (w >= 480) return 4
|
||
return 3
|
||
}
|
||
|
||
const widthListeners = []
|
||
let resizeBound = false
|
||
|
||
function emitWindowWidth(res) {
|
||
const size = (res && res.size) || {}
|
||
const width = Number(size.windowWidth) || getWindowWidth()
|
||
widthListeners.forEach((fn) => {
|
||
try {
|
||
fn(width)
|
||
} catch (e) {
|
||
// 单个页面抛错不影响其它订阅
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 订阅窗口宽度。PC 拉伸窗口时通知页面改列数。
|
||
* 返回取消订阅函数,页面销毁时必须调用。
|
||
*/
|
||
export function watchWindowWidth(fn) {
|
||
if (typeof fn !== 'function') return function noop() {}
|
||
widthListeners.push(fn)
|
||
if (!resizeBound && typeof uni.onWindowResize === 'function') {
|
||
uni.onWindowResize(emitWindowWidth)
|
||
resizeBound = true
|
||
}
|
||
return function unwatch() {
|
||
const idx = widthListeners.indexOf(fn)
|
||
if (idx >= 0) widthListeners.splice(idx, 1)
|
||
}
|
||
}
|