uniapp中控制全局字体大小的方式

应用场景

在用uniapp开发项目的时候,不同的用户有时候对字体的大小有着不一样的需求,所以我们开发了一个功能,用于控制全局的字体大小。

开发环境

这个项目是依据dcloud官方提供的方式创建的项目
npx degit dcloudio/uni-preset-vue#vite uniapp-vite
下面简单列一下开发环境:
1.vite 4.3.5,这个vite的版本是dcloud适应的版本;
2.vue 3.3.11,这个vue的版本是dcloud适应的版本;
3.pinia 2.0.27,这个pinia的版本不能用最新的,否则会报错(uniapp依赖的vue版本与最新的pinia版本不兼容),也是踩了坑,选择了该版本

功能实现的依据

这个功能实现是基于多个方面,1.是pinia这个状态管理工具,2.是新的特性(动态css)3.是provide与inject。
效果图:
在这里插入图片描述

项目目录结构如下:
在这里插入图片描述

话不多说,我直接上代码
1.index.vue

<template>
  <view class="content">
    <image class="logo" src="/static/logo.png"></image>
    <view class="text-area">
      <text class="title">{{ title }}</text>
    </view>
    <mp-html :content="html"></mp-html>
    <view class="size-btn">
      <button @click="setFontSize('10rpx')">10</button>
      <button @click="setFontSize('50rpx')">50</button>
      <button @click="setFontSize('100rpx')">100</button>
      <button @click="setFontSize('150rpx')">150</button>
    </view>
    <p>字体大小选择</p>
  </view>
</template>

<script setup>
import {ref,inject,nextTick,watch} from 'vue'
const title = ref('hello uni!')
const html = ref('<div>Hello mp-html</html>')
const {fontSize,defineFontSizeSelf} = inject('globalConfig')


watch(fontSize,()=>{
  console.log('effect fontSize',fontSize.value)
})
const setFontSize = (size) => {
    defineFontSizeSelf(size)
}
</script>

<style lang="scss">
.content {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: v-bind(fontSize);
  .size-btn{
    display: flex;
  }
  .logo {
    height: 200rpx;
    width: 200rpx;
    margin: 200rpx auto 50rpx;
  }

  .text-area {
    display: flex;
    justify-content: center;
  }

  .title {
    color: #8f8f94;
  }
}


</style>

2.app.vue

<script setup>
import {onLaunch} from '@dcloudio/uni-app'
import {storeToRefs} from 'pinia'
import {provide} from 'vue'
import {useGlobalPinia} from '@/pinia/globalConfig/global.pinia'
const globalPinia = useGlobalPinia()
const {fontSize} = storeToRefs(globalPinia)
provide("globalConfig",{
  fontSize,
  defineFontSizeSelf:globalPinia.defineFontSizeSelf
})
// onLaunch(()=>{
//   console.log(import.meta.env)
//   console.log(fontSize.value)
// })
</script>

<style lang="scss">

</style>

3.global.pinia.js

import {defineStore} from "pinia";

export const useGlobalPinia = defineStore('global',{
    state(){
        return{
            fontSize:'100rpx'
        }
    },
    getters:{

    },
    actions:{
        defineFontSizeSelf(size){
            console.log(size)
            this.fontSize = size
        },
    },
})


上述代码看完,你也许发现了不便之处。就是想要改变字体大小非常的麻烦。你不仅每次都要通过inject获取store中的字体大小,还需要在css中通过v-bind将字体大小绑定过去。显得这个方式很鸡肋。可能还会影响到整个框架的性能。其实也不是没有想过其他的方式,但是失败了。本来想通过css的特性来解决问题

:root{
	--font-size: v-bind(fontSize)
}

某个页面中:
.class{
	font-size:var(--font-size)
}

这样的方式看上去是不是更加优雅?但是这个方式行不通,浏览器无法识别定义的参数,我失败了,然而我又很懒,不想去想其他的方式,就暂时先用状态管理器控制全局字体的方式去解决字体大小控制这个问题。如果你有不错的想法,可以留言,我有时间看看,偷窃一下各位大佬的智慧

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值