vue3移动端适配的解决方案

news/2024/5/8 22:59:14/文章来源:https://blog.csdn.net/weixin_42063951/article/details/127734001

文章目录

  • 前言
  • 一、使用插件
    • ① 纯wap项目
      • 效果:
      • Demo:
    • ② pc&wap混合项目(我放弃了)
  • 二、老方案
    • 效果:
    • Demo:


前言

最近在给公司内部做一个BBS论坛,需要在电脑和手机上都可以操作,所以需要做移动端的适配,下面是我在开发后觉得不错的一些解决方案,分享给大家。


一、使用插件

在vue2的时候我们可以使用lib-flexible + postcss-pxtorem 去对移动端进行适配,不过lib-flexible这个过度方案弃用了,所以我们可以在vue3中用amfe-flexible + postcss-pxtorem,vant也推荐用这两搭配,老实说,vant是真的香(づ ̄3 ̄)づ。

vant 推荐使用在=》进阶用法=》Rem 布局适配 :传送门

下面来看一下这两插件怎么用吧,我们先执行命令安装这两插件(测试用的vue版本是3.2.13)

amfe-flexible:目前执行默认指向2.2.1版本

npm i -S amfe-flexible

postcss-pxtorem 目前执行默认指向6.0.0版本

npm install postcss-pxtorem --save-dev

安装完后我们先在main.js中引入amfe-flexible

import 'amfe-flexible'

接着在项目根目录新建一个postcss.config.js文件

Vue3脚手架项目|-public|-src|-postcss.config.js

① 纯wap项目

如果你的项目不考虑放PC端的页面的话,直接把下面的代码拷贝到上面创建的js文件里就好了:

// postcss.config.js
module.exports = {plugins: {'postcss-pxtorem': {rootValue({ file }) {return file.indexOf('vant') !== -1 ? 37.5 : 75; // 因为vant框架是以375px的稿子为基础的,所以需要适配一下},propList: ['*'], // 需要转换的css属性,默认*全部}}
}

配置完之后我们就可以在项目中以px为单位去开发了,是的,不用我们手动敲rem转换去开发了,PS设计稿的宽度以750px为基准,否则需要自己调一下,开发时稿子是1px,你就写1px就好了,插件会帮我们换算成rem。

效果:

我用vant4简单搭了个项目,从GIF中可以看到px都自动转化成rem了,vue的logo我给了375px的宽高,当窗口宽度为750像素时,logo的实际宽高是375px,也就是说我们只要按750的设计稿去写,就能以1:1进行页面还原了。

在这里插入图片描述

Demo:

如果你的项目完全不用考虑pc端的话,可以参考参考这个demo。
下载地址:vue3-page-adapter-m


② pc&wap混合项目(我放弃了)

如果你的项目既要放手机端的页面,又要放电脑端的页面,那么我是不推荐你用amfe-flexible + postcss-pxtorem去适配你的项目的,至于为什么,可以看看下面我踩的坑。

本地工作目录:

Vue3脚手架项目|-src|-views|-m|-pc

比如说你的工作目录有两个文件夹,一个用来放手机端的页面,一个用来放电脑端的页面,那么我们肯定是不想pc文件夹里的页面被转换成rem,也不想pc端的ui框架(element plus)被转换成rem,那么postcss-pxtorem提供了下面4中形式来处理是否需要把pc转化成rem:

  • rootValue({ file }):转换比率
  • propList[]: 需要转换的css属性,默认*全部,比如不想字体被转换,那就在数组里面加入'!font-size'
  • selectorBlackList[]:不需要转换的class类名
  • exclude:不需要转换的文件夹,可以使用三种形式:字符串(String)、正则表达式(Regexp)、 函数(Function

首先为了不让pc文件夹下面的页面自动转化成rem,我配置了exclude参数来区分,之后pc文件夹下的vue文件的样式确实不会自动转换了,但是引入element plus后,拖动窗口你会发现el组件自动缩放了,是的,就算你在配置好的pc文件夹里使用去第三方框架,第三方框架还是会自动转化成rem,于是我配置了selectorBlackList,于是我把有关el:root的类名全部设置成不自动转换,之后el组件确实不会自动缩放了,但是这样的话手机端的vant组件不会自动缩放了,除非手动去设置像素大小,这是因为第三方框架的一些基础属性都是放在:root下,具体看下面的GIF:

至于为什么要设置:root类名,因为el组件的默认值都在这个类名下,不排除的话一些字体会转化成rem,导致字体自动缩放;另外你可能还会问el组件的默认值都是--el开头的属性,为什么不用propList去排除?我试过,不行)

在这里插入图片描述

相关代码:

// postcss.config.js
module.exports = {plugins: {'postcss-pxtorem': {rootValue({ file }) {return file.indexOf('vant') !== -1 ? 37.5 : 75; // 因为vant框架是以375px的稿子为基础的,所以需要适配一下},propList: ['*'], // 需要转换的css属性,默认*全部selectorBlackList: ['el',':root'], // 不需要转换的class类名exclude: 'src\\views\\pc' // 不需要转换的文件夹// exclude: /src\\views\\pc/i// exclude: function (file) { return file.indexOf('src\\views\\pc') !== -1; }}}
}

接着我又尝试在rootValue里有关element-plus组件的都返回false,结果vant框架能缩放了,element框架能不自动缩放了,但是:root类名里的--el的一些默认值都被替换成了Infinityrem,所以el的一些字体、高度、圆角等默认值都不会有了,(╯°Д°)╯︵┻━┻,我选择狗带了。

在这里插入图片描述

相关代码:

// postcss.config.js
module.exports = {plugins: {'postcss-pxtorem': {rootValue({ file }) {if (file.indexOf('element-plus') !== -1) return falsereturn file.indexOf('vant') !== -1 ? 37.5 : 75; // 因为vant框架是以375px的稿子为基础的,所以需要适配一下},propList: ['*'], // 需要转换的css属性,默认*全部selectorBlackList: ['el'], // 不需要转换的class类名exclude: 'src\\views\\pc' // 不需要转换的文件夹// exclude: /src\\views\\pc/i// exclude: function (file) { return file.indexOf('src\\views\\pc') !== -1; }}}
}

经过一顿操作后,还是没有办法很好的用amfe-flexible + postcss-pxtorem去兼顾pc+wap的项目,并且考虑后续pc端不可能只用element框架,所以我放弃这种方案了


二、老方案

最后,为了项目里能同时兼顾pc端和wap端,我还是选择用了以前写原生时的方案,不清楚的可以看看我之前写的文章:传送门,下面来看一下可行性吧。

Vue3脚手架项目|-public|-index.html

我们先在index.html文件的<head>标签里加入下面的代码:

  <script>const isMobile = () => {const flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)return flag ? true : false;}if (isMobile()) {//封装响应式像素方法,初始化单位,实现手机端1rem=100pxconst responsivePX = () => {//获取页面的宽度let deviceWidth = document.documentElement.clientWidth;//如果页面大于750,即px端的页面,则把html的像素锁死在100pxif (deviceWidth > 750) deviceWidth = 750;document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';}// 第一次初始化像素大小responsivePX();// 监听窗口二次刷新像素大小window.onresize = () => {responsivePX();};}</script>

这段代码的大致功能是监听到设备是移动端时,就会根据窗口的大小去动态设置html的字体大小,之后我们就可以在项目中以rem为单位去开发移动端了,为了防止字体过大,我做了限制,就是当屏幕大于750时,最大字体仍旧是100px,当屏幕刚好等于750时,rem和px的比例为1:100,也就是说用750像素的设计稿去开发,比如页面宽度是100px,那么我们代码里写1rem就行了,相信都能看懂,不多说了。

效果:

用老方案的话完全不用担心pc端会自动缩放了,因为在pc环境我们压根就没动态设置html根标签的字体,唯一比较麻烦的是写移动端页面时要换算成rem,还有就是因为不会自动把px转化成rem,所以第三方框架并不会自动缩放,比如vant的组件,它是有默认的px值的,如果你想要某个组件自动缩放的话,手动设置一下rem就好,其实一些组件不设置缩放我反而会觉得看得更舒服,比如tabbar,这个因人而异吧,问题不大。需要注意的是如果你用了vant的tabbar,会有一部分视野挡住内容,需要根据你设置的高度或默认的高度去设置下padding,具体可以看下GIF:

在这里插入图片描述


Demo:

如果你的项目需要把pc端和wap端放一块写,可以参考参考这个demo。
下载地址:vue3-page-adapter-pc-m

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找出链表中间结点的三种解法

初阶链表刷题注意&#xff01;&#xff01;&#xff01;学习的是解题的思维&#xff01; 找出链表的中间结点&#xff08;链接在末尾&#xff09; 解题思路 数组解法 由于链表不能通过下标访问对应的结点&#xff0c;所以我们将所有的结点存储在数组中&#xff0c;这样就可以通…

Vue中$nextTick实现源码解析

这篇文章主要为大家介绍了Vue中$nextTick实现源码解析&#xff0c;有需要的朋友可以借鉴参考下&#xff01; 先看一个简单的问题 {{ text }} 此时打印的结果是什么呢&#xff1f;是 old。如果想让它打印 new&#xff0c;使用 nextTick 稍加改造就可以 this.$nextTick(() >…

eBPF汇编指令你还不知道?看这一篇文就够了

【好文推荐】 一文看懂linux 内核网络中 RPS/RFS 原理 怎么在Windows下使用Makefile文件 浅析linux内核网络协议栈--linux bridge 大家好&#xff0c;我是你们的彦祖&#xff0c;今天这篇文主要介绍 eBPF 的指令系统&#xff0c;对于想深入理解 eBPF 的同学千万不要错过&#x…

WMS手动配货和自动配货的区别

手动配货 不知道配货流程的朋友可以看一下前面的文章链接: 深入浅出WMS之出库流程里面有对出库的解释说明&#xff0c;其中也有对配货的解释。前端页面也可以在前面的那篇文章中看到&#xff0c;这里我们来说一下后端部分。 查 手动配货是选中出库单的某条数据&#xff0c;然…

PyQt5基础练习1

0. 本文学习地址 1. PyQt5是由一系列Python模块组成 超过620个类&#xff0c;6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行。 1.1 PyQt5有两种证书 GPL商业证书 2. 实验1 实现简单的窗体 2.1 完整代码 #!/usr/bin/python3 # -*- coding: utf-8 -*…

零基础学习软件测试,掌握四点就够了

近年来越来越多的人转行到软件测试这一领域&#xff0c;对于很多外行的人来说&#xff0c;肯定对这一行业有很多不了解&#xff0c;对于这一职业的职责以及要求都会不清楚&#xff0c;那么我们今天就来梳理一下关于软件测试行业的信息。 一、软件测试的主要职责你知道吗&#x…

[附源码]计算机毕业设计学生疫情防控信息填报系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

16.前端笔记-CSS-学成在线案例

1、CSS属性书写顺序 &#xff08;1&#xff09;布局定位属性 display/position/float/clear/visibility/overflow(建议display第一个写&#xff0c;关系到模式) &#xff08;2&#xff09;自身属性 width/height/margin/padding/border/background &#xff08;3&#xff09;文…

[附源码]计算机毕业设计springboot项目管理系统的专家评审模块

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

“极致成本向左,本质安全向右”-谈谈锂电池储能系统的发展趋势

极致成本 or 本质安全? 1 快速增长的电化学储能电站 根据CNESA全球储能项目库的不完全统计,截至 2021 年底,全球已投运电力储能项目累计装机规模 209.4GW, 同比增长 9%。其中,抽水蓄能的累计装机规模占比首次低于 90%,比去年同期下降4.1个百分点;新型储能的累计装机规模…

30张图 讲清楚Redis Cluster

今天下午和一位同学聊Redis集群&#xff0c;这玩意真没那么简单&#xff0c;内容非常多。 Redis Cluster是Redis官方提供的Redis集群功能。 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展&#xff0c;用户数量增多&#xff0c;并发越来越多&#x…

【人工智能/算法】搜索求解(Solving Problems by Searching)

文章目录一、求解与搜索二、盲目式搜索1. 深度优先搜索&#xff08;Depth First Search, DFS&#xff09;回溯搜索&#xff08;Backtracking Search&#xff09;2. 广度优先搜索&#xff08;Breadth First Search, BFS&#xff09;一致代价搜索&#xff08;Uniform-cost Search…

BBR 数学模型直观展示

看 BBR 的理想图示&#xff1a; 但现实中数据包到达并非绝对均匀&#xff0c;考虑统计突发&#xff0c;实际情况如下&#xff1a; ​后文将 Delivery Rate 设为 B(Bandwidth)&#xff0c;将 RTT 设为 D(Delay)。 B/inflt 曲线一定上凸&#xff0c;可想象 1 个 inflt 只有一种…

北京一互联网公司被端,所有开发被全部带走!

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第 407 篇原创分享作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;近日&#xff0c;北京市朝阳公安分局对外公开&#xff0c;按照公安部“净网”专项行动整体部署&#xff0c;朝阳警方深入…

学习二十大奋进新征程线上知识答题活动回顾

学习二十大奋进新征程线上知识答题活动回顾 活动背景 开展直播宣讲、组织知识竞赛答题……各地通过多种形式广泛开展学习宣传活动&#xff0c;一起学。 为深入学习宣传贯彻二十大精神&#xff0c;近日&#xff0c;我市开展“奋进新征程&#xff0c;共创强国业”学习二十大精神…

Spring MVC统一异常处理的3种方式(附带实例)

在 Spring MVC 应用的开发中&#xff0c;不管是对底层数据库操作&#xff0c;还是业务层或控制层操作&#xff0c;都会不可避免地遇到各种可预知的、不可预知的异常需要处理。 如果每个过程都单独处理异常&#xff0c;那么系统的代码耦合度高&#xff0c;工作量大且不好统一&a…

SAS,Stata,HLM,R,SPSS和Mplus分层线性模型HLM分析学生受欢迎程度数据

全文链接&#xff1a;http://tecdat.cn/?p10809本文用于比较六个不同统计软件程序&#xff08;SAS&#xff0c;Stata&#xff0c;HLM&#xff0c;R&#xff0c;SPSS和Mplus&#xff09;的两级分层线性模型的过程和输出&#xff08;点击文末“阅读原文”获取完整代码数据&#…

2021.06青少年软件编程(Python)等级考试试卷(三级)

2021.06青少年软件编程(Python)等级考试试卷(三级) 一、单选题(共25题,每题2分,共50分) 1.关于open()函数的参数,下列描述正确的是?( D ) A. "w+" 以十六进制格式打开一个文件只用于写入 B. "r+"打开一个文件用于读写。文件指针将会放在文件…

视觉SLAM十四讲ch4笔记——李群与李代数

文章目录视觉SLAM十四讲ch4——李群与李代数4.1 李群李代数基础4.2 指数映射和对数映射4.2.1 so(3)↔SO(3)so(3) \leftrightarrow SO(3)so(3)↔SO(3)4.2.2 se(3)↔SE(3)se(3) \leftrightarrow SE(3)se(3)↔SE(3)4.2.3 小总结&#xff1a;so(3)↔SO(3)so(3) \leftrightarrow SO(…

slam学习 - 基本VO代码学习

本打算学习 orb -slam3 源码&#xff0c;但还是先把《slam 14》上的代码看完再说&#xff0c;至少把整个流程走一遍。 相关参考 https://blog.csdn.net/weixin_44684139/article/details/105305564 https://blog.csdn.net/qq_35590091/article/details/97111744 代码需求分析…