一段代码解决前端大屏项目适配的问题

适配方案

该方案是基于css中的缩放(transform: scale(xxx))的方法来适配不同分辨率下的页面

实现思路

获取当前页面可视化区域的宽高,对比设计稿的宽高,获得一个缩放比例(宽度比 = 当前可视化区域的宽度 / 设计稿的宽度,高度比 = 当前可视化区域的高度 / 设计稿的高度)

如果宽度比小于高度比,则x轴铺满,y轴出现白边(白边可用背景色去进行填充)
在这里插入图片描述
如果高度比小于宽度比,则y轴铺满,x轴出现白边
在这里插入图片描述
如果宽高比相同,则宽高同时铺满视口
在这里插入图片描述

核心代码

		initPpage()

		window.onresize = () => {
			initPpage()
		}
		function initPpage() {
			let $body = document.body;
			let scale = 1; //缩放比例
			let d_width = 1920; //设计图宽度
			let d_height = 1080;//设计图高度
			let c_width = window.innerWidth; //当前视图宽度
			let c_height = window.innerHeight;//当前视图高度
			if (c_width / d_width < c_height / d_height) {
				scale = c_width / d_width
			} else {
				scale = c_height / d_height
			}
			$body.style.width = d_width + 'px';
			$body.style.height = d_height + 'px';
			$body.style.transform = `scale(${scale}) translate(-50%,-50%)`
		}

demo

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			* {
				padding: 0;
				margin: 0;
			}

			body {
				position: absolute;
				top: 50%;
				left: 50%;
				transform-origin: left top;
				overflow: hidden;
				transition: all 0.3s;
			}

			.top-page {
				background-color: yellowgreen;
				width: 100%;
				height: 540px;
				font-size: 40px;
			}

			.bottom-page {
				background-color: cornsilk;
				width: 100%;
				height: 540px;
				display: flex;
				align-items: flex-end;
				font-size: 40px;
			}
		
		</style>
	</head>
	<body id='body'>
		<div class='top-page'>top</div>
		<div class='bottom-page'>bottom</div>

	</body>

	<script>
		initPpage()

		window.onresize = () => {
			initPpage()
		}
		function initPpage() {
			let $body = document.body;
			let scale = 1; //缩放比例
			let d_width = 1920; //设计图宽度
			let d_height = 1080;//设计图高度
			let c_width = window.innerWidth; //当前视图宽度
			let c_height = window.innerHeight;//当前视图高度
			if (c_width / d_width < c_height / d_height) {
				scale = c_width / d_width
			} else {
				scale = c_height / d_height
			}
			$body.style.width = d_width + 'px';
			$body.style.height = d_height + 'px';
			$body.style.transform = `scale(${scale}) translate(-50%,-50%)`
		}
		
	</script>
</html>

可能遇到的问题

1.页面出现白边

页面出现白边的情况是正常的,因为要保持页面元素的宽高比,防止页面元素出现失真、变形的问题
举个例子
在a分辨率的屏幕上(1920 * 1080),页面上绘制了一个a元素
在1920 * 1080的分辨率下,a元素显示的是一个正方形
在这里插入图片描述
当把页面放到b分辨率的屏幕(1920 * 540)上的时候,页面宽度不变,高度降低了一半,就会出现失真的状况,a元素从正方形变成了长方形

在这里插入图片描述
为了防止元素出现失真的状况,需要将宽度连同高度一起缩放
在这里插入图片描述

2.一些第三放ui框架(elementUI等)下拉框的弹层可能会出现跑偏的问题

问题出现的原因:使用了transform之后,视觉上元素的大小发生了改变,但是在现实中,页面元素的宽高还是没缩放之前的样子,只是视觉上发生了变化(可以去官网看一下css中transform的底层原理)
该方案无法对第三方ui库进行适配,建议不要使用第三方ui库,如果已经使用了,则需要手动去调整elementUI的源码或式样,

以下拉框举例,默认情况下,下拉款的弹层是插入到body里的,只要将下拉框的popper-append-to-body属性设置为false,让其插入到下拉框节点内部就可以避免定位跑偏的问题了

### 关于前端适配中的 `libflex` 使用 目前关于 `libflex` 的具体文档和官方支持较少,但从其命名推测,它可能是一个基于 Flexbox 布局的库或工具,旨在简化复杂布局的设计与实现。以下是结合已有知识以及参考资料的内容来解答如何在前端适配中使用类似的解决方案。 #### 1. 适配的核心原理 适配的关键在于动态调整页面元素的比例,使其适应不同的幕分辨率。通常的做法是通过 CSS 和 JavaScript 结合的方式完成比例缩放。例如,可以定义一个根容器 `.screen` 并设置固定的宽高(如 1920×1080),再利用 `transform: scale()` 实现缩放[^3]。 ```css .screen { display: inline-block; width: 1920px; /* 设计稿宽度 */ height: 1080px; /* 设计稿高度 */ transform-origin: 0 0; position: absolute; left: 50%; top: 50%; } ``` 为了使该容器能够自适应不同设备的视口小,可以通过 JavaScript 动态计算并应用缩放因子: ```javascript function setScale() { const screenElement = document.querySelector('.screen'); const screenWidth = window.innerWidth; const screenHeight = window.innerHeight; const designWidth = 1920; // 设计稿宽度 const designHeight = 1080; // 设计稿高度 const scaleX = screenWidth / designWidth; const scaleY = screenHeight / designHeight; const scale = Math.min(scaleX, scaleY); // 取较小值以保持内容不被裁剪 screenElement.style.transform = `scale(${scale})`; } window.addEventListener('resize', setScale); setScale(); // 初始化调用 ``` 上述代码实现了基本的适配逻辑,而如果引入类似于 `libflex` 的第三方库,则可能会进一步优化这一过程。 --- #### 2. 类似 `libflex` 工具的功能假设 虽然未找到具体的 `libflex` 官方文档,但可以根据常见的适配框架功能推断其作用范围: - **自动处理缩放**:提供内置函数或配置项,减少手动编写缩放逻辑的工作量。 - **响应式网格系统**:允许开发者快速构建灵活的布局结构,尤其适合多列或多区域场景。 - **跨浏览器兼容性**:封装常见兼容性问题解决方法,降低调试成本。 以下是一段模拟的伪代码示例,展示如何使用假想的 `libflex` 库进行适配: ```javascript import LibFlex from 'libflex'; const config = { designSize: { width: 1920, height: 1080 }, // 设计稿尺寸 containerSelector: '.screen', }; LibFlex.init(config); // 自动监听窗口变化并更新缩放 LibFlex.onResize(() => console.log('Screen scaled successfully!')); ``` 此代码片段展示了初始化 `libflex` 所需的基本参数及其核心功能——自动化缩放管理。 --- #### 3. 探索替代方案 如果没有明确的 `libflex` 资料可用,也可以考虑其他成熟的开源项目作为备选方案: - **PostCSS Preset Env**: 提供现代 CSS 特性的向下兼容能力,便于实现更复杂的样式规则。 - **Ant Design Pro**: 集成了丰富的组件库和支持多种布局模式,特别适合企业级开发。 - **Vue.js/React UI Kits**: 如 Element Plus 或 Antd,提供了开箱即用的响应式特性。 这些工具可以帮助弥补潜在的技术空白,并提升整体开发效率。 --- ### 总结 尽管当前缺乏针对 `libflex` 的详尽说明,但仍可通过现有技术栈实现相似的目标。建议优先研究社区资源或尝试联系作者获取更多信息。同时,掌握基础的手动适配技巧也是不可或缺的能力之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾里桃花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值