vue3.0项目中运用vant的以及移动端的适配

文章目录

    • 概要
    • 移动端的适配
    • vant的引入
    • 开发以及打包过程中遇到的问题

概要

在Vue-Vben-Admin项目中运用vant-ui实现部分页面支持手机端h5页面的预览

移动端的适配

  1. 适配的原理

    • 自适应 根据不同的设备的屏幕大小来自动调整尺寸,大小
    • 响应式 会随着屏幕的变动而自动调整,是一种更强的自适应
  2. 当前流行的几种适配方案

    • 百分比设置(不推荐)

      因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一
      所以百分比在移动端适配中使用是非常少的

    • rem单位+动态html的font-size
    • vw单位(推荐,项目中运用的此方案)
    • flex的弹性布局
  3. rem + 动态设置 font-size
    rem 单位是相对于 html 元素的 font-size 来设置的,通过在不同屏幕尺寸下,动态的修改 html 元素的 font-size 以此来达到适配效果

    屏幕尺寸html的font-size盒子的设置宽度盒子的最终宽度
    375px37.5px1rem37.5px
    320px32px1rem32px
    414px41.4px1rem41.4px
    • 1) px 与 rem 的单位换算

    根元素 html 的文字大小 = 视口宽度/分成的份数(一般为10份,方便计算)
    rem 值 = 元素的 px 值 / 根元素 html 的文字大小
    比如有一个在375px屏幕上,100px宽度和高度的盒子
    我们需要将100px转成对应的rem值
    100/37.5=2.6667,其他也是相同的方法计算即可

    • 2) less/scss函数
    .pxToRem(@px) {
      result: 1rem * (@px / 37.5);
    }
    
    .box {
      width: .pxToRem(100)[result];
      height: .pxToRem(100)[result];
      background-color: orange;
    }
    
    p {
      font-size: .pxToRem(14)[result];
    }
    
    • 3) postcss-pxtorem

      目前在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化
      npm install postcss-pxtorem

    • 4) VSCode插件
      -
      在这里插入图片描述

  4. 媒体查询
    通过媒体查询来设置不同尺寸屏幕下 html 的 font-size

    需要针对不同的屏幕编写大量的媒体查询
    如果动态改变尺寸,不会实时更新,只是一个个区间

    // 屏幕宽度最小320是的样式
    @media screen and (min-width: 320px) {
       html {
         font-size: 20px;
       }
    }
    // 屏幕宽度小于375px是的样式
    @media screen and (min-width: 375px) {
      html {
        font-size: 24px;
      }
    }
    // 屏幕宽度小于414px是的样式
    @media screen and (min-width: 414px) {
      html {
        font-size: 28px;
      }
    }
    // 屏幕宽度小于480px是的样式
    @media screen and (min-width: 480px) {
      html {
        font-size: 32px;
      }
    }
    
  5. 编写 js 代码
    通过监听屏幕尺寸的变化来动态修改 html 元素的 font-size 大小

    根据 html 的宽度计算出 font-size 的大小,并设置到 html 上
    监听页面尺寸的变化,实时修改 font-size 大小

    function setRemUnit() {
      // 获取所有的 html 元素
      const htmlEl = document.documentElement
      // 375 -> 16px
      // 320px -> 12px
      // 我们需要动态更改字体大小,因此需要获取网页的宽度
      // 拿到客户端宽度
      const htmlWidth = htmlEl.clientWidth
      // 将宽度分成10份
      const htmlFontSize = htmlWidth / 10
      console.log('htmlFontSize', htmlFontSize);
      // 将值给到html的font-size
      htmlEl.style.fontSize = htmlFontSize + 'px'
    }
    
    setRemUnit()
    // 给 window 添加监听事件
    window.addEventListener('resize', setRemUnit) 
    
  6. lib-flexible 库
    lib-flexible 是淘宝团队出品的一个移动端自适应解决方案,通过动态计算 viewport 设置 font-size 实现不同屏幕宽度下的 UI 自适应缩放。

    (function flexible (window, document) {
      var docEl = document.documentElement
      var dpr = window.devicePixelRatio || 1
    
      // adjust body font size
      function setBodyFontSize () {
        if (document.body) {
          document.body.style.fontSize = (12 * dpr) + 'px'
        }
        else {
          document.addEventListener('DOMContentLoaded', setBodyFontSize)
        }
      }
      setBodyFontSize();
    
      // set 1rem = viewWidth / 10
      function setRemUnit () {
        var rem = docEl.clientWidth / 10
        docEl.style.fontSize = rem + 'px'
      }
    
      setRemUnit()
    
      // reset rem unit on page resize
      window.addEventListener('resize', setRemUnit)
      window.addEventListener('pageshow', function (e) {
        if (e.persisted) {
          setRemUnit()
        }
      })
    
      // detect 0.5px supports
      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)) 
    
  7. vw 适配方案
    100vw 相当于整个视口的宽度 innerWidth,1vw 相当于视口宽度的 1%,将 px 转换为 vw 即可完成适配,其实上面的 rem 就是模仿 vw 方案

vw相比于rem的优势:
不需要去计算 html 的 font-size 大小,也不需要去给 html 设置 font-size
不会因为设置 html 的 font-size 大小,而必须再给 body 设置一个 font-size 防止继承
因为不依赖 font-size 的尺寸,所以不用担心某些原因的 html 的 font-size 尺寸被篡改,导致页面尺寸混乱
vw 更加语义话,1vw 相当于 1/100 viewport 的大小
rem 事实上作为一种过渡的方案,它利用的也是 vw 的思想

  1. px 与 vw 的单位转换

    • 手动换算
      比如屏幕尺寸为 375px,元素大小为 150px,我们需要将 150px 转换成对应的 vw 值:150 / 3.75=40
    • less/scss 函数
    @vwUnit: 3.75;
    .pxToVw(@px) {
      result: (@px / @vw) * 1vw
    }
    .box {
      width: .pxToVw(100)[result];
      height: .pxToVw(100)[result];
    } 
    
    • postcss-px-to-viewport-8-plugin
      1:和rem一样,在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化
      2: npm install postcss-px-to-viewport-8-plugin
    • vs Code 插件
      px to vw 插件,在编写时自动转化:
      在这里插入图片描述
  2. postcss-px-to-viewport的优缺点

    • 优点:
    1. 实现简单:只需要通过安装插件和配置即可快速实现 px 转换为 vw 或 vh 单位。
    2. 提高开发效率:使用自适应布局,可以减少对不同屏幕尺寸的适配工作,提高开发效率。
    3. 适配性强:可以自适应不同设备和屏幕尺寸,适配性强,可以适应各种移动端设备的屏幕尺寸。
    • 缺点:
    1. 不适用于字体大小:由于 vw 和 vh 单位不适用于字体大小,因此需要单独设置字体大小的转换方式。 兼容性问题:一些老版本的浏览器不支持
    2. vw 和 vh 单位,需要使用兼容性处理或回退方案。 无法把行内样式中的 px 转换成视口单位(vw, vh, vmin, vmax)
    3. 无法精确 控制样式:由于浏览器的视口宽度和高度不同,转换后的样式可能会有一定的误差,无法精确控制样式

vant的引入

# Vue 3 项目,安装最新版 Vant
npm i vant

# Vue 2 项目,安装 Vant 2
npm i vant@latest-v2
  • 配置支持适配 build\vite\plugin\imagemin.ts文件配置
import { createStyleImportPlugin, VantResolve } from 'vite-plugin-style-import';
  const styleImportPlugin = createStyleImportPlugin({
      {
        libraryName: 'vant',
        esModule: true,
        resolveStyle: (name) => {
          if (name == 'show-toast') {
            return `../es/toast/style/index`; //修改vant show-toast引入路径
          } else if (name == 'show-confirm-dialog') {
            return `../es/dialog/style/index`; //修改vant show-toast引入路径
          } else {
            return `../es/${name}/style`; //修改vant引入路径
          }
        },
      },
    ],
    resolves: [VantResolve()],
  });
  • 配置支持适配 build\vite\plugin\imagemin.ts文件配置
import pxtovw from 'postcss-px-to-viewport';

const loader_pxtovw = pxtovw({
  unitToConvert: 'px', // 要转化的单位
  viewportWidth: 750, // UI设计稿的宽度
  unitPrecision: 6, // 转换后的精度,即小数点位数
  propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
  viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
  fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
  selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
  minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
  mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
  replace: true, // 是否转换后直接更换属性值
  exclude: [
    /node_modules/,
    /sys/,
    /layouts/,
    /Application/,
    /approvalProcess/,
    /Authority/,
    /AvatarPreview/,
    /Basic/,
    /Button/,
    /CardList/,
    /ClickOutSide/,
    /CodeEditor/,
    /Container/,
    /ContextMenu/,
    /CountDown/,
    /CountTo/,
    /Cropper/,
    /CustomerModal/,
    /CustomRecorder/,
    /CustomTinymce/,
    /Drawer/,
    /Dropdown/,
    /Excel/,
    /FlowChart/,
    /Form/,
    /Icon/,
    /JVxeTable/,
    /Loading/,
    /Markdown/,
    /Menu/,
    /Modal/,
    /Page/,
    /Poi/,
    /Preview/,
    /Qrcode/,
    /Scrollbar/,
    /Signature/,
    /SimpleMenu/,
    /StrengthMeter/,
    /Table/,
    /Time/,
    /Tinymce/,
    /Transition/,
    /Tree/,
    /Upload/,
    /Verify/,
    /VirtualScroll/,
    /VxeTable/,
    /Verify/,
    /design/,
    /directives/,
    /enums/,
    /hooks/,
    /basic/,
    /business/,
    /dashboard/,
    /demo/,
    /devOperation/,
    /ecommerce/,
    /form-design/,
    /lamp/,
    /medical/,
    /medical-Group/,
    /medical-Shop/,
    /shop/,
    /supplyChain/,
    /index.html/,
  ], // 设置忽略文件,用正则做目录名匹配
  include: [/vant/, /pda/], // 如果设置了include,那将只有匹配到的文件才会被转换
  landscape: false, // 是否处理横屏情况
});
css: {
    postcss: {
      plugins: [loader_pxtovw],
    },
    preprocessorOptions: {
      less: {
        modifyVars: generateModifyVars(),
        javascriptEnabled: true,
      },
    },
  },

由于是web端ui组件和vantUI组件兼容所有设置的 exclude和include

开发以及打包过程中遇到的问题

打包报如下图展示
解决方法:

 if (name == 'show-toast') {
   return `../es/toast/style/index`; //修改vant show-toast引入路径
 } else if (name == 'show-confirm-dialog') {
    return `../es/dialog/style/index`; //修改vant show-toast引入路径
  } else {
    return `../es/${name}/style`; //修改vant引入路径
  }

引入样式报错

import 'vant/lib/index.css';

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[实验]Keil 4下仿真三星2440A芯片的汇编及CPIO控制实验

一、安装Keil uVision4 (详细安装过程忽略) 点击finish完成安装 二、新建项目,导入项目文件 选择对应的芯片,此处我们选择三星的S3C2440A,点击OK 在Source Group 1处右键,点击Add Files to "Sourcce Group 1’…将下图…

每日一题(PTAL2-022 ):重排链表--排坑

它的测试数据有可能有分裂节点&#xff0c;所以需要计算实际所给链表的长度 #include<bits/stdc.h> using namespace std; struct Node{int val;int next; }x[100005]; int main(){int j0;int start;int n;int ad1,num,ad2;cin>>start>>n;for(int i0;i<n…

从 MySQL 到 ClickHouse 实时数据同步 —— Debezium + Kafka 表引擎

目录 一、总体架构 二、安装配置 MySQL 主从复制 三、安装配置 ClickHouse 集群 四、安装 JDK 五、安装配置 Zookeeper 集群 六、安装配置 Kafaka 集群 七、安装配置 Debezium-Connector-MySQL 插件 1. 创建插件目录 2. 解压文件到插件目录 3. 配置 Kafka Connector …

【机器学习-18】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域&#xff0c;特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂&#xff0c;特征的数量往往也随之激增。然而&#xff0c;并非所有的特征都对模型的性能提升有所贡献&#xff0c;有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

SpringBoot Aop使用篇

Getting Started SpringBoot AOP的实践 AOP相关的概念&#xff1a; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类&#xff0c;比如日志、权限…

《苍穹外卖》Day08部分知识点记录

一、useGeneratedKeys和keyProperty useGeneratedKeys和keyProperty是<insert>标签中的两个属性&#xff0c;用于处理自动生成的主键值。 1. useGeneratedKeys userGeneratedKeys"true"表示启用自动生成主键功能&#xff1b;当useGeneratedKeys设置为true时…

VScode使用cmake编译

一&#xff1a;输入 ctrlshiftp打开用于命令执行的输入框 二&#xff1a;输入cmake&#xff0c;选择quick start 模式 三&#xff1a;选择版本最高的gcc版本 四&#xff1a;输入项目名称 选择C 五&#xff1a;选择executable 这样便创建好了最简单的cmake例程&#xff0c;一个…

同态加密原理解析

目录 1.数学介绍2.使用多项式环进行加密2.1 私钥和公钥的产生2.2 加密2.3 解密 3.同态计算3.1 同态加法3.2 同态乘法 1.数学介绍 同态加密方案基于一个难以计算的问题Ring Learning with Errorsred。这些方案中的数据在加密和未加密时都用多项式表示。 这里举一个简单的多项式…

AWTK MODBUS Client channel 模型

名称&#xff1a;modbus_client_channel 功能&#xff1a;通过 modbus 协议访问远程 slave 设备上的数据&#xff0c;需要配合 modbus_client模型一起使用。用于将 modbus client 中的 channel 包装成view_model或者view_model_array 一般来说不需要&#xff0c;直接使用modbus…

docker常用基本命令

把jar包和 dockerfile文件放到同一目录下#构建Docker镜像 注意后面的 . 不能省略 docker build -t your-image-name .#运行并创建一个容器 docker run -d -p 8080:8080 --name container_name your-image-name# 停止容器 767fce4cb990 容器ID (容器名也可以) docker stop 767f…

柱形图“变个装”,跟上时尚步伐!

前言 职场中&#xff0c;日报、周报、月报、年度总结&#xff0c;都离不开图表的制作&#xff0c;而柱状图又是最常用的一种&#xff0c;怎样的柱状图&#xff0c;才能让领导更容易阅读&#xff0c;甚至是眼前一亮呢&#xff1f;今天小编就将为大家介绍一下如何借助葡萄城公司…

4月26日 阶段性学习汇报

1.毕业设计与毕业论文 毕业设计已经弄完&#xff0c;加入了KNN算法&#xff0c;实现了基于四种常见病的判断&#xff0c;毕业论文写完&#xff0c;格式还需要调整&#xff0c;下周一发给指导老师初稿。目前在弄答辩ppt&#xff08;25%&#xff09;。25号26号两天都在参加校运会…

六西格玛管理培训并未过气:深挖其现代价值与应用

在众多管理培训中&#xff0c;六西格玛管理培训因其卓越的成效和广泛的适用性而备受推崇。尽管有人认为六西格玛管理培训已经过时&#xff0c;但实际上&#xff0c;它在现代企业中仍具有不可忽视的价值和应用。深圳天行健六西格玛培训公司解析如下&#xff1a; 一、六西格玛管理…

1Panel - 现代化、开源的 Linux 服务器运维管理面板

产品介绍 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 1Panel的官方网站&#xff1a;https://1panel.cn 1Panel的GitHub仓库&#xff1a;https://github.com/1Panel-dev/1Panel 体验环境&#xff1a;https://demo.1panel.cn 1Panel 特点 开源特性 Star 数…

详细解析什么是期权交易的获利方法

期权交易的获利方法 在期权交易之前进行充分的准备工作和风险评估是至关重要的。其中行情结构、策略方法、预期收益和风险评估&#xff0c;是期权交易成功的关键要素。它们能帮助我们更好地制定交易计划&#xff0c;控制风险&#xff0c;并追求稳定的利润。以下是对这四点的详…

比较好的平民衣服品牌有哪些?平价质量好短袖品牌推荐

随着气候变暖&#xff0c;夏天的持续时间似乎越来越长&#xff0c;短袖作为夏季的必备服装&#xff0c;受到了广大男士的青睐。然而&#xff0c;面对市场上众多的短袖品牌和不同的质量&#xff0c;大家都觉得选短袖的时候实在难以找到质量好且合适自己的。 选择合适的短袖确实…

SimCal(ECCV2020)

文章目录 AbstractMethodUsing Existing Long-tail Classification ApproachesLoss Re-weightingFocal Loss略 Proposed SimCal:Calibrating the ClassifierDual Head Inference Experiment创新 原文 代码 Abstract 本文主要研究了长尾分布下的实例分割问题&#xff0c;并提出…

Open CASCADE学习|一个点的坐标变换

gp_Trsf 类是 Open CASCADE Technology (OCCT) 软件库中的一个核心类&#xff0c;用于表示和操作三维空间中的变换。以下是该类的一些关键成员和方法的介绍&#xff1a; 成员变量&#xff1a; scale: Standard_Real 类型&#xff0c;表示变换的缩放因子。 shape: gp_TrsfFor…

网络安全之防范钓鱼邮件

随着互联网的快速发展&#xff0c;新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势&#xff0c;利用网络钓鱼进行欺骗的行为越来越猖獗&#xff0c;对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件&#xff0c;而邮件标题和内容&#xff0c;…

用于肺结节分类的常规 EHR 的纵向多模态Transformer集成成像和潜在临床特征

Longitudinal Multimodal Transformer Integrating Imaging and Latent Clinical Signatures from Routine EHRs for Pulmonary Nodule Classification 摘要 该研究提出了一种基于Transformer 的多模态策略&#xff0c;用于将重复成像与常规电子健康记录&#xff08;EHRs&…