首页 > 其他分享 >使用rem、动态vh自适应移动端

使用rem、动态vh自适应移动端

时间:2024-05-30 14:56:44浏览次数:24  
标签:font vh 元素 html rem 动态 size

前言

这是我的 模仿抖音 系列文章的第六篇

第一篇: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

remem 的区别

em 是以父元素的字体大小来计算; rem 顾名思义,就是 rootem, 所以它是以 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

vhvw 都是相对于视窗的宽高度,“视窗”所指为浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。可以简单理解为屏幕百分比,1vh = 屏幕的1%

使用

如果需要固定显示屏幕百分比的元素,可以使用 vh/vw

移动端 100vh 显示 bug

vh 需要单独讲一讲,在移动端的Chrome 和 Safari上会显示溢出 ,如下图

image.png

当地址栏处于视图中时,元素底部被裁剪(右),但我们想要的是元素能完整的占据一屏(左)。
造成这种现象的原因就在于移动端浏览器对于 vh 单位的计算,是不包含地址栏的,也就是说 100vh 的高度会使带有地址栏的视图溢出。

image.png

核心问题是移动浏览器(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)
})

总结

通过使用 remvh/vw 我们就可以适配大多数常见设备啦,如果有特殊需求还可以使用 媒体查询 来单独适配~

标签:font,vh,元素,html,rem,动态,size
From: https://www.cnblogs.com/zyronon/p/18222332

相关文章

  • Particles.js:为Web项目增添动态粒子效果
    Particles.js:为Web项目增添动态粒子效果示例介绍Particles.js是一个轻量级的JavaScript库,用于在Web页面上创建和管理动态粒子效果。它允许开发者通过简单的配置文件实现复杂的动画效果,为网页增添视觉吸引力。粒子可以是点、线、图像等,能够根据用户交互进行动态变化,Particles.......
  • 《计算机网络微课堂》6-3 动态主机配置协议DHCP
    本节课我们介绍动态主机配置协议DHCP。我们首先来举例说明DHCP的作用。如图所示有这样一个网络拓扑,请同学们思考一下,我们应该给网络中的各主机设置怎样的网络相关配置信息,才能使他们可以正常访问网络中的WEB服务器。根据我们之前课程所介绍过的相关知识可知,需要给网络中的各......
  • [ 514. 自由之路] (动态规划)
    dp[i][j]i表示前i个字符j的选择是第i个字符在ring中出现的位置列表。给初始编号dp[i][j]=.所有(dp[i-1][k]+cost(j,k)k可选的这样的值中的最小值importjava.util.ArrayList;importjava.util.List;classSolution{intn;List<Integer>[]index=......
  • 动态库与静态库
    目录认识动静态库静态库动态库动静态库的优缺点创建与使用动静态库静态库的创建静态库的使用动态库的创建 动态库的使用认识动静态库一个程序编译为可执行程序需要经历四个步骤:预处理:在此阶段,源代码会被预处理器处理。预处理器会执行如移除注释、展开宏定义、......
  • px2rem 实现vue rem 自适应/
    npminstallpostcss-px2rempx2rem-loader--save新建js文件rem.js//rem等比适配配置文件//基准大小constbaseSize=16//设置rem函数functionsetRem(){//当前页面宽度相对于1920宽的缩放比例,可根据自己需要修改。constscale=document.documentElem......
  • 动态规划在图搜索中的应用:Floyd算法详解
    多源汇最短路问题-具有多个源点Floyd算法O(n^3)-动态规划给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”。数据保证图中不存在负权回路。......
  • C++:虚表指针、虚表、虚函数和动态多态
    classBase{public:virtualvoidshow(){std::cout<<"Baseshow"<<std::endl;}};classDerived_1:publicBase{public:voidshow()override{std::cout<<"Derivedshow"<<std::endl;}};class......
  • 如何导出与pip库版本相关的requirement.txt文件
    在Python项目中,导出与pip库版本相关的requirements.txt文件是一个常见的任务。这个文件包含当前环境中所有已安装的包及其版本信息,可以用于在其他环境中再现相同的包安装。步骤:1.激活虚拟环境首先,确保你已经激活了你的虚拟环境。如果你没有使用虚拟环境,建议你创建......
  • vue3 组件的动态渲染 <component :is=“componentTag“ />
    1、动态渲染组件        <component:is=""></component>        通过isShow来切换显示A、B组件首先创建父组件.vue文件和两个子组件A、B文件,并引入。template:<div><h3>我是父组件dynamicComp.vue</h3><button@click="isShow=!isShow">切换......
  • 【Embedding合集】推荐系统/风控领域中动态连续型不定长序列数据处理方案
    【Embedding合集】推荐系统/风控领域中动态连续型不定长序列数据处理方案在推荐系统或是风控领域都存在这样一类动态连续型序列数据,如用户最近一个月消费记录,最近半年还款记录等等,这些序列数据的每一个元素都是连续型的数字,并且长度不定(每个用户消费的笔数都不一样),但这类动......