zoukankan      html  css  js  c++  java
  • 了解真实的rem手机屏幕适配

    rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用。使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果。

    rem 的官方定义『The font size of the root element.』,即以根节点的字体大小作为基准值进行长度计算。一般认为网页中的根节点是 html 元素,所以采用的方式也是通过设置 html 元素的 font-size 来做屏幕适配,但实际情况真有这么简单吗?

     首先我们来看看使用 rem 实现手机屏幕适配的常用方案。

    以设计稿的宽度为640px,即:designWidth = 640,同时设定在640px屏宽下 1rem=100px ,即:rem2px = 100。

    设置 1rem=100px 的优点不言而喻。前端开发者在切图、重构页面的时候,通过直接位移小数点的方式,就可以将UI图中测量到的 px 值换算成对应的 rem 值,方便快捷。

    此外,在 head 中我们还设置了:<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />

    viewport 的作用很重要,但不是本文的重点所以不展开,有兴趣的同学可以自行搜索。

    先来看看具体方案:

    下面四个方案原理都是采用等比缩放的方式 —— 获得目标屏幕宽度和设计稿宽度的比,作为 rem 的基值(缩放系数),设置为html标签的字体大小。不同的只是在于性能取舍和书写习惯。

    方案1

    @media screen and (min- 320px) {html{font-size:50px;}}
    @media screen and (min- 360px) {html{font-size:56.25px;}}
    @media screen and (min- 375px) {html{font-size:58.59375px;}}
    @media screen and (min- 400px) {html{font-size:62.5px;}}
    @media screen and (min- 414px) {html{font-size:64.6875px;}}
    @media screen and (min- 440px) {html{font-size:68.75px;}}
    @media screen and (min- 480px) {html{font-size:75px;}}
    @media screen and (min- 520px) {html{font-size:81.25px;}}
    @media screen and (min- 560px) {html{font-size:87.5px;}}
    @media screen and (min- 600px) {html{font-size:93.75px;}}
    @media screen and (min- 640px) {html{font-size:100px;}}
    @media screen and (min- 680px) {html{font-size:106.25px;}}
    @media screen and (min- 720px) {html{font-size:112.5px;}}
    @media screen and (min- 760px) {html{font-size:118.75px;}}
    @media screen and (min- 800px) {html{font-size:125px;}}
    @media screen and (min- 960px) {html{font-size:150px;}}

    方案2

    @media screen and (min- 320px) {html{font-size:312.5%;}}
    @media screen and (min- 360px) {html{font-size:351.5625%;}}
    @media screen and (min- 375px) {html{font-size:366.211%;}}
    @media screen and (min- 400px) {html{font-size:390.625%;}}
    @media screen and (min- 414px) {html{font-size:404.2969%;}}
    @media screen and (min- 440px) {html{font-size:429.6875%;}}
    @media screen and (min- 480px) {html{font-size:468.75%;}}
    @media screen and (min- 520px) {html{font-size:507.8125%;}}
    @media screen and (min- 560px) {html{font-size:546.875%;}}
    @media screen and (min- 600px) {html{font-size:585.9375%;}}
    @media screen and (min- 640px) {html{font-size:625%;}}
    @media screen and (min- 680px) {html{font-size:664.0625%;}}
    @media screen and (min- 720px) {html{font-size:703.125%;}}
    @media screen and (min- 760px) {html{font-size:742.1875%;}}
    @media screen and (min- 800px) {html{font-size:781.25%;}}
    @media screen and (min- 960px) {html{font-size:937.5%;}}

    方案3

    var designWidth = 640, rem2px = 100;
    document.documentElement.style.fontSize =
      ((window.innerWidth / designWidth) * rem2px) + 'px';

    方案4

    var designWidth = 640, rem2px = 100;
    document.documentElement.style.fontSize =
      ((((window.innerWidth / designWidth) * rem2px) / 16) * 100) + '%';

    为了更避免理解上的混乱,我在上面js的代码中加了 ( ) ,实际代码中是不需要的。

    详细分析一下,rem 和 px 直接的转换公式可以写为:

    1rem = 1 * htmlFontSize

     

    htmlFontSize 为 html 元素的字体大小。

    首先来看方案1中,在屏宽为640px情况下的设置:

    @media screen and (min-width640px) {html{font-size:100px;}}

     

    可以很明显的表现出这一点 1rem = 1 * 100px ,同我们最初的设定。那么我们要得到其它屏幕大小的 htmlFontSize 值要怎么办。很简单如方案3,因为我们的采用等比缩放的方式适配,所以计算目标屏幕宽度和设计稿的宽度的比即可:

    window.innerWidth / designWidth * rem2px + 'px'

     

    由于浏览器默认字体大小为 16px,所以当我们使用百分比作为根节点 html 的字体大小时,即html元素的font-size值设置为一个百分比值,rem 的计算方式就会改为:

    defaultFontSize = 16px

    1rem = 1 * htmlFontSize * defaultFontSize

    如方案2中,在屏宽为640px情况下的设置:

    @media screen and (min-width640px) {html{font-size:625%;}}

     

    应用上面的公式:

    1rem = 1 * 625% * 16px

    其中:625% * 16 = 6.25 * 16 = 100

    所以:1rem = 1 * 100px

    同样的可以得到所有屏幕大小下,html 的 font-size 值的计算公式,即为方案4:

    window.innerWidth / designWidth * rem2px / 16 * 100  + '%'

     

    通过方案3和方案4的公式,就可以很方便的生成方案1和方案2中的css。

  • 相关阅读:
    快直播-基于WebRTC升级的低延时直播
    在HTML5上开发音视频应用的五种思路
    H.265/HEVC Web端直播播放器内核开发解密
    FFmpeg 命令行和API方式转换rtsp或264成Fragmented MP4
    rtsp流转为fmp4并由WebSocket网关转发,及对应js播放器
    基于FFMPEG封装aac及h264为FargmentMP4
    HTML5 直播协议之 WebSocket 和 MSE fmp4
    wasm + ffmpeg实现前端截取视频帧功能
    es~ElasticsearchTemplate的查询和聚合
    springboot~通过面向接口编程对控制反转IOC的理解
  • 原文地址:https://www.cnblogs.com/cczlovexw/p/7458670.html
Copyright © 2011-2022 走看看