热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术】移动端适配px2rem/px2vw的原理与实现

简介【目标】:前端开发移动端及H5时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局!【基础】dpr(设备像素比)css的像素px不等于设备像素分辨率各种值,css
简介

【目标】:前端开发移动端及H5时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局!
【基础】

  1. dpr(设备像素比)
    css的像素px不等于设备像素/分辨率/各种值,css的px可以简单理解为虚拟像素,与设备无关,css的px需要乘dpr计算为设备像素;
  2. css3 的 rem,
    即“root em”,是相对于根元素的font-size来做计算;
    配合js根据设备的dpr设置html的font-size=“XX”来实现等比缩放
  3. 基于 viewport 的长度单位:
    vw:即Viewport’s width,1vw等于window.innerWidth的1%,所以窗口宽度是100vm
    vh:和vw类似,即Viewport’s height,1vh等于window.innerHeihgt的1%
    vmin:vmin的值是当前vw和vh中较小的值
    vmax:vmax的值是当前vw和vh中较大的值
实现

总体来说是将px通过预定义的配置,根据不同的dpr计算为rem/vw,来实现不同屏幕大小的响应式伸缩

1. px 转 rem

css3的rem是基于根元素的字体大小计算的尺寸单位,所以通过改变html的font-size来实现rem的响应式布局,例如使用css媒体查询:

html{font-size:10px}
@media screen and (min-width:415px) and (max-width:639px){html{font-size:15px}}
@media screen and (min-width:640px) and (max-width:719px){html{font-size:20px}}

但不同分辨率的屏幕计算转换太复杂,媒体查询不能兼顾所有的尺寸,所以可以通过JS计算。先贴代码:

var devicepx';

例如设计稿基于iphone5的320px,deviceWidth为320px,根元素的font-size基于100px,那body的width可以写为3.2em;
当适配640px的屏幕时,deviceWidth为640px,bodyRemWidth为3.2rem,此时根元素的font-size计算为200px;
deviceWidth就是viewport设置中的deviceWidth,viewport视图提供布局的窗口,包括移动端的显示/缩放比例等设置;
需要设置mate的viewport使得显示时的页面宽度等于设备逻辑像素大小,移动端常用代码:

devicemeta[name="viewport"]')
.setAttribute('content','initial-scale=' + scale + ',
maximum-scale=' + scale + ',
minimum-scale=' + scale + ',
user-scalable=no');

2. 进阶:px 转 vw

方式简而言之就是,基于css3中Viewport相关vw、vh、vmin和vmax单位,将宽高的px计算为vw/vh,而vmax/vmin总是指向那个最大/最小的屏幕长度

var vw = window.innerWidth;
var vh = window.innerHeight;

例如对于320px的设计稿,屏幕总长一直是100vw,所以比率是3.2,那css代码需要将所有–px/3.2得到**vm,
这样很麻烦,所以使用postcss-px-to-viewport实现编译时候的自动计算,还要配合postcss-write-svg,postcss-aspect-ratio-mini等插件解决Retina,1px等问题

3. 再进阶:兼容 vw

目前应用比较广的是px2rem,随着浏览器对viewport的支持,但未来趋势是px2vm,用vm代替rem,但要兼容就大乱炖啥都要,,,
很多技术站都提供了兼容插件,比如postcss-cssnext, postcss-viewport-units, viewport-units-buggyfill。
不同的前端框架vue/react,配合webpack/grund等打包工具,可以更高效的使用这些插件,完成移动端适配的配置工作。
【传送门】
Amfe阿里前端团队一直都对这方面的技术做了非常好的研究,还提供了开源的代码:https://github.com/amfe/lib-f…
大漠写的非常详细的博客:使用Flexible实现手淘H5页面的终端适配,还有进一步讲vw的:再聊移动端页面的适配,如何在Vue项目中使用vw实现移动端适配。向大牛献上一份膝盖~~~

4. 推荐插件

主要的插件都是基于PostCss的,千万不要去百度PostCss,要不然从当前坑还没爬出来,又会发现另一个坑,,,

  1. px2rem或postcss-px2rem:将css中px编译为rem,配合js根据不同的dpr,修改meta的viewport值和html的font-size
  2. postcss-px-to-viewport:将css中px编译为vm
  3. postcss-aspect-ratio-mini:用来处理元素容器宽高比,针对img、vedio和iframe实现更好的长宽比
  4. postcss-write-svg:解决1px问题(移动端css里面写了1px, 实际看起来比1px粗),自动生成border-image或者background-image的图片
  5. viewport-units-buggyfill:实现各个浏览器viewport的兼容
  6. postcss-viewport-units:给CSS的属性添加content的属性,配合viewport-units-buggyfill库给vw、vh、vmin和vmax做适配的

加油吧~少年~


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 在package.json中有如下两个对象:husky:{hooks:{pre-commit:lint-staged}},lint-staged:{src** ... [详细]
  • 本文详细介绍了插槽的概念和使用方法,插槽是组件的一块HTML模板,父组件可以通过插槽来决定组件的显示和功能。文章中解释了插槽的两个核心问题:显示和怎样显示。同时还介绍了多个插槽和带name属性的插槽的定义方法。另外,还介绍了作用域插槽的使用,以及在插槽中传递父组件的对象值的方法。最后,还介绍了两种情况下的属性传值和模版重写的实现方式。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 翻译 | 编写SVG的口袋指南(上)
    作者:DDU(沪江前端开发工程师)本文是原文翻译,转载请注明作者及出处。简介ScalableVectorGraphics(SVG)是在XML中描述二维图形的语言。这些图形由路径,图 ... [详细]
  • webui之常用js操作(webui界面是什么)
    本文目录一览:1、web前端开发需要掌握的几个必备技术 ... [详细]
  • HTML5Canvas图像模糊如何解决
    本文主要和大家介绍HTML5Canvas图像模糊完美解决办法,需要的朋友可以参考下,希望能帮助到大家。1、最近在用h5的canvas画动画,发现图像 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
author-avatar
fangsi155_7827d9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有