Vue3——网页自适应以及全局切换样式和字体大小

网页自适应以及全局切换样式和字体大小

一、html的meta头

在这里插入图片描述

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

二、编写postcss插件,将px和gh转化为vw和vh

创建一个ts文件
在这里插入图片描述


// vite内置了postcss,不需要安装postcss
import { Plugin } from "postcss";

enum customerUnit {
    vw = 'px',
    vh = 'gh'
}

const Options = {
    viewportWidth: 390, // UI设计图默认的宽度,默认一般只需要适配宽度即可,高度的话可以展示滚动条,但是有的页面可能设计为高度不能有滚动条的话,就需要转化了
    viewportHeight: 844, // UI设计图的默认高度
}

interface Options {
    viewportWidth?: number,
    viewportHeight?: number,
}

export const PostcssPxToViewPort = (options: Options = Options): Plugin => {
    return {
        postcssPlugin: 'postcss-px-to-viewport',
        // 钩子函数
        Declaration(node) {
            // 在node.value中,就能获取到对应的css的值,所以这里,我们就可以将所有的自定义例如gw、gh转化为vw、vh
            // 用自定义的值的好处:如果有些地方需要固定高度,那么直接使用px就可以,需要转化为指定高度的就用我们自定义的单位
            if (node.value.indexOf(customerUnit.vw) > -1) {
                // 计算vw
                const vwValue = (parseFloat(node.value) / options.viewportWidth * 100).toFixed(2)
                node.value = vwValue + 'vw'
            }
            if (node.value.indexOf(customerUnit.vh) > -1) {
                // 计算vh
                const vhValue = (parseFloat(node.value) / options.viewportHeight * 100).toFixed(2)
                node.value = vhValue + 'vh'
            }
        }
    }
}

配置tsconfig.node.json,在includes里面添加我们的plugins

{
  "compilerOptions": {
    "composite": true,
    "skipLibCheck": true,
    "module": "ESNext",
    "moduleResolution": "bundler",
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": false,
  },
  "include": [
    "vite.config.ts",
    "src/plugins/**/*"
  ]
}

配置vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { PostcssPxToViewPort } from './src/plugins/postcss-px-to-viewport'
import UnoCSS from 'unocss/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    UnoCSS({
      rules: [
        [/^m-(\d+)$/, ([, d]) => ({ margin: `${ parseFloat(d) }px` })],
        [/^p-(\d+)$/, ([, d]) => ({ padding: `${ parseFloat(d) }px` })],
      ]
    })
  ],
  css: {
    postcss: {
      plugins: [PostcssPxToViewPort({ viewportWidth: 1920, viewportHeight: 825 })]
    }
  }
})

三、vueuse的使用

官方文档:vueuse官方文档

# 安装
npm i @vueuse/core -S

使用vueuse,修改css变量,以达到修改全局字体大小的功能

<template>
  <header class="m-36" ref="header">
    <div class="left">left</div>
    <div class="center">center</div>
    <div class="right">right</div>
  </header>

  <section>
    <button @click="changeFontSize(36)"></button>
    <button @click="changeFontSize(24)"></button>
    <button @click="changeFontSize(14)"></button>
  </section>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { useCssVar } from '@vueuse/core'
const fontSizeKey = ref("--font-size")
const fontSizeValue = useCssVar(fontSizeKey)
console.log(fontSizeValue.value)
const changeFontSize = (value: number) => {
  fontSizeValue.value = value + 'px'
}
</script>

<style lang="scss">
// 在html上挂载一个css样式变量,其他所有页面都可以使用这个变量
:root {
  --font-size: 14px
}

html,
body,
#app {
  padding: 0;
  margin: 0;
  height: 100%;
  width: 100%;
  font-size: var(--font-size);
}
</style>

四、unocss使用

# 安装unocss
npm install -D unocss

# 在vite中配置unocss

vite.config.ts配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { PostcssPxToViewPort } from './src/plugins/postcss-px-to-viewport'
import UnoCSS from 'unocss/vite'
import {
  presetAttributify,
  presetIcons,
  presetUno,
} from 'unocss'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    UnoCSS({
      rules: [
        [/^m-(\d+)$/, ([, d]) => ({ margin: `${ parseFloat(d) }px` })],
        [/^p-(\d+)$/, ([, d]) => ({ padding: `${ parseFloat(d) }px` })],
      ],
      presets: [
        // 集成了一些工具类,例如tailwindcss等,具体可以去官网查看
        presetUno(),
        // 可以直接在div上写属性
        presetAttributify(),
        // unocss图标
        presetIcons(),
      ]
    })
  ],
  css: {
    postcss: {
      plugins: [PostcssPxToViewPort({ viewportWidth: 1920, viewportHeight: 825 })]
    }
  }
})

main.ts中引入uno.css

import { createApp } from 'vue'
import App from './App.vue'
import 'uno.css'
createApp(App).mount('#app')

### Vue3 中使用 `calc()` 实现字体大小自适应 为了实现在不同屏幕尺寸下的字体大小自适应,`calc()` 是一种非常有效的方式。通过结合视窗单位(如 vw 或 vh),可以根据浏览器窗口的宽度或高度动态调整字体大小。 #### 利用 `vw` `vh` 在 CSS 中定义基础字体大小时,可以采用视窗单位来代替固定的像素值: ```css html { font-size: calc(1rem + 0.5vw); } ``` 上述代码表示 HTML 的根元素字体大小会基于默认的 rem 值加上相对于当前视口宽度的比例[^2]。 #### 结合媒体查询优化体验 虽然单独依靠 `calc()` 可以创建响应式的字体缩放方案,但在某些情况下可能需要更精细控制,在特定断点处固定最小最大字体限制: ```css @media (min-width: 768px) and (max-width: 1024px){ html{ font-size: calc(1rem + 0.3vw); } } @media (min-width: 1025px){ html{ font-size: calc(1rem + 0.5vw); } } ``` 这段样式确保了即使是在较大的屏幕上也不会让文字变得过大影响阅读舒适度;而在较小设备上则保持足够的可读性。 #### 应用于组件内部 对于单文件组件来说,可以在 scoped 样式内应用相同的逻辑给具体标签设置相对父级容器比例变化的文字尺寸: ```vue <template> <div class="text-container"> <h1>标题</h1> <p>段落内容...</p> </div> </template> <style scoped lang="scss"> .text-container h1 { font-size: calc(2em + 1vw); } .text-container p { line-height: 1.5; font-size: calc(1em + 0.5vw); } </style> ``` 此方式使得每个部分都能独立地根据其上下文环境做出适当调整,而不会相互干扰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值