首页 > 其他分享 >移动端适配方案

移动端适配方案

时间:2023-08-16 22:35:02浏览次数:34  
标签:方案 font 10 适配 px 视口 rem 移动 size

前置知识

px 像素单位

px 全称为 pixel(像素),它是相对于 屏幕显示器分辨率(桌面设定的分辨率,不是显示器的物理分辨率) 而言的,在 相同/不同 的设备上 1px 表示多个 设备像素。
当 一个像素点越大 时, 呈现的图像就会 越模糊;当一个像素点越小时, 像素点就会 越密集, 呈现的图像就会 越清晰。

image

em 相对单位

好多人都认为 em 就是相对于 父元素 font-size,实际上在不同的 CSS 属性当中使用 em 其相对的目标也是不同,如下:

  • 用于 font-size 中则是相对于 父元素 font-size 大小
  • 用于 其他属性(如 width,height) 中使用是相对于 自身 font-size 大小
    image
    值得注意的是,若 当前元素/父元素 的 font-size 未设置,由于 font-size 属性值可被继承的原因,可逐级向上查找,最终找不到则相对于浏览器默认字体大小,即 font-size = 16px。

rem (root em) 相对单位

rem 是 CSS3 新增的一个相对单位,它只相对于 根元素 html 的 font-size 字体大小,rem 与 em 的区别在于:

rem 相对于 html 根元素的,因此在 body 标签里面设置 font-size 是不起作用的

因此 rem 就可做到 目标元素 与 根元素 间保持 成比例 的大小关系,又可以避免字体大小逐层复合的连锁反应等,例如公共的字体大小可以在 body 中设置即可
image

image

vw 和 vh

vw 全称是 viewport width,代表的是 视口的宽度,相对于 视口 viewport 的 宽度
vh 全称是 viewport height,代表的是 视口的高度,相对于 视口 viewport 的 高度
vw 和 vh 是将 视口 宽/高 都分成 100 份,因此 100vw = 视口宽、100vh = 视口高

适配方案

rem适配

核心原理

将 设备视口 划分成 n 份, n 可以是 任何正确的值(如 flexible.js 中的 n = 10)

设置 设备视口 根元素 html 的 font-size = 设备视口宽 ÷ 份数 n,即得到 设备视口 1 rem 到底表示 多少设备视口 px

将 设计稿 也同样划分成 n 份,此时 设计稿中的 a px 对应 设备视口 b rem 的计算方式为

设备视口 b rem = 设计稿 a px ÷ (设计稿 宽 ÷ n 份)

举个例子
设备视口宽为 375px
image

将设备视口分成 10 份,设置 根元素 html 的 font-size = 375 ÷ 10 = 37.5 px,即 1 rem = 37.5 px

(function (n = 10){
    const dEl = document.documentElement;
    
    function setRem(){
        const rem = dEl.clientWidth / n;
        dEl.style.fontSize = rem  + 'px';
    }

    // 初始化执行
    setRem()

    // 视口大小变动时执行
    window.onresize = setRem
})()

设计稿宽为 750px

image

将 设计稿 也分成 10 份,每份大小 = 750 ÷ 10 = 75 px

此时 设计稿 上的 "点我拍照"(font-size: 34px) 的文案转换成符合 设备视口 对应的 rem 就为:
image

设备视口 中 文字 font-size = 34 ÷ 75 = 0.4533333333333333 rem ≈ 0.45 rem

【注意】 一般计算结果(人为计算、插件自动化自动化计算)都不会使用这么长的小数位,比如 0.4533333333333333 rem ≈ 0.45 rem,此时:
原始值 0.4533333333333333 rem = 0.4533333333333333 * 37.5 = 17 px
保留两位小数后的值 0.45 rem = 0.45 * 37.5 = 16.875 px
而在肉眼观察下 16.875 px 和 17 px 是没有差别的,因此可以忽略不计

这种方式其实就是淘宝的 amfe-flexible 方案。

实际使用

在vue3+vite+ts项目中

utiles/change.ts 基本使用淘宝flexible源码,加了最大width限制

(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 > 540 ? 540 / 10 : 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))

style/index.scss

$baseFontSize: 75;

@function p2r($px) {
  @return calc($px / $baseFontSize) * 1rem;
}

在vite中导入scss文件

css: {
      preprocessorOptions: {
        scss: {
          // 引入scss文件
          additionalData: `@use "./src/style/index.scss" as *; `,
        }
      }
    },

main.ts中导入change.ts

import '@/utils/change'

使用

<style  lang="scss">
html,body {
  margin: 0;
}
#app {
  height: 100vh;
  width: p2r(750);
  margin: 0 auto;
}
 #app-contain {
  margin: 0 auto;
  height: 100vh;
  width: 100%;
  /* max-width: 700px; */
 }
</style>

可以看到已经生效
image

标签:方案,font,10,适配,px,视口,rem,移动,size
From: https://www.cnblogs.com/zychuan/p/17636379.html

相关文章

  • 谷歌扩展相关问题及解决方案
    1、谷歌扩展的background:浏览器扩展页面分为background和popup,具体就不多解释啦其中background部分是常驻浏览器的,在manifest.json配置中可以配置多个js,但是只能配置一个html,且是二选一不能两个都配置的。但是往往需求是多变的,那么如果需要多个html在background,两种方案:1、在......
  • 项目概况与技术方案
    项目概况与技术方案概述​ 该项目是一个针对用户行为日志分析的T+1离线数仓项目;通过构建数仓分析,了解用户的活跃情况、交互情况、流量概况等信息。数仓通过云服务器集群进行部署,开发后端程序提供服务接口。参考《大数据之路:阿里巴巴大数据实践》,该数仓构建了ODS层、DWD层、DWS......
  • MT6761|MTK6761安卓核心板_MTK核心板模块方案定制
    MT6761核心板是一款集成了蓝牙、FM、WLAN和GPS模块的高度集成基带平台设备(见图1-1),它融合了调制解调器和应用处理子系统,支持LTE/LTE-A和C2K智能手机应用。芯片集成了ARM®Cortex-A53处理器,主频可达2.0GHz,并搭载强大的多标准视频编解码器。此外,它还包括一系列接口和连接外设,......
  • 关于部分地区EDGE浏览器首页或者“新建标签页”无法打开、一直转圈或空白页的解决方案
    假期回家期间遇到一件事情,家里使用的是ikuai软路由,接入了山东移动+山东广电双线路,最近几天EDGE浏览器启动时一直不太顺畅,具体表现为浏览器启动时一直转圈,且首页变成空白页,点击“新建标签页”也会出现此现象。此外,微软的MSN(www.msn.cn)也无法正常访问。我突然冒出一个想法,会不会是......
  • 软件资产管理的五大难点和解决方案,让您应对软件管理的各种挑战
    如何选择软件资产管理工具软件资产管理,是指对组织拥有或使用的软件进行规范、有效和高效的管理,以实现软件资产的最大化利用和价值。随着软件在组织中的应用越来越广泛和深入,软件资产管理也越来越重要和紧迫。软件资产管理不仅可以帮助组织节省软件采购和维护的成本,提高软件使用的效......
  • 软件资产管理的五大难点和解决方案,让您应对软件管理的各种挑战
    如何选择软件资产管理工具软件资产管理,是指对组织拥有或使用的软件进行规范、有效和高效的管理,以实现软件资产的最大化利用和价值。随着软件在组织中的应用越来越广泛和深入,软件资产管理也越来越重要和紧迫。软件资产管理不仅可以帮助组织节省软件采购和维护的成本,提高软件使用的效......
  • 小程序手写tab切换下边框跟随移动特效
    简单效果就是这样,主要是用到微信的动画和获取元素信息left处理。具体来说就是先给红色的边一个固定位置,等到点击切换下一个按钮的时候,获取到下一个按钮的left信息,然后对红色边框使用translateX动画效果,代码如下:wxml<viewclass="tab"><viewbindtap="changeType"id="a1......
  • 浅析基于视频汇聚与AI智能分析的新零售方案设计
    一、行业背景近年来,随着新零售概念的提出,国内外各大企业纷纷布局智慧零售领域。从无人便利店、智能售货机,到线上线下融合的电商平台,再到通过大数据分析实现精准推送的个性化营销,智慧零售的触角已经深入各个零售场景。最近在视频汇聚业务项目对接中,关于智慧零售的项目比较多,主要集中......
  • 安防视频监控平台EasyNVR视频监控汇聚平台页面无法上传授权文件的问题解决方案
    TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等......
  • 【备忘】移动大王卡使用详细
    定向数据流量移动大王卡包含的定向流量,可在优酷视频、腾讯视频、爱奇艺、芒果TV、pptv、西瓜视频APP、咪咕系列APP、头条(含抖音)系列APP、快手、网易云音乐、哔哩哔哩、王者荣耀、阿里系列(包括手机天猫、支付宝、钉钉、口碑、闲鱼、聚划算、蚂蚁财富、手机淘宝(看直播免流,开直播不......