Files

84 lines
2.1 KiB
JavaScript
Raw Permalink Normal View History

2026-08-20 19:15:41 +08:00
/**
* 运行环境:区分手机微信与 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)
}
}