device.js 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. // 设备适配工具:支持移动端展示
  2. const MOBILE_BREAKPOINT = 768
  3. /** 根据视口宽度判断是否移动端 */
  4. export function isMobileDevice() {
  5. if (typeof window === 'undefined') return false
  6. return window.innerWidth <= MOBILE_BREAKPOINT
  7. }
  8. /**
  9. * 当前展示端(pc / mobile)——只由真实视口宽度决定。
  10. * 说明:不读取 localStorage,避免"以前点过手机端被记住、之后在 PC 上一直被当作移动端"的坑。
  11. * 右上角手动切换为"本次会话内预览",刷新/重进后恢复按窗口宽度自动判断。
  12. */
  13. // 本会话内的手动覆盖(内存态,刷新即失效)
  14. let manualMode = null
  15. export function getDeviceMode() {
  16. if (manualMode === 'pc' || manualMode === 'mobile') return manualMode
  17. return isMobileDevice() ? 'mobile' : 'pc'
  18. }
  19. export function setDeviceMode(mode) {
  20. manualMode = mode
  21. // 通知各子应用端切换
  22. window.dispatchEvent(new CustomEvent('mf-device-change', { detail: mode }))
  23. }
  24. /** 计算移动端安全的视口高度(兼容 iOS 底部导航遮挡) */
  25. export function getSafeAreaVh() {
  26. return `calc(100vh - env(safe-area-inset-bottom))`
  27. }