首页 > 其他分享 >Vue3(开发h5适配)

Vue3(开发h5适配)

时间:2023-11-10 16:06:22浏览次数:38  
标签:const 适配 px value h5 视口 Vue3 屏幕 size

在开发移动端的时候需要适配各种机型,有大的,有小的,我们需要一套代码,在不同的分辨率适应各种机型。

因此我们需要设置meta标签

<meta name="viewport" content="width=device-width, initial-scale=1.0">

移动设备具有各种不同的屏幕尺寸和分辨率,例如智能手机和平板电脑。为了提供更好的用户体验,网页需要根据设备的屏幕宽度进行自适应布局。如果不设置width=device-width,移动设备会按照默认的视口宽度(通常是较宽的桌面屏幕)来渲染网页,导致网页内容在移动设备上显示不正常,可能出现内容被截断或需要水平滚动的情况

然后我们实现一个经典的圣杯布局

圣杯布局:在CSS中,圣杯布局是指两边盒子宽度固定,中间盒子自适应的三栏布局,其中,中间栏放到文档流前面,保证先行渲染;

圣杯布局

<template>
  <div>
    <header>
      <div>left</div>
      <div>center</div>
      <div>right</div>
    </header>
  </div>
</template>
header {
  display: flex;
  justify-content: space-between;
 
  div {
    height: 50px;
    color: white;
    text-align: center;
    line-height: 50px;
  }

  div:nth-child(1) {
    width: 100px;
    background: red;
  }

  div:nth-child(2) {
    flex: 1;
    background: green;
  }

  div:nth-child(3) {
    width: 100px;
    background: blue;
  }
}

正常手机看着也还行

Vue3(开发h5适配)_前端

但是如果是小手机就会有问题 很挤

Vue3(开发h5适配)_html_02

自适应

发现px是相对单位固定的,无法进行自适应,不会随着屏幕尺寸的改变而改变。

rem 是根据html的font-size 进行缩放的,可以进行自适应,缺点就是需要计算每个屏幕大小所对应的font-size

vw vh是相对viewport 视口的单位,配合meta标签可以直接使用,无需计算

1vw=1/100视口宽度

1vh=1/100视口高度

当前屏幕视口是375像素,1vw就是3.75像素

现在知道了用什么单位,但是我们还要根据px去换算vw就很麻烦,能不能自动转换???

postCss

cn.vitejs.dev/config/shar…

发现vite已经内置了postCss

www.postcss.com.cn/

postCss 提供了 把Css 转换AST的能力,类似于Babel,为此我们可以编写一个插件用于将px转换为vw

npm init vue

构建一个vue项目

根目录新建一个plugins文件夹新建两个文件pxto-viewport.ts type.ts

然后在 tsconfig.node.json 的includes 配置 "plugins/**/*",

compilerOptions 配置 noImplicitAny:false

Vue3(开发h5适配)_自适应_03

pxto-viewport.js

import type { Options } from './type'
import type { Plugin } from 'postcss'
const defaultOptions = {
    viewPortWidth: 375,
    mediaQuery: false,
    unitToConvert:'px'
}
export const pxToViewport = (options: Options = defaultOptions): Plugin => {
    const opt = Object.assign({}, defaultOptions, options)
    return {
        postcssPlugin: 'postcss-px-to-viewport',
        //css节点都会经过这个钩子
        Declaration(node) {
            const value = node.value
            //匹配到px 转换成vw
            if (value.includes(opt.unitToConvert)) {
                const num = parseFloat(value)
                const transformValue = (num / opt.viewPortWidth) * 100
                node.value = `${transformValue.toFixed(2)}vw` //转换之后的值
            }    
        },
    }
}

type.ts

export interface Options {
    viewPortWidth?: number;
    mediaQuery?: boolean;
    unitToConvert?: string;
}

vite.config.ts 引入我们写好的插件

css:{
     postcss:{
         plugins:[
            pxToViewport()
         ]
     },
  },

Vue3(开发h5适配)_css_04

这样的话各种屏幕都差不多了。

额外的小知识

比如要增加一个 可以设置全局的字体大小 或者全局背景颜色切换应该怎么做呢?

  1. 安装vueUse
npm i  @vueuse/core
  1. 定义Css变量
:root {
  --size: 14px;
}
div {
    height: 50px;
    color: white;
    text-align: center;
    line-height: 50px;
    font-size: var(--size);
}
  1. 切换字体大小
<div>
      <button @click="change(36)">大</button>
      <button @click="change(24)">中</button>
      <button @click="change(14)">小</button>
    </div>
import { useCssVar } from '@vueuse/core'
const change = (str: number) => {
  const color = useCssVar('--size')
  color.value = `${str}px`
}

useCssVar 的底层原理就是

document.documentElement.style.getPropertyValue('--size') 读取就是get设置就是set 只要想切换的页面用这个css变量就可以了,如果想持久存储就用localstorage

Vue3(开发h5适配)_Vue.js_05

Vue3(开发h5适配)_css_06

标签:const,适配,px,value,h5,视口,Vue3,屏幕,size
From: https://blog.51cto.com/u_13463935/8303695

相关文章

  • 趣解适配器模式之《买了苹果笔记本的尴尬》
    〇、小故事小王考上了理想的大学,为了更好的迎接大学生活,他决定买一台苹果的笔记本电脑犒赏自己。电脑很快买好了,用起来也非常的流畅,但是,当他想要插U盘传资料的时候,尴尬的事情来了,这台电脑两侧的插口非常少,只有1个耳机插孔和2个雷电插孔,根本没有USB插口!这咋办呀?他赶快咨询了他的哥哥......
  • 个人UI组件库如何适配各种模块规范以及支持按需加载组件和发布包到包管理市场公网或者
    相关代码地址:https://github.com/13476075014/lcc-ui从指令上去看具体实现逻辑yarninitLibsJs用指令把所有组件都让入一个js文件对外暴露,作为umd规范的入口文件yarnbuild:umdjs用webpack输出上面文件,作为umd规范的yarninitEsmsJs用指令把所有组件都让入一个js文件......
  • Android如何远程ADB连接以及相关适配
    https://juejin.cn/post/7198041490626576442 前言  ADB全称为AndroidDebugBridge,译为安卓调试桥。是一个命令行工具,主要用于调试设备。详细大家对这个是耳熟能详了。关于ADB的安装、使用、命令等都不是本文的重点,大家有兴趣可先去网上搜索学习一番。那么回归到本文的......
  • H5封装和原生开发有什么差别
    原生开发和H5封装App是两种不同的应用开发方式,各有各的优缺点,在选择开发方式时,应考虑自身需求的来选择。我们该如何分别App是使用的哪种开发方式。这两者又有什么区别呢?原生开发是指为特定操作系统(如iOS或Android)开发应用程序。整个应用程序代码,逻辑和界面都是按照该系统提供的规......
  • Vue3 路由查询参数更新后,执行更新方法
    import{ref,defineComponent,watch,getCurrentInstance}from"vue";import{useRoute}from'vue-router';exportdefaultdefineComponent({setup(){consttable=ref({key:'spec_id',......
  • Vue - 创建 Vue3 项目
    Vue-创建Vue3项目 需搭建项目Vue3+ts+sass1. 创建项目npmcreatevite@latest  2. 安装依赖tyarn  3. 启动项目yarndev  4. 处理其他配置问题1) 打开HelloWorld.vue页面,发现一些报红,报错解决:找到tsconfig.json文件, ......
  • vue3 Suspense
    在Vue.js3中,Suspense是一个用于处理异步组件的特殊组件,它允许你在等待异步组件加载时展示备用内容。这对于优化用户体验、处理懒加载组件或异步数据获取时非常有用。Suspense的主要目标是简化异步操作的状态管理和展示。下面是一个简单的例子,演示了如何在Vue.js3中使用Suspe......
  • vue3 KeepAlive
    在Vue.js3中,<keep-alive>是一个抽象组件,用于保留其子组件状态,防止在切换组件时销毁它们。这对于在页面间切换时保留组件的状态或避免重复渲染特定组件非常有用。<keep-alive>主要用于缓存组件,以提高性能和用户体验。以下是一个简单的例子,演示了如何在Vue.js3中使用<keep-ali......
  • vue3 Teleport
    在Vue.js3中,Teleport是一种特殊的组件,用于在DOM树中的任何地方渲染其内容,而不受父组件的约束。这对于需要将组件的内容移动到DOM树的其他部分时非常有用,例如在模态框或弹出窗口中使用。Teleport提供了两个名为teleport和teleport-to的指令,用于定义内容的来源和目标位......
  • 评估APP网页小程序代码UI开发H5估价师怎么评估精确研发价格?
    大家好,我是咕噜签名分发可爱多。今天跟大家分享点不一样的。作为一名应用程序开发评估师,可能涉及到的主要任务是为特定的应用程序提供估算开发成本和所需时间预测。为了为一个应用程序更准确地评估价格。整理了以下方面。1、如何让一个App更好、更精确地评估出价格?以下是一个可能的......