数据可视化--大屏适配(一)
2022-12-11 本文已影响0人
coderhzc
一.大屏的基本认识:
1. PC端电脑:1920px * 1080px (当然也有少部分电脑是支持输出4k屏, 比如:小米笔记本等)
2. 移动设备: 750px * auto
3. 大屏设备是啥?
-- 在我们的生活中,经常会见到一些比较大的屏幕,比如:指挥大厅、展厅、展会中的大屏。这些设备就可以称之为大屏设备,
当然1920*1080 和 3840*2160(4k 屏 )也可以说是属于大屏。
4. 大屏的应用场景
-- 通常用在数据可视化,借助于图形化手段,清晰有效地传达与沟通信息
-- 比如用在:零售、物流、电力、水利、环保、交通、医疗等领域。
5. 大屏的硬件设备的分类:
-- 拼接屏、LED屏、投影等。
6. 大屏设备-拼接屏
-- 拼接屏 顾名思义就是很多屏幕按照一定拼接方式拼接而成。
-- 其实可以理解成是由很多电视(显示屏)拼接而成。
-- 常见的使用场景有指挥大厅、展厅、展会等等
7. 拼接方式取决于使用场景的需求,如下例子:
-- 1920px * 1080px,即 1 * 1 个 显示屏(16 : 9)
-- 3840 * 2160(4k 屏 ),即 2 * 2 个显示屏(16 : 9)
-- 5760 * 3240,即 3 * 3 个显示屏(16 : 9)
-- 7680 * 3240,即 4 * 3 个显示屏(64 : 27)
-- 9600 * 3240,即 5 * 3 个显示屏(80 : 27)
8. 大屏设备- LED屏
LED屏
-- LED 也是现在大屏中常用的硬件,它是由若干单体屏幕模块组成的,它的像素点计算及拼接方式与拼接屏有很大区别。
-- LED 可以看成是矩形点阵,具体拼接方式也会根据现场实际情况有所不同,拼接方式的不同直接影响到设计的尺寸规则。
-- LED 屏有很多规格,各规格计算方法相同。
-- ✓ 比如,我们用单体为 500 * 500 的作为标准计算,每个单体模块像素点横竖都为 128px
-- ✓ 如右图,横向 12 块竖向 6 块,横向像素为 128*12=1536px,竖向 128*6=768px。可以使用横竖总像素去设计。
-- ✓ 最终算出的屏幕尺寸:1536px * 768px
9. 定设计稿尺寸 -拼接屏
拼接屏
-- 大多数屏幕分辨率是 1920*1080。当然也会有一些大屏,比如6*3的拼接屏,横向分辨率为 6*1920=11520px。竖向分辨率为 3*1080=3240px。设计可以按照横竖计算后的总和(11520px * 3240px)作为设计尺寸。
-- 这种尺寸过大的就不太适合按原尺寸设计,那怎么判断什么时候可以按照总和设计,什么时候最好不要按照总和设计。这有一个关键的节点 4K,超过 4K 后现有硬件会产生很多问题,例如:卡顿,GPU 压力过大,高负荷运行等等。
-- 正常设计建议最好是保持在 4K 内,由于硬件问题,所以现在大家采用的都是输出 4K 及以下,既保证流畅度又能在视觉上清晰阅读。
-- 所以设计时也要保持同样的规则。保持大屏的比例等比缩放即可。
-- 注:最好是按照硬件的输出分辨率设计(关键),因为按照输出分辨率设计,一定不会出错。
◼ 比如
-- 1920px * 1080px(1*1),设计搞尺寸 :1920px * 1080px 。
-- 3840 * 2160(2*2 4k 屏 ),设计搞尺寸 : 3840 * 2160 。
-- 5760 * 3240(3*3),设计搞尺寸 : 5760 * 3240 。
-- 7680 * 3240(4*3),设计搞尺寸 : ( 3840 * 1620 需要出 1倍图 和 2倍图, 7680 * 3240 )
-- 9600 * 3240(5*3),设计搞尺寸 : 比如:4800 * 1620,需要出 1倍图 和 2倍图
10. 定设计稿尺寸 -LED屏
LED屏
-- LED 大屏是由若干单体屏幕模块组成的,LED 屏有很多规格,但是规格计算方法相同。
-- 比如:我们用单体为 500 * 500 的作为标准计算,每个单体模块像素点横竖都为 128px。
-- 如图横向 12 块竖向 6 块,横向像素为 128*12=1536px,竖向 128*6=768px。可以使用横竖总像素去设计。
-- 此处规则和之前的拼接屏一样,如果超过 4K 像素时可以等比缩放,建议尽量保持在 4k 及以下。
◼ 比如
-- 1536px * 768px,设计搞尺寸 : 1536px * 768px 。
-- 4608 * 3072,设计搞尺寸 : 4608 * 3072 。
-- 9216 * 6144,设计搞尺寸 :
-- ✓ 比如:4608 * 3072,需要出 1倍图 和 2倍图
11. 设计稿尺寸-移动端大屏
-- 对于移动端的大屏展示,基本按照实际尺寸设计即可,比如:
-- 750px * Auto,设计搞尺寸 : 750px * Auto 。
12. 大屏设计稿尺寸的总结:
-- 设计尺寸建议按照输出分辨率设计(重点)
-- 拼接后像素在 4k 左右直接按照总和设计就行
-- 总和设计建议不要超过 4k,可以按比例缩小设计搞(非固定,超过也是可以,只是强烈建议)
-- 建议定设计搞尺寸前,先了解硬件及信号输入输出,确定设计搞的尺寸。
-- 特殊尺寸,需到现场调试最佳设计搞的尺寸。
13.大屏适配方案的总结:
-- 特殊尺寸不要考虑适配电脑屏幕又适配拼接屏,因为完全没有必要,也不可能一稿既适配电脑也适配各种尺寸大屏。
-- 这种情况应该优先考虑目标屏幕的适配,要针对性设计,而在小屏根据等比例缩放显示,这才是最佳的解决方法。
14. 大屏适配方案
在学习大屏适配方案之前,我们现在回顾一下移动端的适配方案有哪些?
-- 方案一:百分比设置;
-- ✓ 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一;
-- ✓ 所以百分比在移动端适配中使用是非常少的;
-- 方案二:rem单位 + 动态设置 html 的 font-size;
-- 方案三:vw单位(推荐);
-- 方案四:flex的弹性布局(推荐) ;
◼ 大屏的幕尺寸通常也是非常多的,很多时候我们是希望页面在不同的屏幕尺寸上显示不同的尺寸,那大屏的适配方案有哪些?
-- 方案一:百分比设置;
-- 方案二:rem 单位 + 动态设置 html 的 font-size;
-- 方案三:vw 单位;
-- 方案四:flex 弹性布局;
-- 方案五:scale 等比例缩放(推荐)
二. 新建 大屏设备
image.png三. 大屏适配方案1 – rem + font-size
image.png四. 大屏适配方案2 - vw
image.png五. 大屏适配方案3(推荐) - scale
image.png六. 三种适配方案的对比
image.png七. 大屏开发 注意事项
image.png八. 大屏项目适配
image.png九. 在项目中新建一个 flexbel.js 关于适配大屏脚本
(function (win, lib) {
var doc = win.document;
var docEl = doc.documentElement;
var metaEl = doc.querySelector('meta[name="viewport"]');
var flexibleEl = doc.querySelector('meta[name="flexible"]');
var dpr = 0;
var scale = 0;
var tid;
var flexible = lib.flexible || (lib.flexible = {});
if (metaEl) {
console.warn("将根据已有的meta标签来设置缩放比例");
var match = metaEl
.getAttribute("content")
// eslint-disable-next-line no-useless-escape
.match(/initial\-scale=([\d\.]+)/);
if (match) {
scale = parseFloat(match[1]);
dpr = parseInt(1 / scale);
}
} else if (flexibleEl) {
var content = flexibleEl.getAttribute("content");
if (content) {
// eslint-disable-next-line no-useless-escape
var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
// eslint-disable-next-line no-useless-escape
var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
if (initialDpr) {
dpr = parseFloat(initialDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
}
}
if (!dpr && !scale) {
// var isAndroid = win.navigator.appVersion.match(/android/gi);
var isIPhone = win.navigator.appVersion.match(/iphone/gi);
var devicePixelRatio = win.devicePixelRatio;
if (isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
dpr = 2;
} else {
dpr = 1;
}
} else {
// 其他设备下,仍旧使用1倍的方案
dpr = 1;
}
scale = 1 / dpr;
}
docEl.setAttribute("data-dpr", dpr);
if (!metaEl) {
metaEl = doc.createElement("meta");
metaEl.setAttribute("name", "viewport");
metaEl.setAttribute(
"content",
"initial-scale=" +
scale +
", maximum-scale=" +
scale +
", minimum-scale=" +
scale +
", user-scalable=no"
);
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl);
} else {
var wrap = doc.createElement("div");
wrap.appendChild(metaEl);
doc.write(wrap.innerHTML);
}
}
function refreshRem() {
var width = docEl.getBoundingClientRect().width;
if (width / dpr > 540) {
width = width * dpr;
}
var rem = width / 10;
docEl.style.fontSize = rem + "px";
flexible.rem = win.rem = rem;
}
win.addEventListener(
"resize",
function () {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
},
false
);
win.addEventListener(
"pageshow",
function (e) {
if (e.persisted) {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}
},
false
);
if (doc.readyState === "complete") {
doc.body.style.fontSize = 12 * dpr + "px";
} else {
doc.addEventListener(
"DOMContentLoaded",
function () {
doc.body.style.fontSize = 12 * dpr + "px";
},
false
);
}
refreshRem();
flexible.dpr = win.dpr = dpr;
flexible.refreshRem = refreshRem;
flexible.rem2px = function (d) {
var val = parseFloat(d) * this.rem;
if (typeof d === "string" && d.match(/rem$/)) {
val += "px";
}
return val;
};
flexible.px2rem = function (d) {
var val = parseFloat(d) / this.rem;
if (typeof d === "string" && d.match(/px$/)) {
val += "rem";
}
return val;
};
})(window, window["lib"] || (window["lib"] = {}));
// 在Vue 项目中使用:
import "./utils/flexible";