使用rem、动态vh自适应移动端
前言
这是我的 模仿抖音 系列文章的第六篇
第一篇:200行代码实现类似Swiper.js的轮播组件
第二篇:实现抖音 “视频无限滑动“效果
第三篇:Vue 路由使用介绍以及添加转场动画
第四篇:Vue 有条件路由缓存,就像传统新闻网站一样
第五篇:Github Actions 部署 Pages、同步到 Gitee、翻译 README 、 打包 docker 镜像
网上还有很多种方法做适配的,各种方案有利有弊,此文章仅提供一个思路,并不适合每个人
rem
rem 的值是根据根元素 html 字体大小的来计算的,即1rem = html font-szie,
如果 html 元素没有指定字体大小,那么浏览器默认的字体大小是 16px ,所以 1rem = 16px
如果 html 元素指定 font-size: 1px ,那么 1rem = 1px
同理 html 元素指定 font-size: 3px ,那么 1rem = 3px
同理 html 元素指定 font-size: 1000000px ,那么 1rem = 1000000px
同理 html 元素指定 font-size: 0.000001px ,那么 1rem = 0.000001px
rem 和 em 的区别
em 是以父元素的字体大小来计算; rem 顾名思义,就是 root 的 em, 所以它是以 html 的字体大小来计算
例子
html 设置 font-size: 1px
父元素 Parent 设置 font-size: 2px
子元素 Child 设置 font-size: 16rem
则渲染到界面上的实际大小为
font-size: 16px,因为他是以html来计算,1rem = 1px , 16rem = 16px
子元素 Child 设置 font-size: 16em
则渲染到界面上的实际大小为
font-size: 32px,以父级来计算,父级是 2px , 所以 1em = 2px , 16em = 32px
使用
把 html 设置 font-size: 1px ,这样我们不用换算 px ,就可直接使用 rem
比如设计稿上写的 24px,我们代码里面直接写 24rem 就可以了
不同屏幕自适应
不同用户的设备屏幕宽度不同,若每个用户对应的 html 元素 font-size 值相同的话,用户看到的显示效果也是不同的。
可以用 JavaScript 来根据用户的屏幕宽度,动态更改 html 元素上的 font-size 值,从而使实际显示的内容比例始终保持不变,不同用户看到的效果也会保持一致。
比如,设计稿的宽度为 400px ,里面显示了一个宽度为 40px 的盒子。某用户以 800px 宽度的设备来访问,看到的盒子宽度应该为 80px。那么此时在 html 元素的 font-size 值设置为 2px ,然后盒子的宽度采用 rem 单位,设置为 40rem ,那么就能显示出 80px 的盒子了。保持用户看到的和设计稿中的效果比例一致。
所以,html元素的font-size计算公式为:
// 用户设备宽度 / 设计稿标准宽度
document.documentElement.style.fontSize = document.documentElement.clientWidth / 375 + 'px'
vh
vh 和 vw 都是相对于视窗的宽高度,“视窗”所指为浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。可以简单理解为屏幕百分比,1vh = 屏幕的1%
使用
如果需要固定显示屏幕百分比的元素,可以使用 vh/vw
移动端 100vh 显示 bug
vh 需要单独讲一讲,在移动端的Chrome 和 Safari上会显示溢出 ,如下图
当地址栏处于视图中时,元素底部被裁剪(右),但我们想要的是元素能完整的占据一屏(左)。
造成这种现象的原因就在于移动端浏览器对于 vh 单位的计算,是不包含地址栏的,也就是说 100vh 的高度会使带有地址栏的视图溢出。
核心问题是移动浏览器(Chrome 和 Safari)有一个“有用”的功能,地址栏有时可见,有时隐藏,从而改变视口的可见大小。这些浏览器并没有随着视口高度的变化而将高度调整100vh为屏幕的可见部分,而是将100vh地址栏设置为隐藏地址的浏览器高度。结果是,当地址栏可见时,屏幕的底部将被切断,从而违背了100vh最初的目的。
解决方法
使用 window.innerHeight 获取当前视窗的的高度,将高度按 100 份等分,得到视窗的单位高度, 然后通过 js 设置成一个 css 的变量 --vh。
document.documentElement.style.setProperty('--vh', `${vh}px`)
css中使用
//表示100vh
height: calc(var(--vh, 1vh) * 100);
//100vh - 60rem
height: calc(var(--vh, 1vh) * 100 - 60rem);
代码
function resetVhAndPx() {
let vh = window.innerHeight * 0.01
document.documentElement.style.setProperty('--vh', `${vh}px`)
document.documentElement.style.fontSize = document.documentElement.clientWidth / 375 + 'px'
}
onMounted(() => {
resetVhAndPx()
// 监听resize事件 视图大小发生变化就重新计算1vh的值
window.addEventListener('resize',resetVhAndPx)
})
总结
通过使用 rem 和 vh/vw 我们就可以适配大多数常见设备啦,如果有特殊需求还可以使用 媒体查询 来单独适配~
使用rem、动态vh自适应移动端的更多相关文章
- 自适应PC端网页制作使用REM
做一个PC端的网页,设计图是1920X1080的. 要在常见屏上显示正常(比例正确可) 1280X720 1366X768 1440X900 1920X1080 使用了几种办法 1.内容在一屏内显示的 ...
- 用rem实现WebApp自适应的优劣分析
关于rem实现屏幕自适应布局的讨论还是比较多的,刚好我也看到使用rem实现自适应的web app,所以也来凑下热闹. 说起rem,免不了要联系到em.px,这里简单提提他们的定义和特点. 1. px: ...
- 移动端canvas文字图片合成并生成图片(canvas宽度自适应移动端屏幕)
这是我之前做的一个关于文字图片合成的代码,供大家参考,不足支出还望体谅:具体的注释在代码里都有,有什么不懂了可以留言互相交流.<!DOCTYPE html> <html lang=& ...
- css单位介绍em ex ch rem vw vh vm cm mm in pt pc px
长度单位主要有以下几种em ex ch rem vw vh vm cm mm in pt pc px %,大概可以分为几种"绝对单位"和"相对单位"和" ...
- 动态的调用服务端的WCF中的方法
客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方法,反射wcf 的接口,动态调用接口中的方法. 主要为,动态绑定,反射动态调用. public static object Execu ...
- rem测试用实现移动端自适应页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- rem布局和使用js rem动态改变字体大小,自适应
解决rem文字动态改变字体大小: <script> console.log(window.devicePixelRatio); var iScale = 1; iScale = iScal ...
- 通过rem编写自适应移动端要点
直接上干货 1,dpr 苹果手机像素是2 普通安卓机是1 也就是说1像素下苹果需要的像素点是安卓机的两倍 所以一个需要15x15显示的图像安卓机仅需要提供15X15即可显示清楚 苹果手机需要要30X3 ...
- 移动端响应式布局,rem动态更新
(function(){ var fontSizeMatchDeviceWidth = function(){ var deviceWidth = document.documentElement.c ...
- 使用js rem动态改变字体大小,自适应
<html> <head> <meta charset="utf-8"> <script> console.log(window.d ...
随机推荐
- sweetviz工具避坑和简单使用
网上关于sweetviz的文章比较少,有些坑这里说一下给大家避坑. 使用sweetviz遇到的错误如下: KeyError: "None of ['index'] are in the co ...
- FasterViT:英伟达提出分层注意力,构造高吞吐CNN-ViT混合网络 | ICLR 2024
论文设计了新的CNN-ViT混合神经网络FasterViT,重点关注计算机视觉应用的图像吞吐能力.FasterViT结合CNN的局部特征学习的特性和ViT的全局建模特性,引入分层注意力(HAT)方法在 ...
- 阿里云2020上云采购季,你最pick哪个产品组合?
阿里云2020上云采购季如火如荼进行中,活动还剩最后10天啦,你的云产品都买好了吗? 还没买的,还没逛的,请戳:https://www.aliyun.com/sale-season/2020/proc ...
- 阿里巴巴云数据仓库 MaxCompute 数据安全最佳实践
简介:MaxCompute作为企业级SaaS模式云数据仓库,正在为客户业务及其数据提供持续的安全保护. MaxCompute 近期对产品的安全能力进行了全面升级 ,结合数据生命周期,针对数据误用.数 ...
- [GPT] ./ssh/known_hosts 是什么
~/.ssh/known_hosts 是一个SSH客户端用来存储已知的远程主机的公钥的文件,这些公钥用于验证连接到远程主机时它们是否为真实可信的主机. 当你首次通过SSH连接到一个新的远程主机时, ...
- Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试
本文来告诉大家如何在项目文件里面添加上 EmbedAllSources 属性,将自己的代码嵌入到 PDB 符号文件里面,让开发者们在调试的时候,可以看到库的源代码 是否记得 PDB 符号文件的作用?符 ...
- SQL server 自定义工资公式设计
目的: 工资系统中,在计算各工资项目的时候,用户能自定义公式.这里的讲述是从数据库方设计方面考虑,做简要的数据模拟和实体.存储过程的设计. 收集数据: 1.Employee员工信息数据(Employe ...
- C语言程序设计-笔记2-分支结构
C语言程序设计-笔记2-分支结构 例3-1 简单的猜数游戏.输入你所猜的整数(假定1-100),与计算机产生的被猜数比较,若相等,显示猜中:若不等,显示与被猜数的大小关系. /*简单的猜数游戏*/ ...
- Java ”框架 = 注解 + 反射 + 设计模式“ 之 反射详解
Java "框架 = 注解 + 反射 + 设计模式" 之 反射详解 每博一文案 无论幸福还是苦难,无论光荣还是屈辱,你都要自己遭遇与承受. ------ <平凡的世界> ...
- Solution Set - 图上问题
CF360E Link&Submission. 首先显然可以选择的边的权值一定会取端点值.事实上,第一个人经过的边选最小,第一个人不经过的边选最大,这样一定不劣.进一步,如果 \(s_1\) ...