0


前端大屏适配方案

  1. 随着数据可视化要求的不断提高,对前端来说,在大屏方面的开发需求越来越严格,各式各样的大屏层出不穷。同时对于大屏的各种应用也越来越多样,这就造成了“**大屏不单单只是放在固定尺寸屏幕上去看,而是要在不同视口的屏幕上去浏览,去操作**”这一现象。
  2. 所以,对于大屏来说,虽说是在原型设计时,固定了大屏的尺寸(比如 **1920×1080**),但是在实际使用上,又要求在每个人的不同终端上,都要显示出统一的效果。这就要求,在开发过程中,需要有一个统一的适配方案,去适配不同视口的终端。下面就是个人结合网络上不同需求背景下的不同方案效果,总结出适用于本人自己**大屏适配方案**。

一、适配目的

  1. 在未使用任何自适应方案时,我们开发的大屏页面只能在固定的尺寸视口下浏览观看,一旦视口变化,将导致页面布局混乱,效果丢失。
1920×1080(正常情况下)
1600×783
2000×1120

  1. 当使用类似于**rem**、**vw**、**百分比**等适配方案时,虽说可以实现不同视口的自适应。但是,前端能拿到的原型上,一般来说标注宽度、高度、位置等尺寸指标,都是按照**px**提供,这就需要前端开发在经过一层计算,有一些麻烦。本适配方案,可解决以上这些问题。

二、适配方案

2.1 适配原理

  1. 基本原理,是通过使用**transform: scale**方法,对全局页面进行缩放处理,以适配不同的终端视口。具体操作:(1920×1080原型为例)
  1. 固定body元素,设置body宽高为 1920px 1080px
  2. 获取当前视口宽度 clientW clientH
  3. 利用原型宽高以及视口宽高获取缩放比例(radioW = 1920px / clientW; radioH = 1080px / clientH)
  4. 全局增加监听事件,监听视口变化,对body进行缩放。

2.2 方案代码

核心代码
  1. const bodyDom = document.body;
  2. // 设置body为原型图高度、宽度
  3. bodyDom.style.width = `1920px`;
  4. bodyDom.style.height = `1080px`;
  5. const width = document.documentElement.clientWidth;
  6. const height = document.documentElement.clientHeight;
  7. // 计算缩放比例
  8. const radioWidth = (width / w);
  9. const radioHeight = (height / h);
  10. bodyDom.style.transform = `scale(${radioWidth}, ${radioHeight})`;
  11. bodyDom.style.transformOrigin = 'left top';
  12. bodyDom.style.backgroundSize = `100% 100%`;
  13. // 给一个深色的底色,背景为铺满导致漏出白色底色
  14. bodyDom.style.backgroundColor = '#0D0E41';
  15. document.documentElement.style.overflowX = 'hidden';
  16. document.documentElement.style.overflowY = 'hidden';
适配方案封装(React为例)

封装成通用父组件

  1. import React, { useEffect } from 'react';
  2. export const screenScale = (w = 1920, h = 1080) => {
  3. const bodyDom = document.body;
  4. bodyDom.style.width = `${w}px`;
  5. bodyDom.style.height = `${h}px`;
  6. const width = document.documentElement.clientWidth;
  7. const height = document.documentElement.clientHeight;
  8. const radioWidth = (width / w);
  9. const radioHeight = (height / h);
  10. bodyDom.style.transform = `scale(${radioWidth}, ${radioHeight})`;
  11. bodyDom.style.transformOrigin = 'left top';
  12. bodyDom.style.backgroundSize = `100% 100%`;
  13. bodyDom.style.backgroundColor = '#0D0E41';
  14. document.documentElement.style.overflowX = 'hidden';
  15. document.documentElement.style.overflowY = 'hidden';
  16. }
  17. const ScreenComponent = ({ children, width, height }) => {
  18. useEffect(() => {
  19. screenScale(width, height);
  20. // 配置全局监听视口变化
  21. window.addEventListener('resize', () => screenScale(width, height));
  22. return () => {
  23. window.removeEventListener('resize', () => screenScale(width, height));
  24. const bodyDom = document.body;
  25. const htmlDom = document.documentElement;
  26. bodyDom.removeAttribute('style');
  27. htmlDom.removeAttribute('style');
  28. };
  29. }, [])
  30. return (
  31. <>{children}</>
  32. )
  33. }
  34. export default ScreenComponent;

子组件使用

  1. import React from "react";
  2. import ScreenComponent from "@/utils/screenSize.js";
  3. import styles from './index.less';
  4. const Index = () => {
  5. return (
  6. <ScreenComponent width={1920} height={1080}>
  7. <div className={styles.container}>
  8. ...
  9. </div>
  10. </ScreenComponent>
  11. )
  12. }

2.3 方案优势

  1. 方便开发。一般前端收到的原型文件,不管是蓝湖还是html文件,大都是以px作为长度单位。使用本适配方案开发后,可以在开发阶段直接使用原型图上编辑的px单位即可。
  2. 布局简单,还原度高。在页面上,我们可以直接使用在原型图上编辑的position + px 进行页面元素的排版布局。这样既使开发效率得到了提高,并且能做到原型图的1:1完美实现。

三、使用细节

3.1 css样式

  1. 使用方案时,在配合**React**、**Vue**等脚手架开发时,可能会出现**body**内元素未撑满整个**body**,此时如果给内部元素容器设置背景图时,会发现背景图不是全屏铺满状态。此时可以选择将背景图设置到**body**上(以**React**为例)。同时,使用脚手架时,还可能会出现,脚手架默认会在元素容器外部加一层layout布局元素,且布局元素默认会加上一层背景元素,会挡住背景图。所以就需要使用全局样式取消一下layout的默认样式。
  1. body {
  2. background-image: url('@/assets/screen/dataAssets/bg.png');
  3. background-size: 100% 100%;
  4. background-repeat: no-repeat;
  5. }
  6. :global {
  7. .ant-layout {
  8. background-color: rgba(0, 0, 0, 0);
  9. }
  10. .ant-layout-content {
  11. background-color: rgba(0, 0, 0, 0) !important;
  12. }
  13. }

3.2 长度单位

  1. 前文提到,使用此适配方案可以避免一些单位换算的计算过程。是因为此方案采用scale整屏缩放的原理,所以无需使用rememvw等长度单位,直接使用px即可;对于元素位置,也建议直接使用position: relative; position: absolute;进行布局定位。

四、实现效果

4.1 正常情况

4.2 1600*783

4.3 2000×1100

五、总结

  1. 本适配方案是本人结合在不同项目中使用到的不同大屏适配方案,所总结出的,个人感觉使用起来还算相对方便,效果较好的大屏开发方案。如果有其他问题,欢迎大家提出来一起探讨。后续有其他理解,也会持续更新。

本文转载自: https://blog.csdn.net/Reset_Xc/article/details/143408778
版权归原作者 lxc_辰 所有, 如有侵权,请联系我们删除。

“前端大屏适配方案”的评论:

还没有评论