关于大屏适配我所知道的

简介: 关于大屏适配我所知道的

image.png


关键词: BI 大屏 数字驾驶舱 适配

典型有三种解决方案:

  1. rem。其实就是监听resize事件,动态更新 html font-size。横竖屏切换的时候会有问题(需要监听屏幕变化重新设置 rootFontSize),需要刷新过才可以
  2. vh/vw/vmin/vmax 新特性,兼容性问题
  3. transform:scale (value) 存在字体可能模糊的情况
  4. 媒体查询 @media

好的大屏适配方案

  • 大屏尺寸不变形
  • 有一边(宽或高)撑满整个窗口(在不变形的前提下)
  • 另外一边不能超出窗口(一边撑满窗口的前提下)
  • 保持大屏清晰度

将大屏的初始化尺寸设置为 1920 * 1080,即宽高比为 16 :9


transform:scale (value)


核心逻辑:通过控制大屏元素的 transform: scale 值来实现大屏的不变形缩放。

/*
* @params id: dom id
* @params type: single | double 单维度还是双维度
*/
function calcDomScale(id, type = 'single') {
  // 大屏初始化尺寸, 宽高比为 16 :9
  const OriginWidth = 1920, OriginHeight = 1080; 
  const scale = Math.min(window.innerWidth / OriginWidth, window.innerHeight / OriginHeight);
  const dom = document.getElementById(id);
  dom.style.transform = `scale(${scale})`
  return false
}

媒体查询 @media


缺点: 页面上所有的元素都得在不同的 @media 中定义一遍不同的尺寸,代价有点高。 如果再多一种屏幕尺寸,就得多写一个 @media 查询块。


/* <375px */
@media screen and (max-width:375px) { 
  .box {
    width: 100%;
  }
}
/* >=375px and <450px */
@media screen and (min-width:375px) and (max-width:450px) {
  .box {
    width: 90%;
  }
}
/* >=450px */
@media screen and (min-width:450px) {
  .col{
    width: 80%;
  }
}

vh/vw

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

这时候百度搜一下 react/vue 项目中如何使用 less 的方法。

// 配置文件 vue.config.js
module.exports = {
  // ...
  css: {
    loaderOptions: {
      less: {
        additionalData: `@import "@/styles/utils.less";`,
      },
    }
  }
}
// 具体使用
// 直接使用 vw 和 vh 函数,将像素值传进去,得到的就是具体的 vw vh单位
.box{
  .px2vw(width, 200);
  .px2vh(height, 200);
  .px2font(16);
  .px2vw(margin-left, 8);
  .px2vh(margin-top, 12);
}
// 定义设计稿的宽高
const originWidth = 1920;
const originHeight = 1080;
// px转vw
export const px2vw = (_px) => {
  return (_px * 100) / originWidth + 'vw';
};
export const px2vh = (_px) => {
  return (_px * 100) / originHeight + 'vh';
};
export const px2font = (_px) => {
  return (_px * 100) / originWidth + 'vw';
};


目录
相关文章
<script setup>形式中props传值
<script setup>形式中props传值
236 1
|
JavaScript API
uniapp使用Vue3挂载函数到全局
uniapp使用Vue3挂载函数到全局
1351 0
【Echarts】封装几个酷炫(发光)图表
【Echarts】封装几个酷炫(发光)图表
【Echarts】封装几个酷炫(发光)图表
|
前端开发 小程序
前端解析支付宝返回form表单,自动跳转支付
前端解析支付宝返回form表单,自动跳转支付
916 1
|
前端开发
原来CSS也能写出这么漂亮的登录页面,分享一个纯CSS样式Login页面
原来CSS也能写出这么漂亮的登录页面,分享一个纯CSS样式Login页面
552 0
|
数据可视化 对象存储
阿里云数字大屏是一个数据可视化展示平台
阿里云数字大屏是一个数据可视化展示平台
936 1
|
机器学习/深度学习 算法 定位技术
美团、滴滴、蔚来、货拉拉、Momenta、易智瑞、昆仑万维等暑期实习、日常实习技术岗面试汇总
美团、滴滴、蔚来、货拉拉、Momenta、易智瑞、昆仑万维等暑期实习、日常实习技术岗面试汇总
286 1
|
资源调度 JavaScript 搜索推荐
服务端渲染:使用Nuxt.js构建Vue SSR应用
【4月更文挑战第22天】本文介绍了如何使用Nuxt.js创建Vue SSR应用。首先确保安装Node.js和npm/yarn,然后全局安装Create Nuxt App,创建项目并选择配置。Nuxt.js提供清晰的项目结构,如`pages/`存放Vue页面。编写简单SSR页面后,启动开发服务器预览。完成开发,使用Nuxt.js命令部署到静态文件托管服务,实现首屏加载优化和SEO提升。Nuxt.js简化了SSR开发,助力高效构建高性能Vue应用。
586 2
spring-state-machine持久化
spring-state-machine持久化
256 0
|
供应链 数据可视化 数据管理
[开源]免费开源MES系统,精美的可视化数字大屏,支持低代码大屏设计
万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、免费MES、免费智能制造系统、免费排产系统、免费排班系统、免费质检系统、免费生产计划系统。