首页 > 其他分享 >【前端开发】老年模式:字体大小设置

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

时间:2024-12-01 23:29:28浏览次数:4  
标签:字体大小 fontScale return state 老年 import 前端开发 store

  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 { onl oad } 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.0
			console.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>

标签:字体大小,fontScale,return,state,老年,import,前端开发,store
From: https://blog.csdn.net/weixin_48348920/article/details/144131210

相关文章

  • 用js实现动态改变根元素字体大小的方法
    functionchangeRootFontSize(fontSize){//Method1:Using`document.documentElement.style.fontSize`document.documentElement.style.fontSize=fontSize;//Method2:Using`:root`CSSvariableand`setProperty`(moreflexible)//Thisallowsyou......
  • 当页面采用rem布局时,如何解决用户设置字体大小造成的页面布局错位?
    当页面采用rem布局时,用户修改字体大小会影响根元素(html)的字体大小,进而影响所有使用rem单位的元素尺寸,导致页面布局错乱。解决这个问题的方法主要有以下几种:1.使用媒体查询配合clamp()函数动态调整根元素字体大小:这是目前推荐的最佳方案,它可以兼顾用户设置和页面布局的稳......
  • 使用rem布局时怎样合理设置根标签字体大小?
    设置html根标签字体大小是rem布局的核心。合理的设置方式取决于你的设计稿尺寸和目标设备范围,以及你希望如何简化计算。以下几种常见方法:简单易懂的10px法(不推荐):设置html{font-size:62.5%;},这使得1rem等于10px(因为浏览器默认字体大小是16px,16*62.5%=10px)。......
  • python 数据绘制线型、坐标刻度、字体大小等
    标记符号marker参数值效果圆点'o'●星号'*'★方形's'■菱形'D'◆上三角形'^'▲下三角形'v'▼左三角形'<'◀右三角形'>'▶加号'+'+五角星'p'★(五角星)十......
  • 帝国CMS内容页模板点击改变字体大小的js代码
    加入JS代码:<scripttype="text/javascript">functionFontZoom(fsize){varctext=document.getElementById("news");ctext.style.fontSize=fsize+"px";}</script>定制框架:<divid="news"&......
  • 你觉得你上家公司的前端开发流程有什么地方要优化的吗?怎么优化呢?
    根据我对前端开发流程的理解,以及对常见问题的了解,提供一些通用的优化思路:1.需求和设计阶段:更清晰的需求文档:含糊不清的需求是导致返工和延期的主要原因。应该使用更规范的需求文档,例如用户故事(UserStory),并结合原型图、线框图等可视化工具,让开发团队更清晰地理解需求。......
  • flask框架华祥老年公寓信息管理系统(毕设源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于老年公寓信息管理系统的研究,现有研究主要集中在大型养老机构的通用管理系统,专门针对华祥老年公寓这种特定环境的研究较少。在国内......
  • 说说你对移动端和web前端开发的主要区别是什么?
    移动端和Web前端开发虽然都属于前端开发的范畴,但它们之间存在一些关键区别:1.平台和环境差异:移动端:面向各种移动操作系统(iOS、Android、HarmonyOS等),需要考虑不同系统的特性、屏幕尺寸、硬件性能等。开发需要针对不同平台进行适配,例如使用不同的开发语言(Swift/Objectiv......
  • 计算机毕业设计原创定制(免费送源码):Java+B/S+SSM+Web前端开发技术+IDEA+MySQL+Navicat
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对有风小院等问题,对有风小院信息管理进行研究分析,然后开发设计出有风小院系统以解决问题。有......
  • 【GPTs】Front-end Expert:助力前端开发的智能工具
    博客主页:[小ᶻZ࿆]本文专栏:AIGC|GPTs应用实例文章目录......