移动端web适配方案

news2024/11/29 0:56:29
 

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

正文

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

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

为什么要做移动端适配?

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

  • 当我们针对一个手机进行布局设计时,设置了一个 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 / 10
  console.log('htmlFontSize', htmlFontSize);
  // 将值给到html的font-size
  htmlEl.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.documentElement
  var dpr = window.devicePixelRatio || 1

  // adjust body font size
  function setBodyFontSize () {
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit)
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      setRemUnit()
    }
  })

  // detect 0.5px supports
  if (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.coloradmin.cn/o/1599132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技数据工程师考试官方免费课程上线啦

自从上次小李哥分享了AWS Data Engineer Associate证书首通经验后,有非常多的小伙伴们问我,应该怎么复习这门考试呢? 这门考试是AWS针对最近大热🔥的AI、数据分析、数据科学等行业,推出的全新考试。因为刚刚推出&#…

JavaEE > > Spring(1)

Spring Spring:包含众多方法的 IoC 容器.,是一个集成很多方法的框架,让应用程序开发更加简单. IoC:Inversion of Control 翻译成中⽂是“控制反转”的意思. 这是一个设计思想,而不是一个具体的实现方式.该思想就是把原本在程序中…

海外云手机为什么适合社媒运营?

如今,社媒营销如果做得好,引流效果好的账号,可以用来带货变现,而外贸、品牌出海也同样都在做社媒营销,Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的,必要的时候,大家会使用海…

区块链实验室(35) - 编译solana for ARM64版

今天终于成功编译solana for arm64版,编译时间巨长。见下图所示。编译步骤详见solana网站https://github.com/solana-labs/solana和https://docs.solanalabs.com/。

ORA-00742 ORA-00312 恢复---惜分飞

有客户反馈,断电之后数据库启动报ORA-00742和ORA-00312,无法正常open 我们远程上去尝试open库结果也报同样错误 [oracleoldhis oradata]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Apr 10 09:40:03 2024 Copyright (c) 1982, 2013, Oracle. A…

计算机网络(五)传输层

传输层 从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最低层 传输层功能: 传输层提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别区别是&#xf…

MySQL 试图

视图功能在 5.0 以后的版本启用 视图是一张虚表。数据表确实包含了具体数据并且保存到硬盘中的实表。视图使用数据检索语句动态生 成的一张虚表。每一次数据服务重启或者系统重启之后,在数据库服务启动期间,会使用创建视图的语 句重新生成视图中的数据&…

揭秘智慧礼品背后的故事

如若不是从事技术行业,在罗列礼品清单时,可能不会想到 “数据”,但幸运的是,我们想到了。如何将AI技术应用到当季一些最受青睐的产品中去,训练数据是这一智能技术的背后动力。很多电子设备或名称中带有“智能”一词的设…

频率域滤波总结

我本来想写在一起的,但是这样的话就没有重点了。分开写更能总结出来问题。这里的步骤5的对称滤波函数确实是(2M-1)x(2N-1)的大小,但是书上还说了如下图所示的问题: 首先第一个问题是乘积的问题,为什么普通的函数乘积也需要填充零?…

【电控笔记6.2】拉式转换与转移函数

概要 laplace:单输入单输出,线性系统 laplace 传递函数 总结

DNS解析实验

一、DNS正向解析实验 准备工作 服务端及客户端都关闭安全软件 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld服务端安装bind软件 [rootserver ~]# yum install bind -y服务端配置静态IP [rootserver ~]# nmcli c modify ens33 ipv4.m…

浅尝一下ECS(Entity Component System)(学习笔记)

参考文章:浅谈Unity ECS(一)Uniy ECS基础概念介绍:面向未来的ECS - 知乎 (zhihu.com) 视频链接:【青幻译制】GDC讲座系列之三 守望先锋的游戏架构和网络代码_哔哩哔哩_bilibili 云风的 BLOG: 浅谈《守望先锋》中的 E…

消息队列和分布式消息队列

文章目录 分析系统现状不足中间件消息队列什么是消息队列?应用场景消息队列的模型为什么不直接传输,而要用消息队列?为什么要用消息队列?消息队列的缺点? 分布式消息队列分布式消息队列的优势?消息队列应用…

PLC远程通信:实现工业自动化的关键技术

在当今高度信息化和自动化的时代,工业领域对于实时数据的准确传输和迅速响应提出了更高要求。而PLC(可编程逻辑控制器)远程通信技术,正是能够实现工业自动化的关键技术之一。 首先,我们需要了解PLC远程通信的原理。PLC作为一种专用计算机控制…

设计模式代码实战-组合模式

1、问题描述 小明所在的公司内部有多个部门,每个部门下可能有不同的子部门或者员工。 请你设计一个组合模式来管理这些部门和员工,实现对公司组织结构的统一操作。部门和员工都具有一个通用的接口,可以获取他们的名称以及展示公司组织结构。…

学习BOM

目录 前言: 1. BOM组成: 1.1Window 对象: 1.1Location 对象: 1.2Navigator 对象: 1.2.1 navigator 对象包含了关于浏览器的信息包括: 1.3History 对象: 1.4常用的history的方法和属性: 1.4Document…

氟化钙与盐酸反应

结论:可以反应 参考链接 为什么盐酸,硝酸不能溶解氟化钙呢?氢氟酸可是弱酸啊。。。_百度知道 (baidu.com)https://zhidao.baidu.com/question/421110040.html特此记录 anlog 2024年4月16日

中医圆运动规律

目录 人体圆运动营气在十二经脉的运行规律子午流注与圆运动升降结合图 人体圆运动 营气在十二经脉的运行规律 营气在脉中,卫气在脉外 这个顺序也是子午流注的顺序 子午流注与圆运动升降结合图

【论文阅读02】一种基于双通道的水下图像增强卷积神经网络

来源:海洋论坛▏一种基于双通道的水下图像增强卷积神经网络 当前不会的 一、背景: 水下图像增强方法包含有无水下成像模型的水下图像增强方法、基于水下成像模型的水下图像恢复方法、水下成像模型与深度学习相结合的方法以及完全采用深度学习的方…

数据结构与算法——22.哈希算法

这篇文章我们来讲一下哈希表中较为关键的部分——哈希算法 目录 1.哈希算法的介绍 2.hash算法的使用 2.1 Object.hashCode 2.2 String.hashCode 3.关于哈希表及哈希算法的一些思考 1.哈希算法的介绍 问题:什么是哈希算法?哈希算法有哪些&#xff…