记载一下项目里 移动端的适配,主要结构为ts

该代码实现了一个RemUtil类,用于处理移动端和PC端的屏幕适配问题。它基于Rem单位,根据设备像素比(dpr)和屏幕尺寸动态设置根字体大小,从而调整页面元素尺寸。类中包含了初始化、获取字体大小、设置Body字体大小以及监听窗口大小变化的函数,确保在不同设备上页面布局的合理性。同时,文章强调了在实际开发中应区分移动端和PC端的适配代码。
摘要由CSDN通过智能技术生成

首先贴代码:

import Util from "@/com/xr/lib/utils/Util";
import ProjectConfig from "../../../../../project.config";

/**
 * rem转换
 */
export default class RemUtil {
  // pc的屏幕最小宽度
  private pcMinWidth: number = 1280;
  // pc的屏幕最大宽度
  private pcMaxWidth: number = 1400;
  // pc的最小屏幕高度
  private pcMinHeight: number = 720;
  // pc的最大屏幕高度
  private pcMaxHeight: number = 800;
  // 移动端最小屏幕高度
  private h5MinWidth: number = 750;

  // 初始化
  public init() {
    // 设置根字体大小
    this.setBodyFontSize();
    // 再次执行设置字体大小
    this.setRemUnit();
    const that = this;
    // 监听浏览器的调整大小事件
    window.addEventListener('resize', ()=> {
      this.setRemUnit();
    });
    // 监听浏览器的页面显示事件
    window.addEventListener('pageshow', (e)=> {
      if (e.persisted) {
        that.setRemUnit();
      }
    });
    ProjectConfig.log("font-size:" + parseInt(String(this.getFontSize())) + " dpr:" + this.getDrp() + " width:" + document.documentElement.clientWidth);
  }

    
  private getFontSize() {
    let docEl = document.documentElement;
    // 获取drp(设备像素比),
    let dpr = this.getDrp();
    // 这里工具包判断了此设备是不是移动端。
    if (Util.isPhone()) {
      if(dpr >= 2) {
        dpr = 1;
      }
      // 这里就是手机端的适配啦 。返回的是一个像素应该表示多大
      //手机端 
      return (docEl.clientWidth / this.h5MinWidth) * 10 * dpr;
    } else {
      // 这里是web端的配置。
      dpr = 1;
      //web端
      let w = docEl.clientWidth;
      if(w < this.pcMinWidth) {
        w = this.pcMinWidth;
      }else if(w > this.pcMaxWidth) {
        w = this.pcMaxWidth;
      }
      let h = docEl.clientHeight;
      if(h < this.pcMinHeight) {
        h = this.pcMinHeight;
      }else if(h > this.pcMaxHeight) {
        h = this.pcMaxHeight;
      }
      let n1 = (w / this.pcMinWidth) * 10 * dpr;
      let n2 = (h / this.pcMinWidth) * 10 * dpr;
      let n = n1;
      if(n1 < n2) n = n2;
      return n;
    }
  }

  private setBodyFontSize() {
    if (document.body) {
      document.body.style.fontSize = this.getFontSize() + "px";
    } else {
      // MDN解析:当初始HTML文档已完全加载和解析时,将触发DOMContentLoaded事件,而不需要等待样式表,图像和子框架页面加载(事件可以用来检测HTML页面是否完全加载完毕(fully-loaded))。
      document.addEventListener('DOMContentLoaded', this.setBodyFontSize);
    }
  }

  private setRemUnit() {
    let docEl = document.documentElement;
    docEl.style.fontSize = this.getFontSize() + 'px';
  }
  // css像素:css中的绝对单位,移动端适配的相对单位。不同的1px在不同的移动端有不同的表现。
  // 设备像素(device pixels): 单位是pt,指的是屏幕上的一个像素点。
  // 设备独立像素(Device Independent Pixel):可以通过程序控制使用的像素,包含css像素。在js中,可以通过window.sceen.width/height来查看,
  // 设备像素比(dpr):简称dpr,可以通过window.devicePixelRatio来获取。代表设备独立像素到设备像素的转换关系 
  // 计算公式:设备像素比(dpr) =设备像素也叫物理像素(dp) / css像素也叫设备独立像素

  private getDrp(): number {
    // 获取到网页根元素
    let docEl = document.documentElement;
    // 获取网页的设备像素比
    let dpr = window.devicePixelRatio || 1;
    // 当dpr大于或者等于2时
    if (dpr >= 2) {
      var fakeBody = document.createElement('body');
      var testElement = document.createElement('div');
      fakeBody.appendChild(testElement);
      docEl.appendChild(fakeBody);
      if (testElement.offsetHeight === 1) {
        docEl.classList.add('hairlines');
      }
      docEl.removeChild(fakeBody);
    }
    return dpr;
  }
}

这里的内容要记一下

  // css像素:css中的绝对单位,移动端适配的相对单位。不同的1px在不同的移动端有不同的表现。
  // 设备像素(device pixels): 单位是pt,指的是屏幕上的一个像素点。
  // 设备独立像素(Device Independent Pixel):可以通过程序控制使用的像素,包含css像素。在js中,可以通过window.sceen.width/height来查看,
  // 设备像素比(dpr):简称dpr,可以通过window.devicePixelRatio来获取。代表设备独立像素到设备像素的转换关系 
  // 计算公式:设备像素比(dpr) =设备像素也叫物理像素(dp) / css像素也叫设备独立像素

建议:
// 实际开发中做移动端适配的时候,要写一套pc端代码,一套移动端代码。不要掺在一起写。会很乱很臃肿。
其他的适配方案还有很多,就不在一一叙述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值