【前端开发】老年模式:字体大小设置

  1. 导入插件:npm install postcss-px-to-viewport--save-dev

postcss-px-to-viewport:将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件

  1. 在根目录下新建文件: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插件,实现rpx转rem,文档:https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md
// 以下配置,可以将rpx转换为rem,如果要调整比例,可以调整 viewportWidth 来实现
“postcss-px-to-viewport”: {
unitToConvert: “px”, // 需要转换的单位,默认px
viewportWidth: 750, // 密度,一般为750 || 375
unitPrecision: 5, // 单位转换后保留的精度
propList: [“font-size”], //要转换的属性,*号代表所有rpx的属性
viewportUnit: “rem”, // 指定需要转换成的视窗单位,默认vw
fontViewportUnit: “rem”, // 字体需要转成的单位,只针对 font-size 属性
selectorBlackList: [], // 需要忽略的CSS选择器
minPixelValue: 1, // 最小的转换数值,如果为1的话,只有大于1的值会被转换
mediaQuery: false, // 媒体查询里的单位是否需要转换单位
replace: true, // 是否直接更换属性值,而不添加备用属性
exclude: [], // 忽略某些文件夹下的文件或特定文件
include: undefined, // 如果设置了include,那将只有匹配到的文件才会被转换,例如只转换 ‘src/mobile’ 下的文件 (include: //src/mobile//)
landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
landscapeUnit: “vw”, // 横屏时使用的单位
},
“@dcloudio/vue-cli-plugin-uni/packages/postcss”: {},
},
};

  1. 封装全局变量:store.js
  • 默认基准字体大小为 50px
  • 先封装好“全局缓存变量”函数方法:
    export function setFontScale(fontScale) {
    return uni.setStorageSync($FontScaleKey, fontScale);
    }
import { createStore } from "vuex";import login from "@/store/modules/login";
import schoolService from "@/store/modules/schoolService";
import attendance from "@/store/modules/attendance";
import { setFontScale } from "../common/auth";const store = createStore({state: {// 默认基准字体大小(px)$baseFontSize: 50,//文字缩放倍数$fontScale: 1,},getters: {//获取基准字体大小getBaseFontSize: (state) => {return state.$baseFontSize;},//获得字体缩放倍数getFontScale: (state) => {return state.$fontScale;},//获取缩放字体大小getScaleFontSize: (state) => {return state.$fontScale * $baseFontSize;},},mutations: {SET_FONT_SCALE: (state, scale) => {state.$fontScale = scale;setFontScale(scale);},},modules: {login,schoolService,attendance,},
});export default store;
  1. 封装页面组件:settingFontSize.vue

应用技术:Uniapp + Vue3 + Sass

<template><page-meta :root-font-size="`${baseFontSize}px`"></page-meta><view id="font-scale"><view class="text-container" style="font-size:30rpx">拖动滑块以设置字体大小</view><view class="slider-label-container"><view class="label-text label-standard">标准</view><view class="label-text label-medium">中等</view><view class="label-text label-larger">较大</view><view class="label-text label-outsize">特大</view></view><view class="slider-container"><slider min="1.0" max="1.75" :value="data.fontScale" @change="sliderChange" show-value step="0.25" /></view><view class="text-container label-standard">标准字体大小:</view><view class="text-container label-standard">人生就像大海中的一叶扁舟,漂浮不定,当你发现自己逆风而行的时候,不要埋怨上天不公,而要偏转一下你的航向,逆风就会成为顺风。因为生活的起点并不是那么重要,重要的是最后你抵达了哪里。</view><view class="text-container" :style="{ fontSize: `${32 * data.fontScale}rpx` }">预览字体大小:</view><view class="text-container preview-text" :style="{ fontSize: `${32 * data.fontScale}rpx` }">人生就像大海中的一叶扁舟,漂浮不定,当你发现自己逆风而行的时候,不要埋怨上天不公,而要偏转一下你的航向,逆风就会成为顺风。因为生活的起点并不是那么重要,重要的是最后你抵达了哪里。</view><view class="btn-container" @click="onBtnFinishedClicked()"><view class="btn-confirm label-medium" hover-class="btn-press" hover-stay-time="250">完成</view></view></view>
</template>
<script setup>
import { ref, onMounted, getCurrentInstance, computed } from 'vue'
import { onLoad } from '@dcloudio/uni-app';
import { useStore } from 'vuex'
import { getFontScale } from '../../common/auth';const { proxy } = getCurrentInstance()
const store = useStore()const data = ref({baseFontSize: 0,fontScale: 1.0,
});const baseFontSize = computed(() => {const scale = getFontScale() || 1.0;return scale * data.value.baseFontSize;
});const sliderChange = (e) => {data.value.fontScale = e.detail.value;
}
const onBtnFinishedClicked = () => {//如果修改了字体大小,则需要重新加载所有页面(因为已经加载的页面字体大小不会修改)proxy.$modal.confirm("确定修改字体大小?").then(res => {if (res) {store.commit('SET_FONT_SCALE', data.value.fontScale);// 使用uni.reLaunch跳转到某个页面,并关闭所有页面proxy.$tab.reLaunch("/pages/mine/personalCenter");}})
}onLoad((options) => {// data.value.fontScale = store.getters.getFontScale;data.value.baseFontSize = store.getters.getBaseFontSize;data.value.fontScale = getFontScale()if (!data.value.fontScale) {data.value.fontScale = 1.0;}
})</script>
<style lang="scss" scoped>
#font-scale {width: 100%;height: 100%;box-sizing: border-box;background-color: $color-background;padding-top: 24rpx;.slider-label-container {display: flex;box-sizing: border-box;align-items: center;padding: 16rpx 32rpx 0;.label-text {display: flex;align-items: center;flex: 1;}}.slider-container {padding: 0 32rpx 24rpx;}.text-container {padding: 12rpx 32rpx;}.btn-container {width: 100%;padding: 24rpx 32rpx 32rpx;box-sizing: border-box;.btn-confirm {width: 100%;height: 0.8rem;display: block;border-radius: 0.2rem;background: #0091ff;color: #fff;font-size: 0.38rem;text-align: center;line-height: 0.8rem;}}.label-standard {font-size: 32rpx;}.label-medium {font-size: 36rpx;}.label-larger {font-size: 40rpx;}.label-outsize {font-size: 45rpx;}
}
</style>
  1. 项目入口文件加载:App.vue
<script>
import config from '@/common/config'
import { getFontScale } from './common/auth';
export default {onLaunch: function () {this.initApp()},methods: {// 初始化应用initApp() {// 初始化应用配置this.initConfig()// 初始化全局字体大小this.initFontSize()// 检查用户登录状态this.checkLogin()},initFontSize() {let fontsize = getFontScale() || 1.0console.log(fontsize);if (fontsize) {this.$store.commit('SET_FONT_SCALE', fontsize);}},initConfig() {this.globalData.config = config},checkLogin() {}},
}
</script>
  1. 在需要配置的组件页面中添加: < page-meta >
<template><page-meta :root-font-size="`${baseFontSize}px`"></page-meta><view class="wrapper"></view>
</template>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s集成skywalking

如果能科学上网的话&#xff0c;安装应该不难&#xff0c;如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容&#xff0c;对于目前大部分采用微服务架构的公司来说&#xff0c;分布式链路追踪都是必备的&#xff0c;无论它是传统微服务体系亦或是新一代…

Card组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了DataTable的排序功能相关的内容,本章回中将介绍Card Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的Card Widget是一种容器类组件,它可以包含其它的组件,它的大小随着被包含…

【人工智能】Python与强化学习:从零实现多臂老虎机(Multi-Armed Bandit)问题

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 强化学习是一种模仿生物行为的学习方法,在不确定环境中寻找最优策略。多臂老虎机(Multi-Armed Bandit, MAB)是强化学习的经典问题之一,模拟了在多个选择中如何平衡探索和利用,以获取最大的长期回报。…

Ubuntu WiFi检测

ubuntu检测到多个同名wifi&#xff0c;怎么鉴别假冒的wifi&#xff1f; 在Ubuntu中&#xff0c;如果检测到多个同名的Wi-Fi网络&#xff0c;可能存在假冒的Wi-Fi&#xff08;例如“蜜罐”攻击&#xff09;。以下是一些鉴别假冒Wi-Fi的方法&#xff1a; 检查信号强度&#xff1a…

【论文格式】同步更新中

1横向和纵向坐标的坐标密度不能太大&#xff0c;显示太多看起来不好看&#xff0c;本课题组采用emf&#xff0c;目前使用页面内紧凑&#xff0c;600dpi 2Force(kN):k小写 3涉及到变量的&#xff0c;变量本身斜体

cesium中的CallbackProperty

Cesium中的CallbackProperty函数解析 在Cesium中&#xff0c;CallbackProperty是一个非常有用的特性&#xff0c;它允许开发者动态更新实体&#xff08;Entity&#xff09;的属性&#xff0c;例如位置、方向、高度等。这种动态更新的能力使得Cesium在处理与时间相关的数据时变…

win10 docker启动报错virtual machine platform not enabled

Docker启动报错virtual machine platform not enabled。原因是windows未启动虚拟化平台。 跟着下面的操作基本都能解决问题。 1.打开控制面板 2.在启用或关闭windows功能中开启Hyper-V和虚拟机平台 这个虚拟机平台也一定要勾选&#xff0c;我看晚上很多帖子是没说需要勾选这个…

【jvm】C1编译器和C2编译器的区别

目录 1. 说明2. 主要特点2.1 C1编译器2.2 C2编译器 3. 编译过程与优化策略3.1 C1编译器3.3 C2编译器 4. 分层编译与协作机制5. 性能影响与选择 1. 说明 1.JVM&#xff08;Java虚拟机&#xff09;中的C1编译器和C2编译器是两种不同的即时编译器&#xff08;JIT Compiler&#x…

【人工智能】使用Python实现序列到序列(Seq2Seq)模型进行机器翻译

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Sequence-to-Sequence, Seq2Seq)模型是解决序列输入到序列输出任务的核心架构,广泛应用于机器翻译、文本摘要和问答系统等自然语言处理任务中。本篇文章深入介绍 Seq2Seq 模型的原理及其核心组件(…

【弓箭傳說 2 角色遊戲攻略】—詳細指南

《弓箭傳說2》是一款經典的Roguelike風格手遊&#xff0c;玩家將透過獨特的技能組合和角色選擇&#xff0c;挑戰複雜的關卡和強大的敵人。弓箭傳說 2 儲值 - 本攻略將從角色選擇、技能搭配、裝備強化及天賦升級等方面&#xff0c;全面解讀如何在遊戲中取得最佳表現。 一、遊戲…

Webpack 的构建流程

Webpack 的构建流程可以概括为以下几个步骤&#xff1a; 1. 初始化&#xff1a; Webpack 读取配置文件&#xff08;webpack.config.js&#xff09;&#xff0c;合并默认配置和命令行参数&#xff0c;初始化Compiler对象。 2. 构建依赖图&#xff1a; 从入口文件开始递归地分…

set up RAGFlow on your Mac

个人思考&#xff1a;这些仅仅是工具&#xff0c;和人的思维实际还是有很大差距。 可能是我认知片面&#xff0c;你需要投喂大量的内容给它&#xff0c;它自己其实并不会思考&#xff0c;只是从它的认知里告诉它他知道的东西。举个不太巧当的例子&#xff0c;和以往的方式恰恰相…

【0351】Postgres内核 Open WAL segment(包含 WAL 位置 ‘RecPtr’)(2 - 4)

上一篇: 文章目录 1. 打开 WAL Segment2. Standby mode 由一个 状态机(state machine)实现2.1 何处获取 WAL 文件?2.1.1 XLogSource2.1.2 从所选源(XLogSource )读取 XLOG2.1.2.1 walreceiver 运行状态 ?2.1.3 readFile(XLOG 文件句柄)1. 打开 WAL Segment 在经过前…

Java对象与XML互相转换(xstream)

依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.18</version></dependency> 实体类 package com.itheima.util;import lombok.AllArgsConstructor; import lom…

数字IC后端实现之PR工具中如何避免出现一倍filler的缝隙?

在数字IC后端实现中&#xff0c;由于有的工艺foundary不提供Filler1&#xff0c;所以PR工具Innovus和ICC2在做标准单元摆放时需要避免出现两个标准单元之间的缝隙间距是Filler1。为了实现这个目的&#xff0c;我们需要给PR工具施加一些特殊的placement constraint&#xff08;典…

跟我学C++中级篇——通信的数据的传递形式

一、通信的数据传递 在开发程序中&#xff0c;无可避免的会进行数据的传递。这种传递方式有很多种&#xff0c;字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时&#xff0c;如何正确的采用更合适的方法&#xff0c;就成为了一个设计的首选的问题。 二…

C# HandyControl 官方示例 保姆级从0到1搭建学习流程

HandyControl 保姆级从0到1官网示例搭建学习流程 GitHub https://github.com/HandyOrg/HandyControl 技术交流 https://join.slack.com/t/handycontrol/shared_invite/zt-sw29prqd-okFmRlmETdtWhnF7C3foxA 码云 https://gitee.com/handyorg/HandyControl/ 中文文档 http…

矩阵sum,prod函数

s u m sum sum表示求和, p r o d prod prod表示求乘积 s u m sum sum函数 对于矩阵&#xff0c;可以对某一行或某一列求和&#xff0c;也可以对矩阵整体求和 s u m ( a , 1 ) sum(a,1) sum(a,1)计算每一列的和 s u m ( a , 2 ) sum(a,2) sum(a,2)计算每一行的和 计算矩阵整体…

Java—Properties类

Properties类是Java中用于处理属性文件&#xff08;.properties文件&#xff09;的类。属性文件是一种简单的文本文件&#xff0c;用于存储键值对数据&#xff0c;常用于保存配置信息。 Properties类继承自Hashtable类&#xff0c;它的键和值都是字符串类型。它提供了一些方法…

TongWeb78处理应用自身JAR包冲突思路

通常应用运行时报错如果出现java.lang.NoClassDefFoundError&#xff0c;那么首先需要看报错日志下方的Caused by内容是什么&#xff0c;如果是ClassNotFoundException&#xff0c;那么原因就是缺少某个类。如果仍然是NoClassDefFoundError&#xff0c;那么很大可能是类冲突导致…