面试官:你知道移动端适配吗?

本文介绍了移动端适配的多种方案,包括百分比设置的局限性、rem单位与动态font-size的应用,vw单位的优势,以及lib-flexible库的原理。作者还推荐了vw作为更直观和稳定的适配方式,并提供了相应的单位转换方法和工具。
摘要由CSDN通过智能技术生成

大家好,我是宝哥。

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

正文

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

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

为什么要做移动端适配?

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

  • 当我们针对一个手机进行布局设计时,设置了一个 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插件

5f3e0952f20fefd27ad7c790d11665fc.jpeg
截屏2024-02-15 00.15.13.png
faebf3caaecf23a77cdce27944292112.jpeg
截屏2024-02-15 00.16.35.png

方案一:媒体查询

思路:通过媒体查询来设置不同尺寸屏幕下 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 插件,在编写时自动转化:

d5caae89078163f348250c3b9fcf6782.jpeg
d7b6a763b8cd4395b1841008325116ab.png

关于本文

作者:专写BUG

https://juejin.cn/post/7335245199109652516

公号文章分七类

随时都会有更新

程序员

  1. 真诚利他

  2. 一个30岁前端老社畜的人生经历

  3. 2023年中大厂面试经历分享,很可惜,但是没关系

  4. 给迷茫的朋友一点建议吧,主要是前端方向的。

  5. 37岁的老前端在大专院校教前端

  6. 一个30岁老前端的人生经历(学习+工作+婚姻+孩子),给迷茫的朋友一点激励。

  7. 程序员如何应对ChatGPT带来的改变

  8. 尤雨溪解读 2022 Web 前端生态趋势

  9. 阿里前端:我的老婆失业了,周围同事也在不断被裁

  10. 一个月薪 12000 的北京程序员的真实生活

  11. 作为前端,工作中处理过什么复杂的需求?

  12. 尤雨溪亲自回应Vue.js涉及国家安全漏洞问题

  13. 开源作者恶意搞破坏,谁来为开源买单?

  14. 程序员裸辞后,在家全职接单一个月的感触

  15. 2022年如何成为一名优秀的大前端Leader?

面试

  1. 14个JS面试难点深入解读与代码实现

  2. 中小型公司三年工作经验的面试经历

  3. 2023年中大厂面试经历分享,很可惜,但是没关系

  4. 面试官:能不能给 Promise 增加取消功能和进度通知功能... 我:???

  5. 一个22届被裁前端思想上得转变

  6. 23年底,两年前端菜狗被裁后的面试经历

  7. 一年空窗期后我是如何准备面试的?

  8. 一份比较完整的字节技术面试题,包含算法、计算机网络和前端等

  9. 面试官:请使用 JS 完成一个 LRU 缓存?

  10. 正确介绍自己的项目,终于不用害怕面试了

  11. 本人是工作 11 年的老前端,面试一个月忽悠了十几个 offer

JavaScript

  1. 14个JS面试难点深入解读与代码实现

  2. ES14数组升级来袭,这六个新API助你高效开发

  3. FaceBook 开源 AtomicCss 解决方案:Stylex

  4. 前端是怎么解析Excel、PDF、Word、PPT等文件的?

  5. 面试官:能不能给 Promise 增加取消功能和进度通知功能... 我:???

  6. 14个提高JavaScript代码质量的小技巧

  7. JS es6仿网易云音乐播放器

  8. WebSocket 从入门到入土

  9. 如何构建一个仅有2KB大小、无依赖的状态管理器(以及它如何帮我获得两个不同的工作机会)

  10. JS代码其实可以这样写

  11. 详解HTML中的拖拽案例和难点分析

  12. 20 个 JS 工具函数助力高效开发

  13. 使用 JavaScript 编写更好的条件语句

  14. JS 运行机制最全面的一次梳理

  15. 8个console.log的解决方案

  16. 25个有用的 JavaScript 单行代码

  17. 前端工程师都在忙些什么?

  18. 我用 80 行核心 JS 代码每个月躺着挣一瓶肥宅快乐水

  19. localStorage 的高阶用法

  20. 某一线前端小组长的 Code Review 分享

  21. 一行 Object.keys() 引发的思考

  22. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

  23. 常用的前端JavaScript方法封装

  24. 刷算法题常用的JS基础扫盲

  25. 2022前端应该掌握的10个 JS 小技巧

  26. Three.js实现跳一跳(在线玩)

  27. 10个常用的JS工具库,80%的项目都在用!

  28. 我的代码简洁之道

  29. 一行 Object.keys() 引发的血案

前端开发

  1. 聊一聊自己的前端之路以及后面晋升的一些想法

  2. 如何做好前端项目组组长

  3. 如何构建一个仅有2KB大小、无依赖的状态管理器(以及它如何帮我获得两个不同的工作机会)

  4. 高级前端开发工程师必备:Hooks、React Router v6 和状态管理

  5. 高级前端开发工程师必知:浏览器解析代码、JavaScript代码执行流程、原型链与闭包

  6. 高级前端开发工程师必备:Hooks、React Router v6 和状态管理

  7. 高级前端开发工程师必知:浏览器解析代码、JavaScript代码执行流程、原型链与闭包

  8. JS代码其实可以这样写

CSS

  1. CSS中的相对单位和绝对单位,以及rem自适应布局

  2. 10个常见渐变交互效果

  3. CSS动画的实现和最佳优化实践

  4. 现代CSS中的换行布局技术

  5. 你知道flex: 0 0 200px;和grid-template-columns: repeat(3, 1fr);的含义吗?

  6. 10 个不错的 CSS 小技巧

  7. 为什么会存在1px问题?怎么解决?

  8. 2022 年的 CSS 全览

  9. CSS mask 实现鼠标跟随镂空效果

AI

  1. 无代码工具+人工智能:19岁少年月入5000美元,八款免费工具助你在线赚钱!

  2. AI 时代来临,这些 AI 工具让你的工作更加高效!

  3. 程序员如何应对ChatGPT带来的改变

  4. 10个热门的ChatGPT项目推荐

  5. ChatGPT 8个场景下的灵活应用技巧,让您事半功倍!

资源

  1. 程序员必看!15个优秀的中文技术博客汇总

  2. AI 时代来临,这些 AI 工具让你的工作更加高效!

  3. 程序员如何应对ChatGPT带来的改变

  4. 10个热门的ChatGPT项目推荐

  5. 推荐15个有用的前端技术博客

  6. 尤雨溪解读 2022 Web 前端生态趋势

  7. 2022,VSCode 前端插件推荐

  8. 几个高级前端常用的API

  9. 30个前端开发人员必备的顶级工具

  10. 45 个 Git 经典操作场景,专治不会合代码

  11. 推荐 10 个很“哇塞”的Web“资源”给前端工友,收藏等于学会~

  12. 送给 xdm 的 10 个 web 在线前端资源,优雅永不过时~

  13. 干货!移动端真机调试指南,对调试说easy

  14. 25 个前端相关的学习网站和一些靠谱的小工具

最后

欢迎长按图片加好友,宝哥会第一时间和你分享前端行业趋势,面试资源,学习途径等等。

561208c63faa0e567aacd24e4adef573.png

添加好友备注【加群】拉你进技术交流群

公众号前端开发博客 专注 前端开发技术,分享 前端开发资源WEB前沿资讯,如果喜欢我的分享,给 宝哥 点一个 或者 分享 都是对我的支持

关注公众号后,在首页:

  • 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF

  • 回复「Vue脑图」获取 Vue 相关脑图

  • 回复「思维图」获取 JavaScript 相关思维图

  • 回复「简历」获取简历制作建议

  • 回复「简历模板」获取精选的简历模板

  • 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。

  • 回复「知识点」下载高清JavaScript知识点图谱

  • 回复「读书」下载成长的相关电子书

老规矩,学会了点个赞或在看呀~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值