移动端web适配方案

 

以下是移动端适配的多个方案,也可以说说你是怎么做的。

正文

  • 自适应:根据不同的设备屏幕大小来自动调整尺寸、大小

  • 响应式:会随着屏幕的实时变动而自动调整,是一种更强的自适应

为什么要做移动端适配?

目前市面上移动端屏幕尺寸非常的繁多,很多时候我们希望一个元素在不同的屏幕上显示不同的大小以此来更好的还原效果图:

  • 当我们针对一个手机进行布局设计时,设置了一个 200 * 200 大小的盒子

  • 但在不同的设备上,由于逻辑像素不同的问题,会使得这个盒子在更大的视口上显得很小,在更小的视口上显示很大

  • 因此我们需要进行适配让它在不同设备上所占据视口的空间比例是相同的

当前流行的几种适配方案

  • 方案一:百分比设置(不推荐)

    • 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一

    • 所以百分比在移动端适配中使用是非常少的

  • 方案二:rem单位+动态html的font-size

  • 方案三:vw单位(推荐)

  • 方案四:flex的弹性布局

rem + 动态设置 font-size

rem 单位是相对于 html 元素的 font-size 来设置的,通过在不同屏幕尺寸下,动态的修改 html 元素的 font-size 以此来达到适配效果

在开发中,我们只需要考虑两个问题:

  • 针对不同的屏幕,设置 html 不同的 font-size

  • 将原来设置的尺寸,转化成 rem 单位

font-size 的尺寸

屏幕尺寸html的font-size盒子的设置宽度盒子的最终宽度
375px37.5px1rem37.5px
320px32px1rem32px
414px41.4px1rem41.4px

px 与 rem 的单位换算

  • 手动换算

    • 根元素 html 的文字大小 = 视口宽度/分成的份数(一般为10份,方便计算)

    • rem 值 = 元素的 px 值 / 根元素 html 的文字大小

    • 比如有一个在375px屏幕上,100px宽度和高度的盒子

    • 我们需要将100px转成对应的rem值

    • 100/37.5=2.6667,其他也是相同的方法计算即可

  • less/scss函数

.pxToRem(@px) {result: 1rem * (@px / 37.5);
}.box {width: .pxToRem(100)[result];height: .pxToRem(100)[result];background-color: orange;
}p {font-size: .pxToRem(14)[result];
}
  • postcss-pxtorem

    • 目前在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化

    • npm install postcss-pxtorem

  • VSCode插件

方案一:媒体查询

思路:通过媒体查询来设置不同尺寸屏幕下 html 的 font-size

缺点:

  • 需要针对不同的屏幕编写大量的媒体查询

  • 如果动态改变尺寸,不会实时更新,只是一个个区间

@media screen and (min-width: 320px) {html {font-size: 20px;}
}@media screen and (min-width: 375px) {html {font-size: 24px;}
}@media screen and (min-width: 414px) {html {font-size: 28px;}
}@media screen and (min-width: 480px) {html {font-size: 32px;}
}.box {width: 5rem;height: 5rem;background-color: blue;
}

 方案二:编写 js 代码

思路:通过监听屏幕尺寸的变化来动态修改 html 元素的 font-size 大小

方法:

  • 根据 html 的宽度计算出 font-size 的大小,并设置到 html 上

  • 监听页面尺寸的变化,实时修改 font-size 大小

function setRemUnit() {// 获取所有的 html 元素const htmlEl = document.documentElement// 375 -> 16px// 320px -> 12px// 我们需要动态更改字体大小,因此需要获取网页的宽度// 拿到客户端宽度const htmlWidth = htmlEl.clientWidth// 将宽度分成10份const htmlFontSize = htmlWidth / 10console.log('htmlFontSize', htmlFontSize);// 将值给到html的font-sizehtmlEl.style.fontSize = htmlFontSize + 'px'
}setRemUnit()
// 给 window 添加监听事件
window.addEventListener('resize', setRemUnit) 

方案三:lib-flexible 库 

 lib-flexible 是淘宝团队出品的一个移动端自适应解决方案,通过动态计算 viewport 设置 font-size 实现不同屏幕宽度下的 UI 自适应缩放。

(function flexible (window, document) {var docEl = document.documentElementvar dpr = window.devicePixelRatio || 1// adjust body font sizefunction setBodyFontSize () {if (document.body) {document.body.style.fontSize = (12 * dpr) + 'px'}else {document.addEventListener('DOMContentLoaded', setBodyFontSize)}}setBodyFontSize();// set 1rem = viewWidth / 10function setRemUnit () {var rem = docEl.clientWidth / 10docEl.style.fontSize = rem + 'px'}setRemUnit()// reset rem unit on page resizewindow.addEventListener('resize', setRemUnit)window.addEventListener('pageshow', function (e) {if (e.persisted) {setRemUnit()}})// detect 0.5px supportsif (dpr >= 2) {var fakeBody = document.createElement('body')var testElement = document.createElement('div')testElement.style.border = '.5px solid transparent'fakeBody.appendChild(testElement)docEl.appendChild(fakeBody)if (testElement.offsetHeight === 1) {docEl.classList.add('hairlines')}docEl.removeChild(fakeBody)}
}(window, document)) 

vw 适配方案 

100vw 相当于整个视口的宽度 innerWidth,1vw 相当于视口宽度的 1%,将 px 转换为 vw 即可完成适配,其实上面的 rem 就是模仿 vw 方案

vw相比于rem的优势:

  • 不需要去计算 html 的 font-size 大小,也不需要去给 html 设置 font-size

  • 不会因为设置 html 的 font-size 大小,而必须再给 body 设置一个 font-size 防止继承

  • 因为不依赖 font-size 的尺寸,所以不用担心某些原因的 html 的 font-size 尺寸被篡改,导致页面尺寸混乱

  • vw 更加语义话,1vw 相当于 1/100 viewport 的大小

  • rem 事实上作为一种过渡的方案,它利用的也是 vw 的思想

px 与 vw 的单位转换 

手动换算

比如屏幕尺寸为 375px,元素大小为 150px,我们需要将 150px 转换成对应的 vw 值:150 / 3.75=40

less/scss 函数

@vwUnit: 3.75;
.pxToVw(@px) {result: (@px / @vw) * 1vw
}
.box {width: .pxToVw(100)[result];height: .pxToVw(100)[result];
} 

postcss-px-to-viewport-8-plugin

  • 和rem一样,在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化

  • npm install postcss-px-to-viewport-8-plugin

vs Code 插件

px to vw 插件,在编写时自动转化:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/311008.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码

第七讲:C语言指针(1)

目录 1、内存和地址 1.1、内存 1.2、究竟该如何理解编址 2、指针变量和地址 2.1、取地址操作符(&) 2.2、指针变量和解引⽤操作符 2.2.1、指针变量 2.2.2、如何理解指针类型 2.2.3、解引⽤操作符 2.3、指针变量的⼤⼩ 3、指针变量类型的意…

Input DropDown 拼接成 select组件(基于antd和react)

前言:为什么不直接用select,还要舍近求远搞inputdropdown这种缝合怪,是因为antd的select不支持选中项再编辑,效果如图 比如:选中的lucy文案变成了placeholder不能再编辑了 封装此组件虽然比较简单,但还是有…

基于SSM的购物小程序01

4.1系统架构设计 购物系统设计的系统项目的概述设计分析,主要内容有学习平台的具体分析,进行数据库的是设计,数据采用mysql数据库,并且对于系统的设计采用比较人性化的操作设计,对于系统出现的错误信息可以及时做出处…

在Vue3中如何使用H.265视频流媒体播放器EasyPlayer.js?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,可支持H.264与H.265编码格式,性能稳定、播放流畅,能支持WebSocket-FLV、HTTP-FLV,HLS(m3u8&#…

E9:拦截流程系统管理员操作记录,流转记录不显示(ECODE)

效果: ecodeSDK.rewriteApiDataQueueSet({fn: (url, params, data) > {const { hash } window.location;if (!hash.startsWith(#/main/workflow/req)) return false; // 判断页面地址if (!ecCom.WeaTools.Base64) return false; // 完整组件库加载完成if (!W…

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

标定的是相机到雷达的,R3live下面配置的雷达到相机的,所以要把得到外参旋转矩阵求逆,再填入,平移矩阵则取负 港科大livox_camera_calib虽然操作方便,但是使用mid360雷达会有视角问题(投影三维点到相机),尝试了很多场景&#xff0c…

js纯前端实现语音播报,朗读功能(2024-04-15)

实现语音播报要有两个原生API 分别是【window.speechSynthesis】【SpeechSynthesisUtterance】 项目代码 // 执行函数 initVoice({text: 项目介绍,vol: 1,rate: 1 })// 函数 export function initVoice(config) {window.speechSynthesis.cancel();//播报前建议调用取消的函数…

在PostGIS中计算点数据集的最小外包凸多边形等

存在点(或线)数据集,其分布情况如下: 现在想要获取该数据的几个外包多边形,主要包含如下三个方法: 第一种方法,最小外包凸多边形,其结果如下: 查询语句:ST…

半导体材料(二)——半导体导电特性

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第二篇笔记,上一篇传送门。 半导体导电特性 载流子的迁移 外电场下电子和空穴定向位移产生电流。电流密度可写作: J e ( μ n n μ p p ) E σ E Je(\mu_n n\mu_p p)E\sigm…

称重传感器信号变送 差分信号输入转换直流放大器0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

概述: DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输…

vscode远程免密登录ssh

vscode远程免密登录ssh 1. 安装vscode2. 安装ssh3. 本地vscode配置免密登录远端开发机1. 本地配置秘钥2. 远程开发机配置秘钥 4. vscode常用小工具1. vscode怎么设置ctrl加滚轮放大字体 1. 安装vscode 2. 安装ssh 设置符号打开config配置文件,点击符号ssh连接新的远…

【MVCC】深入浅出彻底理解MVCC

MVCC概述 MVCC(Multi-Version Concurrency Control)即多版本并发控制。主要是为了提高数据库的并发性能而提供的,采用了不加锁的方式处理读-写并发冲突,确保了任何时刻的读操作都是非阻塞的。只需要很小的开销,就可以…

03-echarts如何画立体柱状图

echarts如何画立体柱状图 一、创建盒子1、创建盒子2、初始化盒子(先绘制一个基本的二维柱状图的样式)1、创建一个初始化图表的方法2、在mounted中调用这个方法3、在方法中写options和绘制图形 二、画图前知识1、坐标2、柱状图图解分析 三、构建方法1、创…

保邦电气有限公司诚邀您参观2024第13届生物发酵展

参展企业介绍 苏州保邦电气有限公司成立于2018年3月,公司拥有国务院特殊津贴专家领衔的博士、硕士研发团队,是一家专业从事磁悬浮电机及应用产品研发、制造、销售的高新技术企业,先后获评张家港创业lingjun人才企业、姑苏人才企业、江苏省双…

【数据结构|C语言版】单链表应用

前言1. 基于单链表实现通讯录1.1 知识要求1.2 功能要求 2. 代码总结2.1 SeqList.h2.2 SeqList.c2.3 Contact.h2.4 Contact.c2.5 test.c 后言 上期回顾:【数据结构|C语言版】单链表 前言 各位小伙伴大家好!上期小编讲解了单链表相关知识,在此…

麒麟服务器操作系统安装HTTP服务

往期好文:麒麟服务器操作系统安装TFTP服务 Hello,大家好啊!今天我们将探讨如何在麒麟服务器操作系统上安装和配置HTTP服务,这是任何网络服务或应用的基础。无论你是想建立一个简单的网站,还是需要一个全功能的Web服务器…

实景三维技术在公共安全领域的应用

随着科技的不断发展,实景三维技术在公共安全领域的应用越来越广泛。实景三维技术是指通过采集现实世界的三维数据,构建出真实的三维场景,进而实现对现实世界的数字化模拟和重建。在公共安全领域,实景三维技术的应用不仅可以提高安…

【MySQL】 mysql 日常工单处理脚本 解放你的双手!!!

简介 在工作中经常帮助开发的小伙伴执行些 sql,手动执行效率低不直观,还要单独备份等等,极为麻烦,怎么办?用它!解放时间多摸鱼!!!我的摸鱼小帮手。 流程图:…

PHP学习(二)

一、php 数据类型之查看和判断数据类型 查看数据类型 1.gettype(传入一个变量) 能够获得变量的类型 2.var_dump(传入一个变量) 输出变量类型和值 <?php //声明一个变量 88.8 $f 88.8; $type gettype($f); echo $type; ?> <?php //多换几个类型试试 $str 你…