前端大屏常用的几种适配方案

news2024/10/5 19:15:11
方 案实现方式优点缺点
vm vh1.按照设计稿的尺寸,将px按比例计算转为vw和vh1.可以动态计算图表的宽高,字体等,灵活性较高 2.当屏幕比例跟 ui 稿不一致时,不会出现两边留白情况1.每个图表都需要单独做字体、间距、位移的适配,比较麻烦
手机$12
导管$1
!

方案一:vw vh

1.当屏幕正好为16:9的时候
2.当屏幕的尺寸比例大于 16:9 (左右拉长)
在这里插入图片描述
3.当屏幕的尺寸比例小于 16:9 时(左右变窄或者上下拉高)

在这里插入图片描述
实现方法:
css 方案 - sass
utils.scss

// 使用 scss 的 math 函数,https://sass-lang.com/documentation/breaking-changes/slash-div
@use "sass:math";
 
// 默认设计稿的宽度
$designWidth: 1920;
// 默认设计稿的高度
$designHeight: 1080;
 
// px 转为 vw 的函数
@function vw($px) {
  @return math.div($px, $designWidth) * 100vw;
}       
 
// px 转为 vh 的函数
@function vh($px) {
  @return math.div($px, $designHeight) * 100vh;
}
复制代码

路径配置只需在vue.config.js里配置一下utils.scss的路径,就可以全局使用了
vue.config.js

module.exports = {
	css: {
		loaderOptions: {
			sass: {
				prependData: `@import "@/assets/css/utils.scss";`
			}
		}
	},
}.vue 中使用
<template>
    <div class="box">   
    </div>
</template>
 
<script>
export default{
    name: "Box",
}
</script>
 
<style lang="scss" scoped="scoped">
/* 
 直接使用 vw 和 vh 函数,将像素值传进去,得到的就是具体的 vw vh 单位   
 */
.box{
    width: vw(300);
    height: vh(100);
    font-size: vh(16);
    background-color: black;
    margin-left: vw(10);
    margin-top: vh(10);
    border: vh(2) solid red;
}
</style>

css 方案 - less

utils.less
@charset "utf-8";
// 默认设计稿的宽度
@designWidth: 1920;
// 默认设计稿的高度
@designHeight: 1080;
 
.px2vw(@name, @px) {
  @{name}: (@px / @designWidth) * 100vw;
}
 
.px2vh(@name, @px) {
  @{name}: (@px / @designHeight) * 100vh;
}
 
.px2font(@px) {
  font-size: (@px / @designWidth) * 100vw;
}

路径配置在vue.config.js里配置一下utils.less
<style lang="less" scoped="scoped">
/* 
 直接使用 vw 和 vh 函数,将像素值传进去,得到的就是具体的 vw vh单位   
 */
.box{
    .px2vw(width, 300);
    .px2vh(height, 100);
    .px2font(16);
    .px2vw(margin-left, 300);
    .px2vh(margin-top, 100);
    background-color: black;
}
</style>

定义 js 样式处理函数
// 定义设计稿的宽高
const designWidth = 1920;
const designHeight = 1080;
 
// px转vw
export const px2vw = (_px) => {
  return (_px * 100.0) / designWidth + 'vw';
};
 
export const px2vh = (_px) => {
  return (_px * 100.0) / designHeight + 'vh';
};
 
export const px2font = (_px) => {
  return (_px * 100.0) / designWidth + 'vw';
};

屏幕变化后,图表自动调整
这种使用方式有个弊端,就是屏幕尺寸发生变化后,需要手动刷新一下才能完成自适应调整

为了解决这个问题,你需要在各个图表中监听页面尺寸变化,重新调整图表,在 vue 项目中,也可以借助element-resize-detector,最好封装个 resize 的指令,在各图表中就只要使用该指令就可以了,毕竟作为程序员,能偷懒就偷懒
解决方案一

  1. 安装 element-resize-detector
npm install element-resize-detector --save
  1. 封装成自定义指令使用
// directive.js
import * as ECharts from "echarts";
import elementResizeDetectorMaker from "element-resize-detector";
import Vue from "vue";
const HANDLER = "_vue_resize_handler";
function bind(el, binding) {
  el[HANDLER] = binding.value
    ? binding.value
    : () => {
        let chart = ECharts.getInstanceByDom(el);
        if (!chart) {
          return;
        }
        chart.resize();
      };
  // 监听绑定的div大小变化,更新 echarts 大小
  elementResizeDetectorMaker().listenTo(el, el[HANDLER]);
}
function unbind(el) {
  // window.removeEventListener("resize", el[HANDLER]);
  elementResizeDetectorMaker().removeListener(el, el[HANDLER]);
  delete el[HANDLER];
}
// 自定义指令:v-chart-resize 示例:v-chart-resize="fn"
Vue.directive("chart-resize", { bind, unbind });
  1. main.js 中引入

import '@/directive/directive';
  1. html 代码中使用
<template>
  <div class="linechart">
    <div ref="chart" v-chart-resize class="chart"></div>
  </div>
</template>

这里要注意的是,图表中如果需要 tab 切换动态更新图表数据,在更新数据时一定不要用 echarts 的 dispose 方法先将图表移除,再重新绘制,因为 resize 指令中挂载到的图表实例还是旧的,就监听不到新的 chart 元素的 resize 了,更新数据只需要用 chart 的 setOption 方法重新设置配置项即可。
解决方案二
1.在echarts中可以echarts.init(chatDom).resize()来解决宽高的自适应问题

		let chatDom = document.getElementById('main');
		let myChart = this.$echarts.init(chatDom);

		//根据父盒子的尺寸调整echarts的大小
		setTimeout(() => {
			window.addEventListener('resize', () => {
				this.$echarts.init(chatDom).resize();
			});
		}, 20);

2.在DataV中可以添加key来解决

<dv-water-level-pond :config="config2" :key="key" ref="pie2" />
data(){ 
   return {
   key: 1
   	}
  },
  	mounted() {
		this.pieOutlineFunc();
		},
  	methods: {
		pieOutlineFunc() {
			var _this = this;
			window.addEventListener('resize', function (e) {
				_this.$nextTick(() => {
					console.log(_this.$refs.pie2);
					_this.key++;
				});
			});
		}
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

磨金石教育摄影技能干货分享|看看大师们如何把“树”拍成艺术品

树&#xff0c;可以说是我们生活中最为常见的物种了。 在不同的地域&#xff0c;不同的气候环境下&#xff0c;生长着不同的树种。 北方的白桦树、杨树、梅花&#xff1b;南方的凤凰花、榕树、梧桐等等。 无论哪个地方的树&#xff0c;都有别样的姿态。 1、相机作画 白雪没有覆…

python实验实践【2】深度学习的python包

python包的管理是使用python进行实验过程中最为重要的一环&#xff0c;很多时候运行他人代码失败的原因是没能按照对方的要求配置python包库。本篇博客重点介绍深度学习场景中python包的管理。 目录python包版本选择python包安装python包版本选择 使用pytorch进行深度学习训练…

AndroidRN的混合集成 下载不了RN的依赖可以看看 好使

一、混合开发 App 混合开发&#xff0c;指的是一个 App 部分功能用 Native 构建&#xff0c;其他功能使用跨端框架进行构建&#xff0c;最常见的场景是&#xff0c;Native 作为一个可工程&#xff0c;其实业务开发使用垮端框架进行开发。目前&#xff0c;比较流行的跨端框架有…

ORB-SLAM3算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中&#xff0c;因此在tracking中没有为imu模式设置单独的初始化函数&#xff0c;而IMU的初始化是在localMapping中实现的。 很有用的参考链接&#xff1a;https://cloud.tencent.com/developer/article/1761043 1双目…

Python 基础教程(1)

1.翻转字符串 def reverseWords(input):# 通过空格将字符串分隔符&#xff0c;把各个单词分隔为列表inputWords input.split(" ")# 翻转字符串# 假设列表 list [1,2,3,4], # list[0]1, list[1]2 &#xff0c;而 -1 表示最后一个元素 list[-1]4 ( 与 list[3]4 一样…

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST 安装LibTorch 进入pytorch官网地址,选则LibTorch版本将LibTorch安装包解压到libtorch-path目录中,libtorch-path是自定义的LibTorch安装目录。

【SpringCloud Alibaba】Sentinel持久化结合Nacos

在前面学习完Sentinel的流控规则以及Nacos时&#xff0c;就是最后的Sentinel持久化了。需要持久化的原因是因为每次启动Sentinel都会使之前配置的规则就清空了&#xff0c;这样每次都要再去设定规则显得非常的麻烦。 思路就是&#xff1a;将流控规则配置进Nacos服务注册中心中&…

【实时数仓】DWS层之关键词主题表(FlinkSQL)、数据可视化接口、Sugar数据大屏、总成交金额接口实现

文章目录一 DWS层-关键词主题表(FlinkSQL)1 过滤数据2 利用UDTF进行拆分&#xff08;1&#xff09;拆分结果&#xff08;2&#xff09;Join 表函数 (UDTF)&#xff08;3&#xff09;代码3 分组、开窗、聚合计算4 转换为流并写入ClickHouse&#xff08;1&#xff09;在ClickHous…

大数据网站攻击实时项目架构

随着互联网的流行&#xff0c;网站安全问题就日益突出&#xff0c;但绝大多数的网站开发与建设公司只考虑正常用户的稳定使用&#xff0c;而对于网站安全方面了解甚少&#xff0c;发现网站安全存在问题和漏洞&#xff0c;其修补方式只能停留在页面代码的删除或者是恢复网站备份…

SpringBoot系列之SpringBoot启动流程详解

文章目录前言一、SpringBoot流程分析-初始化二、SpringBoot流程分析-run总结前言 SpringBoot的启动流程在我们面试的时候会经常被问&#xff0c;接下来我们根据源码来分析了解下SpringBoot是怎么启动的 一、SpringBoot流程分析-初始化 首先对SpringBoot主启动类进行debug&…

通用企业智能制造ERP源码 制造业通用ERP系统源码 工厂ERP源码C# web ASP.NET 源码

管理控制台 一&#xff0c;基础档案 客户档案、 供应商档案 、外协档案 、 物料档案、 产品档案 产品BOM 、 模具档案、 工价档案 、 人员档案 二&#xff0c;样品开发 产品开发 样品登记 产品开发&#xff1a;开发编号、设计来源、系列号、中英文设计名称、最后期限、…

Nginx由浅入深

一、Nginx简介 1、Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新…

医院医疗信息管理系统源码 成熟EMR电子病历系统源码

医院医疗信息管理系统源码 成熟EMR电子病历系统源码 多家二甲医院在用&#xff0c;功能模块如下所示&#xff1a; 1.住院医生站 2.住院护士站 3.病案浏览工作站 4.质量控制工作站 5.系统维护工作站 开发环境 &#xff1a;VS2010 C# ORACLE 系统简介&#xff1a; 1各种记…

漏洞发现之操作系统

漏洞发现之操作系统1.系统漏洞1.1.系统漏洞介绍1.2.系统漏洞危害1.3.系统漏洞防范2.名词介绍2.1.CVSS2.2.CVE2.3.POC/EXP3.探针3.1.探针介绍3.2.探针工具介绍3.3.Goby3.3.1.Goby介绍3.3.2.下载地址3.3.3.Goby使用3.3.3.1.切换中英文3.3.3.2.建立扫描任务3.3.3.3.资产内容3.3.3.…

深入理解 FilterChainProxy【源码篇】

目录FilterChainProxy源码分析FilterChainProxy 源码-全局属性doFilter 方法doFilterInternal 方法VirtualFilterChain最后RequestRejectedHandler引用FilterChainProxy 在一个 Web 项目中&#xff0c;请求流程大概如下图所示&#xff1a; 请求从客户端发起&#xff08;例如浏…

TechG年度科技行业盛会来袭,深兰科技展台亮点抢先看!

2022年12月29日——31日&#xff0c;科技行业盛会「上海国际消费电子技术展(TechG)将在南京举办&#xff0c;深兰科技机器人产业集团将携人工智能机器人产品“家族”亮相展会&#xff0c;全面展示先进的人工智能机器人技术&#xff0c;呈现安全、高效、新潮的机器人应用场景。 …

D. Lucky Chains edu139 div2

Problem - D - Codeforces 题意是给你a和b&#xff0c;要求__gcd(ak,bk)1的k最多可以增加多少个1 分析&#xff1a; 遇到这种的最大公约数的问题&#xff0c;有很大概率都是推公式&#xff0c;以及使用筛法去把所有的质数筛出来利用质因子去缩短时间 这题就是一个推公式的题…

【UE4 第一人称射击游戏】11-武器跟随鼠标移动并添加开火音效

上一篇&#xff1a; 【UE4 第一人称射击游戏】10-添加冲刺功能 本篇效果&#xff1a; 步骤&#xff1a; 1.打开“SWAT_AnimBP”&#xff0c;添加3个“变换&#xff08;修改&#xff09;骨骼”节点 选中第一个“变换&#xff08;修改&#xff09;骨骼”节点&#xff0c;在细节…

JAVA——把一批压缩文件中存放的部分数据进行处理(替换)

JAVA——把一批压缩文件中存放的部分数据进行处理&#xff08;替换&#xff09;一、需求二、分析三、具体实现1.解压压缩文件2.读取解压后的文件并且按照一定逻辑处理3.把文件压缩存储4.方法的调用5.需要添加的依赖四、执行结果五、用到的工具类六、可以改进的地方1.文件处理完…

OpenText Exceed TurboX 客户案例——SMS 集团

SMS 集团通过 OpenText 提高工程师的工作效率。OpenText Exceed TurboX 帮助该制造商提高生产力和可靠性、降低成本并实现全球协作。 SMS集团存在的挑战 需要一个可以在全球范围内轻松访问的解决方案&#xff1b;需要一个系统&#xff0c;能够无缝运行图形要求苛刻的基于服务…