前端PC端适配,网页端适配

news2025/1/13 13:46:31

问题背景

由于我司是使用的大屏,且设计稿尺寸为19201080。但是需要适配各种分辨率, 比如12801024(5:4)、1366768(16:10)、16801050(16:10)。在尝试了多种方法之后,最终确定主要的适配方法为rem方案。

尝试方法的对比

1.使用scale方法:优点是代码最少,缺点是可惜为了网页等比例的显示,会将浏览器的上下,或者左右进行留白。导致效果不是很好(其实是因为产品说这里都有空白的,为什么不占满????无奈, 只能放弃解释)。第二个情况就是我们项目用了地图,缩放比例过大时会导致事件热区偏移
2.rem方法:灵活性强,可以使用px来开发,缺点是也会留白,但是后续通过一些其他的响应式方法可以规避。

两种方法的适用场景:

1.scale方法:如果你的项目没有地图(或者大屏没什么点击事件),只是大屏项目,然后要求等比缩放,允许有一些留白。那么就优先使用这种方法。因为较为简单,整体效果也不错。
2.rem方法:适合有地图,不允许留白。
由于我们项目带了大量的地图,且需要适配5:4比例的,还不能留白(不能留白,那么只能是非等比缩放了),所以我们使用的是rem方案配合其他响应式方法。接下来就整体介绍下rem方案的实现步骤

两种方法的效果:

scale效果(只用了scale,会有留白,但是保证了等比缩放)20230413_000305.gif
rem效果(这里是使用了rem+百分比布局,基本都是全屏了,这里是非等比缩放了。很小的时候看着有滚动条,实际点一下或者刷新一下都没有,估计是我浏览器卡)
20230412_234632.gif
效果解释说明:
1.在项目要求浏览器各分辨率都要等比缩放时,无论是rem/scale都会有相应的留白!!!
2.在项目要求浏览器各分辨率都要铺满全屏时,只使用rem/scale都无法完成需求(需要各分辨率还铺满全屏,肯定不是等比例)。你需要搭配其他的响应式方法。例如:a.媒体查询 b.vh和vw c.flex d.百分比布局等

rem方案实现步骤:

1.安装 flexible.js (建议放到本地)
2.使用 postcss-pxtorem插件

1.安装 flexible.js (建议放到本地)

(function flexible(window, document) {
  var docEl = document.documentElement;
  var dpr = window.devicePixelRatio || 1;

  // 调整 body 字体大小
  function setBodyFontSize() {
    if (document.body) {
      // body 字体大小默认为 16px
      document.body.style.fontSize = 16 * dpr + "px";
    } else {
      document.addEventListener("DOMContentLoaded", setBodyFontSize);
    }
  }
  setBodyFontSize();

  // 移动端默认平均分成 10 等分(适用移动端)
  // pc端默认平均分成 24 等分(适用 pc 端)
  function setRemUnit() {
    var splitNum = /Mobi|Android|iPhone/i.test(navigator.userAgent) ? 10 : 24;
    var rem = docEl.clientWidth / splitNum; // 1920 / 24 = 80
    docEl.style.fontSize = rem + "px"; // 设置 html 字体的大小 80px
  }

  setRemUnit();

  // 页面调整大小时重置 rem 单位
  window.addEventListener("resize", setRemUnit);
  window.addEventListener("pageshow", function (e) {
    if (e.persisted) {
      setRemUnit();
    }
  });

  // 检测 0.5px 支持
  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);

2.使用 postcss-pxtorem 插件

安装命令 npm i postcss-pxtorem@5.1.1 (注意版本号,高版本会报错)
在与src同级的目录下添加postcss.config.js文件

module.exports = {
  plugins: {
    autoprefixer: {},
    "postcss-pxtorem": {
      rootValue: 80, // 根元素的字体大小
      unitPrecision: 5, // 小数点后精度
      propList: ["*"], // 可以从px改变为rem的属性
      exclude: /node_modules/i, // 要忽略并保留为px的文件路径
      minPixelValue: 0, // 最小的px转化值(小于这个值的不转化)
      mediaQuery: false, //  允许在媒体查询中转换px
      selectorBlackList: [], // 要忽略并保留为px的选择器
      replace: true, // 直接在css规则上替换值而不是添加备用
    },
  },
};

这两步之后,你就可以使用px进行开发了。
但是需要注意的是:
1.postcss-pxtorem 插件不能把行内样式转换成rem,所以尽量少些行内样式,否则不会转成rem,还是px。你这里也可以自己写一个loader去把行内样式转成rem,也可以使用插件,或者少些行内样式,都可以。
2.另外就是UI库中的单位还是px,这也是需要注意的,如果需要更改,那就写样式覆盖下。

补充:rem可以作为主方案来实施,但是由于项目要铺满全屏,需要搭配其他响应式方法

例如:a.媒体查询 b.vh和vw c.flex d.百分比布局
其中媒体查询又属于是比较适合的,有超多网站都使用了媒体查询。
例如我们自己写的时候也是搭配了媒体查询。因为缩放到1200宽度的时候,虽然能显示下4个盒子。但是感觉太紧凑了,不如利用媒体查询变成3个盒子或者两个
1920*1080
image.png
宽1000px
在这里插入图片描述

各类需求适合适配的主方案:

移动端: rem(lib-flexible+postcss-pxtorem) 或者 vw方案 参考vant官方文档:https://vant-ui.github.io/vant/#/zh-CN/advanced-usage#liu-lan-qi-gua-pei
PC大屏: scale优先
PC端(官网主页/购物网站/类似知乎,淘宝,小米等主页):使用版心布局
PC端(有地图或不允许留白(设计稿完全占满了1920*1080)):rem(lib-flexible+postcss-pxtorem)+其他响应式方法

本文项目源码地址:https://github.com/rui-rui-an/rem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419639.html

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

相关文章

【vue3】04-vue基础语法补充及阶段案例

文章目录vue基础语法补充vue的computedvue的watch侦听书籍购物车案例vue基础语法补充 vue的computed computed:用于声明要在组件实例上暴露的计算属性。(官方文档描述) 我们已经知道,在模板中可以直接通过插值语法显示一些data中…

科学的演变:从笛卡尔到生成式人工智能

编者按:本文主要介绍了科学的演变历史,从笛卡尔到生成式人工智能。文章探讨了数学在验证科学原理中的作用,并介绍了新机器学习工具如何验证新的科学。 文中提到,将生成式人工智能与Excel或iPhone进行比较是低估了这一新技术的潜在…

【AI】PaddlePaddle实现自动语音识别

文章目录文档背景安装环境Python版本pip环境安装模型需要的环境项目目录结构数据准备生成数据字典数据预处理训练模型创建模型构建模型的目的模型黑盒在模型中充当什么角色解码方法总结文档背景 学习AI的过程中,难免会出现各种各样的问题。比如,什么样的…

制造业生产管理系统(500强制造企业数字化实践)

前言 制造业是国民经济的支柱产业之一,随着科技和数字化的发展,制造业正在经历着一场新的变革。传统的制造模式已经无法满足市场的快速变化和客户的多样化需求,制造企业急需通过数字化和智能化转型升级,提高生产效率和质量水平&a…

第十四届蓝桥杯嵌入式详解

目录 第一部分 客观试题(15 分) 不定项选择(1.5 分/题) 第二部分 程序设计试题(85 分) 2.1 STM32CubeMX初始化配置 2.1.1 配置GPIO 2.1.2 配置ADC 2.1.3 配置RCC 2.1.4 配置定时器TIM 2.1.5 配置ADC1、AD…

【从零开始学Skynet】基础篇(二):了解Skynet

1、节点和服务 在下图所示的服务端系统中,每个Skynet进程(操作系统进程)都称为一个节点,每个节点都可以开启数千个Lua服务,每个服务都是一个Actor。不同节点可以部署在不同的物理机上,提供分布式集群的能力…

Velocity入门到精通(上篇)

最近自己所做的项目使用到这个Velocity模板引擎,分享一下在互联网找的学习资料。 目录 一. velocity简介 1. velocity简介 2. 应用场景 3. velocity 组成结构 二. 快速入门 1. 需求分析 2. 步骤分析 3. 代码实现 3.1 创建maven工程 3.2 引入坐标 3.3 编…

Redis锁的租约问题

目录Redis的租约问题Redis租约问题的想法Redis租约问题的解决方案Redis的租约问题 首先我们先来说一说什么是Redis的租约问题。   在我们实现Redis分布式锁的时候&#xff0c;我们会出现Redis锁的时间<业务执行执行时间&#xff0c;这其实就是一个典型的租约问题&#xf…

【C++】你了解命名空间吗?

C语言之父&#xff1a;Bjarne Stroustrup博士(本贾尼) 当我们在编写代码的时候&#xff0c;可能会产生一些命名冲突&#xff0c;为了解决这一冲突我们引出命名空间的概念 (ps:命名冲突的产生主要包括两个方面原因&#xff1a;1、与库函数名冲突&#xff1b;2、相互之间的冲突&…

【LeetCode】剑指 Offer 51. 数组中的逆序对 p249 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 1. 题目介绍&#xff08;51. 数组中的逆序对&#xff09; 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xf…

python3 DataFrame一些好玩且高效的操作

pandas在处理Excel/DBs中读取出来&#xff0c;处理为DataFrame格式的数据时&#xff0c;处理方式和性能上有很大差异&#xff0c;下面是一些高效&#xff0c;方便处理数据的方法。 map/apply/applymaptransformagg遍历求和/求平均shift/diff透视表切片&#xff0c;索引&#x…

VS Code 将推出更多 AI 功能给 Java 开发者

大家好&#xff0c;欢迎来到我们的二月更新&#xff01;我们将为您带来与 JUnit 5 并行测试相关的新功能以及用于 Spring Boot Dashboard 的过滤功能。另外&#xff0c;OpenAI 和 ChatGPT 是最近的热点&#xff0c;所以在 GitHub Copilot 方面也有一些令人激动的消息&#xff0…

【郭东白架构课 模块二:创造价值】19|节点二:架构活动的目标为什么常常被忽略?

你好&#xff0c;我是郭东白。从这节课开始&#xff0c;我们就进入到架构活动第二个环节的学习&#xff0c;那就是目标确认。 为架构活动确认一个正确目标&#xff0c;是架构师能为架构活动做出最大贡献的环节。从我的个人经验来看&#xff0c;一大半架构活动的目标都不具备正…

类文件具有错误的版本 55.0, 应为 52.0

最近在编译时报如下错误 java: 无法访问com.xx错误的类文件: /xxx.jar!/aa.class类文件具有错误的版本 55.0, 应为 52.0请删除该文件或确保该文件位于正确的类路径子目录中。 原来我依赖的jar包的编译版本是jdk11,而我本地代码编译的版本的jdk1.8,两个版本不一致&#xff0c;所…

C++类和对象终章——友元函数 | 友元类 | 内部类 | 匿名对象 | 关于拷贝对象时一些编译器优化

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;友元&#x1f33a;概念&#x1f33a;友元函数&#x1f341;友元函数的重要性质&#x1f33a;友元类&#x1f341;友元类的重要性质&#x1f337;内部类&#xff08;不常用&#xff09;&#x1f33a;内部类的性…

Ubuntu 下载并切换Python默认版本(无痛顺畅版)

Ubuntu 下载并切换Python默认版本的方法 文章目录Ubuntu 下载并切换Python默认版本的方法一&#xff0c;前言二&#xff0c;在ubantu中下载指定python版本1&#xff0c;更新apt版本为最新2&#xff0c;安装software-properties-common3&#xff0c;将 deadsnakes PPA 添加到你的…

并发 并行 进程 线程

并发 并行 进程 线程 进程和线程介绍 程序、进程和线程的关系示意图 并发和并行 1)多线程程序在单核上运行&#xff0c;就是并发 2)多线程程序在多核上运行&#xff0c;就是并行 示意图: 小结

大模型时代的“Linux”生态,开启人工智能新十年

演讲 | 林咏华 智源人工智能研究院副院长 整理 | 何苗出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;2018 年以来&#xff0c;超大规模预训练模型的出现推动了 AI 科研范式从面向特定应用场景、训练专有模型&#xff0c;转变为大模型微调模型服务的AI工业化开…

016 - 如何写一个 C++ 类

到目前为止&#xff0c;我们学了类 class&#xff0c;本期我们要尝试着从头开始写一个类。 本期不会讲的太深。我们不会写非常复杂的类&#xff0c;我们要会完成一个基本的 log 类&#xff0c;来演示一下我们已经学过的相关知识。 接下来的几期&#xff0c;我们会继续学习类。…

银行数字化转型导师坚鹏:《银行业金融机构数据治理指引》

《银行业金融机构数据治理指引》 ——“监”听则明 护航银行高质量发展课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不清楚《银行业金融机构数据治理指引》出台背景&#xff1f; 不知道如何理解《银行业金融机构数据治理指引》相关规定&#xff1f; 不清楚…