/** * 运行环境:区分手机微信与 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) } }