Skip to content

大屏自适应

安装插件

bash
npm install autofit.js
npm install autofit.js

使用

js
import autofit from 'autofit.js';

export default {
  mounted() {
    autofit.init({
      designWidth: 1920, // 设计稿宽度(常见大屏分辨率)
      designHeight: 1080, // 设计稿高度(16:9比例)
      renderDom: '#app', // 渲染容器(建议使用最外层包裹元素)
      resize: true, // 开启窗口Resize监听
      // 新增配置:处理非16:9屏幕的适配策略
      mode: 'scale', // 'scale'(等比缩放)或 'stretch'(拉伸填充)
      // 性能优化:设置Resize防抖时间
      debounceTime: 300, // 防抖时间(毫秒)
    });
  },
  beforeDestroy() {
    // 组件销毁时移除Resize监听
    autofit.destroy();
  }
};
import autofit from 'autofit.js';

export default {
  mounted() {
    autofit.init({
      designWidth: 1920, // 设计稿宽度(常见大屏分辨率)
      designHeight: 1080, // 设计稿高度(16:9比例)
      renderDom: '#app', // 渲染容器(建议使用最外层包裹元素)
      resize: true, // 开启窗口Resize监听
      // 新增配置:处理非16:9屏幕的适配策略
      mode: 'scale', // 'scale'(等比缩放)或 'stretch'(拉伸填充)
      // 性能优化:设置Resize防抖时间
      debounceTime: 300, // 防抖时间(毫秒)
    });
  },
  beforeDestroy() {
    // 组件销毁时移除Resize监听
    autofit.destroy();
  }
};

常见问题解决方案

问题 1:边框模糊(缩放导致像素偏移)

css
/* 在容器上添加transform-origin和像素对齐 */
#app {
  transform-origin: top left;
  image-rendering: -webkit-optimize-contrast; /* 优化缩放清晰度 */
}
/* 在容器上添加transform-origin和像素对齐 */
#app {
  transform-origin: top left;
  image-rendering: -webkit-optimize-contrast; /* 优化缩放清晰度 */
}

问题 2:大屏切换分辨率后布局错乱

js
// 手动触发适配(如切换分辨率后)
autofit.reset();
// 手动触发适配(如切换分辨率后)
autofit.reset();

原生 JS 自适应方案(无需第三方插件)

1. 核心原理:等比缩放 + 居中布局

js
// 在入口文件中添加
export class ScreenFit {
  constructor(designWidth = 1920, designHeight = 1080) {
    this.designWidth = designWidth;
    this.designHeight = designHeight;
    this.init();
  }

  init() {
    this.adjust();
    window.addEventListener('resize', () => this.adjust());
  }

  adjust() {
    const container = document.getElementById('app');
    if (!container) return;

    const { innerWidth, innerHeight } = window;
    const scaleX = innerWidth / this.designWidth;
    const scaleY = innerHeight / this.designHeight;
    const scale = Math.min(scaleX, scaleY); // 保持最小缩放,避免拉伸

    // 计算居中偏移量
    const translate = `translate(${((innerWidth - this.designWidth * scale) / 2)}px, ${((innerHeight - this.designHeight * scale) / 2)}px)`;

    container.style.cssText = `
      transform: scale(${scale}) ${translate};
      transform-origin: top left;
      width: ${this.designWidth}px;
      height: ${this.designHeight}px;
      min-width: 100%;
      min-height: 100%;
      overflow: hidden;
    `;
  }

  destroy() {
    window.removeEventListener('resize', () => this.adjust());
  }
}

// 使用示例
new ScreenFit(1920, 1080);
// 在入口文件中添加
export class ScreenFit {
  constructor(designWidth = 1920, designHeight = 1080) {
    this.designWidth = designWidth;
    this.designHeight = designHeight;
    this.init();
  }

  init() {
    this.adjust();
    window.addEventListener('resize', () => this.adjust());
  }

  adjust() {
    const container = document.getElementById('app');
    if (!container) return;

    const { innerWidth, innerHeight } = window;
    const scaleX = innerWidth / this.designWidth;
    const scaleY = innerHeight / this.designHeight;
    const scale = Math.min(scaleX, scaleY); // 保持最小缩放,避免拉伸

    // 计算居中偏移量
    const translate = `translate(${((innerWidth - this.designWidth * scale) / 2)}px, ${((innerHeight - this.designHeight * scale) / 2)}px)`;

    container.style.cssText = `
      transform: scale(${scale}) ${translate};
      transform-origin: top left;
      width: ${this.designWidth}px;
      height: ${this.designHeight}px;
      min-width: 100%;
      min-height: 100%;
      overflow: hidden;
    `;
  }

  destroy() {
    window.removeEventListener('resize', () => this.adjust());
  }
}

// 使用示例
new ScreenFit(1920, 1080);

2. CSS 配合实现无缝适配

css
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
}

#app {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #000; /* 黑色背景掩盖留白 */
}
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
}

#app {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #000; /* 黑色背景掩盖留白 */
}

性能优化(防抖 Resize 事件)

js
// 修改ScreenFit类的adjust方法
adjust() {
  if (this.timer) clearTimeout(this.timer);
  this.timer = setTimeout(() => {
    // 执行适配逻辑
  }, 300); // 300ms防抖
}
// 修改ScreenFit类的adjust方法
adjust() {
  if (this.timer) clearTimeout(this.timer);
  this.timer = setTimeout(() => {
    // 执行适配逻辑
  }, 300); // 300ms防抖
}

程序员小洛文档