vue3移动端适配的解决方案

news2024/11/15 16:00:53

文章目录

  • 前言
  • 一、使用插件
    • ① 纯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 false
                return 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=100px
      const responsivePX = () => {
        //获取页面的宽度
        let deviceWidth = document.documentElement.clientWidth;
        //如果页面大于750,即px端的页面,则把html的像素锁死在100px
        if (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.coloradmin.cn/o/57302.html

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

相关文章

Kotlin高仿微信-第57篇-VIP管理列表

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

[附源码]Python计算机毕业设计Django家庭整理服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

微服务绕不过的坎-服务雪崩

引言 书接上篇 微服务外交官-Feign &#xff0c;讲完了SpringCloud Alibaba 远程调用组件Feign之后&#xff0c;接下来讲微服务项目绕不开的问题&#xff1a;服务雪崩。 概念 微服务架构应用设计其目的之一是为了应对高并发环境&#xff0c;那问题来&#xff0c;高并发环境会…

[附源码]计算机毕业设计医院挂号住院管理系统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…

BBR 数学模型直观展示

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

HTML+CSS+JS网页设计期末课程大作业 DW个人博客网站制作 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

并发编程知识总结

并发编程知识总结 最近学习了&#xff1a;冰河《深入理解高并发编程》&#xff1b;《并发编程的艺术》&#xff1b; 特此简要对学习做了部分总结&#xff0c;方便后续对并发编程知识的完善和巩固&#xff1b; 若想深入了解学习&#xff0c;可阅读上述参考原著&#xff1b; 线…

基于蝙蝠优化算法的电力系统经济调度研究(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

刷题5-合并两个有序数组

刷题5-合并两个有序数组 解题思路&#xff1a; 把数组nums2的元素复制到数组nums1中&#xff0c;然后利用Java的Arrays.sort()数组排序&#xff0c;默认从小到大 核心代码&#xff1a; class Solution {public void merge(int[] nums1,int m,int[] nums2,int n){for(int i0…

Learning From Documents in the Wild to Improve Document Unwarping论文学习笔记

1 广告 论文2022年发表在SIGGRAPH顶会上。 预训练出来的模型有139M。 对文档的去扭曲变形效果在我们调研的深度学习模型里面算是最好的。 2 摘要 文档图像去扭曲是文档数字化和分析的重要内容。最先进的方法依靠纯合成数据来训练深度网络进行去扭曲。因此&#xff0c;经过训…

为 Go 开发配置Visual Studio Code

在本快速入门中&#xff0c;你将安装和配置 Go for Visual Studio Code 扩展。 在 2020 年 Go 开发人员调查结果中&#xff0c;41% 的受访者选择Visual Studio Code作为他们最喜欢的 Go 编辑器。 这使得Visual Studio Code成为 Go 开发人员最常用的编辑器。 Visual Studio Co…

中间代码生成(Intermediate Code Generation)

中间代码生成&#xff08;Intermediate Code Generation&#xff09;申明语句的翻译类型表达式申明式语句翻译简单赋值语句的翻译数组引用的翻译控制流语句的翻译控制流语句及其SDT布尔表达式及其SDT控制流语句翻译的例子布尔表达式和控制流表达式的回填switch语句的翻译过程调…

游戏开发32课 typescript super

super 在类的方法中super就表示当前类的父类。 如果在子类中写了构造函数&#xff0c;在子类构造函数中必须对父类的构造函数进行调用。 例子 (function() { // 父类 class Animal { name: string; constructor(name: string) { this.na…

25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器

我的知识星球 里有一个朋友提出了 SAP OData 服务 metadata 缓存方面的疑问,本文就来详细说一说: jerry,啥时候有时间给介绍一下fiori的Metadata数据系统的处理机制吧。我现在在做的一个项目,用rap开发的。rap开发的service binding,在maintain service注册时,开始注册的…

简单的个人博客网站设计 静态HTML个人博客主页 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页设计作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

TEE安全系统SMC深入理解

1、TEE背景在文章开始之前提几个问题&#xff1a;Android手机中至少运行着几个操作系统OS&#xff1f;如何进入安全操作系统&#xff1f;异常等级和安全操作系统之间的关系&#xff1f;SMC调用的实质、约定及流程是什么&#xff1f;随着智能手机的普及&#xff0c;手机上数据的…

R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据

原文链接:http://tecdat.cn/?p5919在本文中&#xff0c;我将介绍ARMA&#xff0c;ARIMA&#xff08;Box-Jenkins&#xff09;&#xff0c;SARIMA和ARIMAX模型如何用于预测时间序列数据&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。使用滞后算子计算滞后差分…

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

Android面试题——高级开发面试题二

一 面试题概述 回答自己理解的java虚拟机、gc机制Java多线程、线程池集合原理(hashmap,list)java虚引用封装、继承、多态的理解activity生命周期安卓activity和fragment数据传递Handler内存泄漏、内存溢出、内存抖动 原因及解决办法ANR原因以及解决办法性能优化、卡顿优化事件…

xshell与xftp

目录 1.什么是xshell 2.下载xshell与xftp 3.安装与操作xshell 4.什么是xftp 5.安装与操作xftp 6.xshell与xftp互联 1.什么是xshell Xshell是一个强大的安全终端模拟软件&#xff0c;它支持SSH1&#xff0c;SSH2&#xff0c; 以及Microsoft Windows平台的TELNET协议。. …