uniapp实现全局设置字体大小(小中大的字体切换)

 更新时间:2023年06月23日 11:08:53   作者:小佩丫  
随着UniApp的流行,越来越多的开发者选择使用它来构建跨平台应用程序,下面这篇文章主要给大家介绍了关于uniapp实现全局设置字体大小(小中大的字体切换)的相关资料,需要的朋友可以参考下

一、效果图

二、原理解析

要实现文字大小的动态切换,考虑到使用rem机制。只需要通过修改根节点的font-size值,就能改变文字呈现出来的大小

但是一般我们的项目始用的都是px或rpx单位,全局修改单位未免不现实。所以这里用到了postcss-px-to-viewport插件。

postcss-px-to-viewport可以帮助我们把项目的单位进行统一的转换,且不需要改动源代码。

所以思路为:

  1. 利用postcss-px-to-viewport把单位全部转换为rem
  2. 把根节点font-size值写入vuex中。
  3. 实现字体大小设置页面。修改大小后,要把值写入缓存和vuex。
  4. APP启动时,从缓存里读取上次设置的fontSize值,赋值给vuex_fontsize。
  5. 其他需要被控制大小的页面,顶部添加代码:
<page-meta :page-font-size="vuex_fontsize+'px'" :root-font-size="vuex_fontsize+'px'"></page-meta>

(说明:写进缓存是为了下次进入页面时还能保留上次设置的值,写进vuex中是为了可以响应式修改。)

三、代码实现

(一)、安装和配置postcss-px-to-viewport

1、安装命令:

npm install postcss-px-to-viewport --save-dev

2、根目录下创建一个 postcss.config.js文件,文件内容如下:

const path = require('path')
module.exports = {
  parser: 'postcss-comment',
  plugins: {
    'postcss-import': {
      resolve(id, basedir, importOptions) {
        if (id.startsWith('~@/')) {
          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3))
        } else if (id.startsWith('@/')) {
          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2))
        } else if (id.startsWith('/') && !id.startsWith('//')) {
          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1))
        }
        return id
      }
    },
    'autoprefixer': {
      overrideBrowserslist: ["Android >= 4", "ios >= 8"],
      remove: process.env.UNI_PLATFORM !== 'h5'
    },
    // 借助postcss-px-to-viewport插件,实现px转rem,文档:https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md
    // 以下配置,可以将px转换为rem,如果要调整比例,可以调整 viewportWidth 来实现
    'postcss-px-to-viewport': {
      unitToConvert: 'px', // 需要转换的单位。我这里是px,如果你的项目都是用的rpx,就改成rpx
      viewportWidth: 1800,// 密度,一般为750 || 375。这里可以自己修改
      unitPrecision: 5,
      propList: ['*'],
	  viewportUnit: "rem", // 指定需要转换成的视窗单位,默认vw
      fontViewportUnit: 'rem', // 字体需要转成的单位,只针对 font-size 属性
      selectorBlackList: [],
      minPixelValue: 1,
      mediaQuery: false,
      replace: true,
      exclude: undefined,
      include: undefined,
      landscape: false
    },
    '@dcloudio/vue-cli-plugin-uni/packages/postcss': {}
  }
}

(二)在vuex里定义vuex_fontsize

在你的store存储里添加变量,我设置的是

vuex_fontsize: 18.75	//数值根据自己项目调整

(三)实现字体设置页面

利用滑块,设置font-size的值。点击确定后,要把所设置的值写入vuex_fontsize和缓存里。

<template>
	<page-meta :page-font-size="fontValue+'px'" :root-font-size="fontValue+'px'"></page-meta>
	<view class="content">
		<view>
			<view class="fontchange">文字大小</view>
		</view>
		<view style="width:100%;padding: 0 10px;">
			<slider
				:min="16.25"
				:max="21.25"
				:value="fontValue"
				@change="sliderChange"
				:step="2.5"
			/>
			<view class="change-fontsize-box">
				<text style="font-size: 12px;">
					最小
				</text>
				<text style="font-size: 14px;">
					标准
				</text>
				<text style="font-size: 16px;">
					最大
				</text>
			</view>
		</view>
		<view style="padding: 20px 10px;width: 100%;">
			<u-button type="primary" @click="submit">确定</u-button>
		</view>
	</view>
</template>
<script>
export default {
	data() {
		return {
			fontValue: 18.75,
		};
	},
	onShow() {
		this.fontValue = this.vuex_fontsize;
	},
	methods: {
		sliderChange(e) {
			this.fontValue = e.detail.value;
		}
		submit() {
			this.$u.vuex('vuex_fontsize', this.fontValue);
			uni.setStorageSync("fontSize", this.vuex_fontsize);
			uni.showToast({
				title: '设置成功',
				icon:'none',
				duration: 1500
			});
		},
	},
};
</script>
<style>
.fontchange {
	font-size: 0.8rem;
	margin: 20px 0;
}
.content {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	width: 100%;
	padding: 5px;
	box-sizing: border-box;
}
.change-fontsize-box{
	margin: 10px 18px;
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
}
</style>

(四)App启动时,读取缓存值,赋值给vuex_fontsize

修改App.vue文件,添加以下代码

onLaunch: function() {
	//读取Storage里的字体大小
	let fontsize = uni.getStorageSync("fontSize")
	if (fontsize) {
		this.$u.vuex('vuex_fontsize',  fontsize);
	}
}

(五)其他页面引用

在需要用到的页面加上page-meta。如果是全局修改,就需要全部页面都加上这。

<template>
	<page-meta :page-font-size="vuex_fontsize+'px'" :root-font-size="vuex_fontsize+'px'"></page-meta>
	<view>
		...
	</view>
</template>

用开发者工具可以看到根节点html的font-size值可以被成功设置,且页面元素的单位都是rem。大功告成~

总结

到此这篇关于uniapp实现全局设置字体大小的文章就介绍到这了,更多相关uniapp全局设置字体大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jQuery和JavaScript节点插入元素的方法对比

    jQuery和JavaScript节点插入元素的方法对比

    本文主要介绍jQuery与JavaScript节点的插入方法,以及他们的具体代码实现方法,大家可以对比下他们之间的不同,希望对大家编写代码有所帮助
    2016-11-11
  • 基于Turn.js 实现翻书效果实例解析

    基于Turn.js 实现翻书效果实例解析

    最近项目经理我个项目练练手,其项目需求是要实现翻书效果,看到这个需求后,我真是懵了,这咋整,我可是java出身的啊,这个问题真是难住我了,后来有同事的指导,问题顺利解决,下面小编把学习心得分享,感兴趣的朋友可以参考下
    2016-06-06
  • JS控制文本框textarea输入字数限制的方法

    JS控制文本框textarea输入字数限制的方法

    JS控制文本框textarea输入字数限制的方法,需要的朋友可以参考一下
    2013-06-06
  • 浅谈Emergence.js 检测元素可见性的 js 插件

    浅谈Emergence.js 检测元素可见性的 js 插件

    这篇文章主要介绍了浅谈Emergence.js 检测元素可见性的 js 插件,详细的介绍了Emergence.js安装和使用方法,具有一定的参加性,有兴趣的可以了解一下
    2017-11-11
  • javascript中强制执行toString()具体实现

    javascript中强制执行toString()具体实现

    Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误,接下来为大家介绍下javascript如何强制执行toString(),感兴趣的朋友可以参考下哈
    2013-04-04
  • JCrop+ajaxUpload 图像切割上传的实例代码

    JCrop+ajaxUpload 图像切割上传的实例代码

    这篇文章主要介绍了JCrop+ajaxUpload 图像切割上传的实例代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作

    基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作

    这篇文章主要介绍了基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)

    js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)

    分别针对ie和火狐分别作了对xml文档和xml字符串的解析,考虑到了浏览器的兼容性,至于在ajax环境下解析xml,其实原理是一样的,只不过放在了ajax里,还是要对返回的xml进行解析,感兴趣的朋友可以了解下,或许对你学习js解析xml有所帮助
    2013-02-02
  • 小程序自定义导航栏兼容适配所有机型(附完整案例)

    小程序自定义导航栏兼容适配所有机型(附完整案例)

    这篇文章主要介绍了小程序自定义导航栏兼容适配所有机型(附完整案例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • JavaScript基础知识及常用方法总结

    JavaScript基础知识及常用方法总结

    JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的,通过本篇文章给大家介绍javascript基础知识及常用方法总结,对js基础知识及常用方法相关知识感兴趣的朋友一起学习吧
    2016-01-01

最新评论