大屏适配的核心思路只有一个:不管实际屏幕多大,都按设计稿的固定比例整体缩放,而不是让里面的元素自己各自变形去适应。
方案一:CSS transform: scale()
核心思路:
- 整个大屏页面按设计稿的固定尺寸(比如1920×1080)来写,内部布局完全不用考虑"适配",就当成是在一个固定画布里排版
- 拿到真实屏幕的宽高之后,计算一个缩放比例 (比如真实屏幕是2560×1440,缩放比例就是
2560/1920 = 1.333) - 用CSS的
transform: scale(1.333)把整个页面等比例放大,让它填满真实屏幕
javascript
function resize() {
const designWidth = 1920;
const designHeight = 1080;
const scaleX = window.innerWidth / designWidth;
const scaleY = window.innerHeight / designHeight;
const el = document.getElementById('screen-wrapper');
el.style.transform = `scale(${scaleX}, ${scaleY})`;
// 或者取 scaleX 和 scaleY 中较小的那个,保持宽高比不变形,两边留黑边
}
window.addEventListener('resize', resize); // 屏幕尺寸变化时重新计算
resize(); // 初始化时执行一次
为什么这个方案好: 因为是整体等比例缩放 ,页面里所有的字体大小、间距、图表,都是按设计稿写死的px值,缩放后相对比例完全不变,不会出现"文字变形""某个模块错位"这种问题------本质上是把"适配"这个复杂问题,转化成了"缩放一个固定尺寸的画布"这个简单问题。
方案二:现成的库
实际项目里很多人不会自己手写缩放逻辑,而是用现成的库:v-scale-screen (Vue专用)或者 flexible.js+rem方案 (更早期的移动端适配思路,大屏也能借用)。v-scale-screen内部做的事情,本质上就是刚才讲的transform: scale()那套逻辑,只是封装好了,直接用组件包一层就行。
图表本身怎么处理(ECharts为例,因为你提到过echarts)
图表的宽高,要跟着容器走,不要写死px。 常见做法:
- 容器用百分比或者flex布局撑满
- 监听窗口resize,调用
chartInstance.resize(),让ECharts自己重新计算图表内部的布局
javascript
window.addEventListener('resize', () => {
chartInstance.resize();
});
这里有个细节: 如果用了方案一的整体transform: scale()缩放,图表容器的实际渲染尺寸其实并没有变(浏览器只是视觉上把它放大了,DOM的真实尺寸没变),所以这种情况下反而不需要额外调用chart.resize() ,因为ECharts的画布是跟着容器真实尺寸渲染的,整体缩放不影响这个真实尺寸------这是个容易讲错的细节,很多人会以为"缩放了就要resize",其实整体scale缩放场景下不需要。
总结:
"大屏适配用的是transform: scale方案------页面按设计稿固定尺寸(比如1920x1080)来开发,不考虑适配问题,拿到真实屏幕尺寸后,计算出缩放比例,对整个页面容器做transform: scale等比例缩放,让内容填满实际屏幕,这样能保证所有元素的相对比例、间距、字体都不会变形错位。图表用ECharts的话,正常情况下容器撑满父级就行,如果是窗口真实尺寸变化(不是transform缩放)才需要监听resize去调用chart.resize()。"