rem.client.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /*
  2. * @Author: LiZhiWei
  3. * @Date: 2026-01-19 09:12:33
  4. * @LastEditors: LiZhiWei
  5. * @LastEditTime: 2026-01-19 09:12:36
  6. * @Description:
  7. */
  8. // plugins/rem.client.ts
  9. export default defineNuxtPlugin((nuxtApp) => {
  10. const setRem = () => {
  11. const designWidth = 1920 // 我们的设计稿宽度
  12. const baseSize = 16 // 我们希望的最大基准值 (1rem = 16px)
  13. const clientWidth = document.documentElement.clientWidth
  14. // 核心计算公式:缩放比例 = 当前视宽 / 设计稿宽度
  15. const remSize = (clientWidth / designWidth) * baseSize
  16. // 【关键】设置字体大小,并限制其在 12px 到 16px 之间
  17. // 这意味着:屏幕小于 1920px 时会缩小,大于 1920px 时根字体大小稳定在 16px
  18. document.documentElement.style.fontSize = `${Math.min(Math.max(remSize, 12), 16)}px`
  19. }
  20. let timer: NodeJS.Timeout | null = null
  21. const setRemDebounced = () => {
  22. if (timer) clearTimeout(timer)
  23. timer = setTimeout(setRem, 250) // 防抖优化
  24. }
  25. // App 挂载后设置并监听 resize
  26. nuxtApp.hook('app:mounted', () => {
  27. setRem()
  28. window.addEventListener('resize', setRemDebounced)
  29. })
  30. // App 卸载前清理
  31. nuxtApp.hook('app:beforeMount', () => {
  32. window.removeEventListener('resize', setRemDebounced)
  33. if (timer) clearTimeout(timer)
  34. })
  35. })