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