PC大屏自适应
通常来说PC端的页面并不像移动端页面那样对屏幕大小和分别率有那么强的依赖。一般的页面都是取屏幕中间的一块宽度(1280px), 两边留白, 高度随着内容的长度滚动。这样无论窗口怎么变化,页面都是可用的。比如,我们的这个页面. 然而也有少数的页面,天生就是要在 pc 端全屏显示的,其中最为典型的代表就是全屏的 dashboard 页面。比如:
当然,如果 dashboard 页面是内嵌在一些管理页面里的,通常是允许滚动的。
但是,如果 dashboard 是用于官方宣传,比如在电视机或者广告屏上的展示的时候,通常是不允许滚动条出现的。比如:
这种 dashboard 有个帅气的名字叫数据可视化。
通常的做法
为了实现全屏的这种 dashboard, 通常的做法就是要对宽度和高度都做百分比(网格)来实现了。但是这种方案的缺点在于:
- 实现太麻烦。设计师给的设计稿通常是 px 为单位标注的,我们需要仔细的计算宽度和高度的比例,然后小心处理页面的布局。
- 难以处理屏幕宽高比与设计图不符时,带来的元素变形。所以最后展示的屏幕不能和设计稿的屏幕的宽高比差距太大。
比如,下面这个简单的页面就是用百分比方案来做的。设计师给的图的比例为 16: 9。
当窗口比例是 16 : 9 的时候黄色的长方形显示符合设计,当窗口变成正方形的时候,黄色部分也跟着变方了,这必然会影响显示效果。
可以在浏览器中打开,改变窗口大小页面来体验这个百分比方案。
理想的效果
我心目中的理想效果可能是像下面这个页面一样,无论窗口怎么变,我们的内容都保持原来的比例,并尽量占满窗口(类似 background contain 的效果)。
- 屏幕尺寸和设计稿比例(16:9)一致时,占满屏幕
- 屏幕尺寸比设计图比例瘦时,上下留白,左右占满,并上下居中, 显示的比例保持16:9
- 屏幕尺寸比设计图比例胖时,左右留白,上下占满,并左右居中, 显示的比例保持16:9
可以在浏览器中打开,改变窗口大小页面来体验这个flexible方案
rem 方案
熟悉移动端的自适应方案的朋友对 rem 适应方案,肯定不陌生,最出名的就是阿里的 lib-flexible 方案。可能你已经猜到,本文的这个方案肯定也是基于 rem 的.
rem (font size of the root element), 是 css3 的引入的一个大小单位。即相对于根元素的 font-size 值的大小。所谓根元素在网页里一般就是 html. 举例说明:下例中,html 的 font-size 大小
是 20px, 那么 1.4rem 和 2.4 rem 就分别代表着 28px 和 48px 了。
html { font-size: 20px; }
test1 {
width: 1.4rem; //1.4 × 20px = 28px
}
test2 {
height: 2.4rem; //2.4 × 20px = 48px
}
假设我们的设计稿其尺寸为 1920 * 1280 px,并且实际运行这个网页的屏幕分别率也是 1920 * 1280. 那么,这网页就好做了。简单粗暴地,按图中的元素的尺寸和位置,直接利用绝对定位把所有元素撸出来就行了。比如,设计稿中有这样一个元素:
.doughnut {
top: 150px;
left: 30px;
width: 400px;
height: 300px;
}
这不刚介绍了 rem, 我们试着用 rem 为单位来写一下 doughnut
元素的 css。我们把页面的 html 元素的 font-size 设置为 1920 / 10 = 192 px. 那么 doughnut
这个元素就应该写作:
.doughnut {
top: .781rem; // 150 / 192 = 0.781
left: .156rem; // 30 / 192 = 0.156
width: 2.083rem; // 400 / 192 = 2.083
height: 1.563rem; // 300 / 192 = 1.564
}
恩。。。。这不是有病么?算成 rem,然后设置一下 html 的 font-size 让浏览器再算回去?显摆自己的数学好么?23333。
注意上上面有一个假设,屏幕大小正好是 1920 * 1280。这个假设真的很假,根本不可能,一旦用了 px,那么一切长宽都死了。这时你再看一眼 rem,真实的长度为:
```
实际长度(px) = rootFontSize (html 的 font-size) * rem 长度
```
那么这个实际长度必然有一下特点:
- 所有长度的比例必然和设计图一致。
- 实际的显示长度完全由
html 的 font-size
值决定(线性关系)。
我们来证明一下:
设:设计稿上有任一1条线: A, A 的长度为 xx,
计算 rem 值的基准
为 zz
那么 css 里,A 的长度表示为 xzxz (rem)设网页运行时的 html 的 font-size 值为 fsfs,
那么 A 的实际显示长度就分为 xfszxfsz (px)
所以:
- 对于任意2条线,其实际长度的比例为 x1fszx1fsz : x2fszx2fsz 就等于 他们在设计图上的比例 x1x1 : x2x2
- 对于任意一条线,xx 和 zz 是固定值,其实际值随着 fsfs 值线性关系变化的
我们取设计图的边框的4条线来分析, 那么设计稿
,真实显示(画布)
和 显示窗口(全屏时,即为屏幕)
的关系如下图所示:
- 设计稿的宽高分别为 axax 和 ayay, 比例为 xx : yy.
- 实际显示的范围(我们称其为画布)比例和设计稿保持一致,所以可以设实际显示的画布的宽高为bx:bybx:by, 且所有线的实际显示长度是由
html 的 font-size 值
fsfs 线性决定的。 - 屏幕的尺寸不确定,假设其宽度为 ww, 高度为 hh
小结一下,用了上面提到的 rem 来方案后,我们做出来的页面是一个和设计稿比例一致的,并且大小根据网页运行时的 html 的 font-size的值缩放的页面。
既然页面的大小可以按html 的 font-size的值缩放,那么如果我希望画布的实际显示宽度始终和浏览器窗口宽度保持一致的话(即下图这样的状态),html 的 font-size的值应该如何设置呢?
我们假设 计算 rem 值的基准
为设计稿宽度的 1q1q:
假设,设计稿窗口宽为 axax,高为 ayay, 则
计算 rem 值的基准
zz 为 axqaxq那么按上面的公式,浏览器中画布实际的
宽度为 axfsaxq=fsqaxfsaxq=fsq,
高度为 ayfsaxq=qyfsxayfsaxq=qyfsx浏览器窗口的宽度 ww 要等于画布实际的宽度,即 w=fsqw=fsq,则 fs=wqfs=wq
好的,从数学回到我们的工程中来,我们的设计稿尺寸是 1920 * 1280。我们取 qq 这个值为 10, 则 计算 rem 值的基准
zz 为 axq=192010=192axq=192010=192. 然后我们把所有元素的长、宽、位置、字体大小等原来 px
单位都转换成 rem,网页加载后,我们用 js 去计算当前浏览器窗口的宽度,并设置 html 的 font-size
fsfs 为当前浏览器窗口的宽度
ww 的 1q1q,即 w10w10,这样我们就做出了一个100%宽度的、等比例缩放设计稿的页面了。
通过这样的设置,我就得到了一个和设计稿比例一致的,宽度与窗口大小一致的页面。
到此为止,就是现有 rem 方案的核心内容了。
说了半天,都是别人的方案,读者可能会问了,那博主你干了啥?
我的方案
回头想一下,我们要的是什么?现在这个方案,能满足我们的要求么?我们来逐条分析:
屏幕(窗口)尺寸和设计稿比例(x:yx:y)一致时,占满屏幕
这种情况肯定没问题,屏幕和真实页面完美重合.
屏幕(窗口)尺寸比设计图比例瘦时,上下留白,左右占满,并上下居中, 显示的比例保持(x:yx:y)
这种情况也没问题,真实页面高度小于屏幕,然后页面内容上下居中就可以了。
屏幕(窗口)尺寸比设计图比例胖时,左右留白,上下占满,并左右居中, 显示的比例保持(x:yx:y)
问题出现了,在这种场景下,页面的高度超出了屏幕的高度,这就会导致垂直滚动条了。这就是我的方案处理的地方了。在这种场景下,我们需要页面的高度缩小为屏幕的高度,当然为了保持比例页面的宽度等也要等比例缩小.换句话说我们要把所有的线的长度等比例缩小,缩小后画布的高度要等于屏幕的高度,即下图所示的状态:
要等比例缩小所有的长度,那么操作 html 的 font-size
fsfs 的值就能做到了。我们上面的分析中,我们已经计算了页面(画布)的真实高度
那么按上面的公式,浏览器中页面(画布)的真实
高度为 ayfsaxq=qyfsxayfsaxq=qyfsx
在此场景下,我们需要把画布真实高度值缩小到屏幕的高度,
设窗口的高度为 hh,
设缩小比例为 ss, 则有 h=qyfsxsh=qyfsxs, 得 s=xhqyfss=xhqyfs
即我们需要在页面(画布)真实高度上 qyfsxqyfsx 乘上个缩小系数 xhqyfsxhqyfs,可以使页面(画布)的真是高等于窗口的高度了
又因为 fs=wqfs=wq, 则这个缩小系数可变换为:
xhqywq=xhyw=xy/whxhqywq=xhyw=xy/wh, 即 设计稿宽高比窗口宽高比设计稿宽高比窗口宽高比
Bingo. 综上可知: 当窗口尺寸比设计图比例胖时,只要我们在原来 fsfs 值的基础上,乘上 设计稿宽高比窗口宽高比设计稿宽高比窗口宽高比 的缩小系数,就可以实现我们想要的效果了。
工程应用
好了,前面的理论,你看着头疼,我写着更头疼。终于到了喜闻乐见的运用环节了。
按照前面的一顿操作,应用这个方案,我们需要做2件事: (以设计稿的尺寸为 1920 * 1280 为例)
- 在 css 表示长度的时候,用设计稿上的长度除以 192, 算得 rem 的值。
- 页面内写一段 js 代码,根据我们上面的公式去计算并设置
html 元素的 font-size
值。
关于第1点:如果告诉你所有的长度你要自己算。。。可能这个方案马上就没人用了,因为真的要算死人。参照 lib-flexible 的方案,我写了一个 post-css 插件来帮助你做这个计算,效果就是你不用算了,图上是多少长度,你写多少就行了,这个 rem 的转换由插件完成。
关于第2点:这段 js 代码我已经为你写好了 lib-flexible-for-dashboard, 直接嵌入你的 html 里就行。考虑到这段 js 代码,会计算 font-size 的值,这个值会决定所有的长度,所以这个值要优先计算出来,最好的方案就是把这段代码拷贝到 html 的 head 里去(这个操作被称为 inline). 为了方便你使用webpack 和 npm 管理这个库,我们还为你准备了一个 webpack 插件,帮助你去做 inline.
示例
talk is cheap, show me the code
设计稿是这样的一个 1920 * 1280(16:9)的图:
看看我们实现的效果:
iframe 太小所以 echart 里的图会挤在一起看不清, 但是整个页面确实是能够保持对屏幕的适应的。
总结
我是站在巨人的肩膀上,针对全屏 pc 页面这一特别场景做出了一个个人比较满意的方案,希望能给有需要的朋友一些帮助。
相关项目:
https://github.com/njleonzhang/flexible-pc-full-screen https://github.com/QuellingBlade/postcss-px-to-rem https://github.com/QuellingBlade/lib-flexible-for-dashboard https://github.com/QuellingBlade/html-webpack-inline-plugin
PC大屏自适应的更多相关文章
- 使用rem配置PC端自适应大屏
效果如下 使得大屏不论在什么宽高比例依然能展示全部数据 安装 npm install -S postcss-pxtorem rem配置思路 原先的rem函数是能解决大部分的问题的,如果展示不全,也可以 ...
- NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)
具体细节可以参考另外一篇随笔! 以下提供的算法完成的事: 1.自适应1280x720分辨率以下的屏幕 2.自适应1280x720分辨率以上的屏幕 在我设定的要求内包括的分辨率大部分都测过了,背景图.全 ...
- vue+echarts可视化大屏,全国地图下钻,页面自适应
之前写过一篇关于数据大屏及地图下钻的文章 https://www.cnblogs.com/weijiutao/p/13977011.html ,但是存在诸多问题,如地图边界线及行政区划老旧,无法自适应 ...
- 大屏FAQ
1. 大屏可以分为哪几类?帆软有哪些大屏硬件合作商?编辑 拼接屏:通常由单个46-55寸的液晶显示屏组成屏幕墙,存在拼缝,借助矩阵.屏控系统来进行信号的输入与输出控制,可以实现屏幕墙上多个屏幕的组合. ...
- 【前端优化之渲染优化】大屏android手机动画丢帧的背后
前言 上周我与阿里的宇果有一次技术的交流,然后对天猫H5站点做了一些浅层次的分析,后面点时间基本天天都会有联系,中途聊了一些技术细节.聊了双方团队在干什么,最后聊到了前端优化.因为我本身参与了几次携程 ...
- html5 canvas首屏自适应背景动画循环效果代码
模板描述:html5 canvas首屏自适应背景动画循环效果代码 由于动态图太大,怕以后服务器受不了,所以现在都改为静态图了,大家点击演示地址一样的,希望大家喜欢,你们的支持就是小海的动力!! 欢迎大 ...
- iPhone6/6 Plus兩款大屏智能機
蘋果終於順應時代潮流,於今年推出了iPhone6/6 Plus兩款大屏智能機.但很快就有人開始懷念老款iPhone的“一手掌控”,畢竟不是所有人都有一雙大手.不過近期就有傳言稱,蘋果將於明年重新推出一 ...
- 基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化
前言 在大数据盛行的现在,大屏数据可视化也已经成为了一个热门的话题.大屏可视化可以运用在众多领域中,比如工业互联网.医疗.交通.工业控制等等.将各项重要指标数据以图表.各种图形等形式表现在一个页面上, ...
- ECharts + Jquery 做大屏展示
HTML <!doctype html> <html> <head> <meta charset="utf-8"> <meta ...
- Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)
一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...
随机推荐
- C#读写图片文件到Access数据库中
今天学习了把图片文件读写到数据库中,我是用的Access数据库,SQL还没去测试,不过都差不多 数据库表的样式 练习嘛就随便弄了下,说明下图片转成的字符串要用备注类型才可以哦 如果用的Sql数据库的话 ...
- 折腾 Quickwit,Rust 编写的分布式搜索引擎(专为从对象存储中实现亚秒级搜索而设计)
什么是 Quickwit? Quickwit 是首个能在云端存储上直接执行复杂的搜索与分析查询的引擎,并且具有亚秒级延迟.它借助 Rust 语言和分离计算与存储的架构设计,旨在实现资源高效利用.易于操 ...
- Ubuntu 设置中文
首先安装中文语言包: sudo apt install -y language-pack-zh-hans 接下来在 ~/.zshrc 或 ~/.bashrc 中添加如下内容: export \ LAN ...
- 使用 Docker 部署 FRP
服务端 编写配置文件 vim ~/.config/frp/frps.toml bindPort = 7000 # Web Dashboard [webServer] addr = "0.0. ...
- Web刷题之polarctf靶场(1)
PolarCTF 1.XFF 打开靶场发现需要ip为1.1.1.1的用户才行, 打开BurpSuite进行抓包并对数据包进行修改,根据题目XFF提示 flag{847ac5dd4057b1ece411 ...
- 一文了解JSON
目录 JSON 在JavaScript 中的使用. json 的定义 json 的访问 json 的两个常用方法 JSON 在 在 java 中的使用 javaBean 和 和 json 的互转 Li ...
- 同步多个mysql 到一个
了解大概 Ref: is it possible that canal set with multiple mysql database source 使用 canal https://dev.mys ...
- dotnet 读 WPF 源代码笔记 从 WM_POINTER 消息到 Touch 事件
本文记录我读 WPF 源代码的笔记,在 WPF 底层是如何从 Win32 的消息循环获取到的 WM_POINTER 消息处理转换作为 Touch 事件的参数 由于 WPF 触摸部分会兼顾开启 Poin ...
- MyBatis——注解开发
注解开发完成增删改 * (在完成简单功能时)使用注解开发会比配置文件开发更加方便 查询:@Select 添加:@Insert 修改:@Update 删除:@Delete ...
- freemarker实现导出word复选框可点击效果
记一次java导出word文档,导出的word文档里包含复选框并且能点击,一开始做了个输出字符的,比如这样: □,然而并不能满足需求,网上找了一大堆也都是这种的. 正文开始: 先在word中添加复选框 ...