vue项目前端解决不同用户字体大小问题

在 Vue 项目中实现用户可以调整字体大小,并且将调整后的字体大小保存到后端,以便不同用户之间能够保持一致的体验。

1、通过接口获取用户默认字体调整比例(使用vuex储存起来)

2、通过前端使用vuex封装全局字体调整方法数据方法

3、获取用户当前字体调整比例传递给后端保存

一 、vuex封装全局字体调整方法数据方法

import Vue from 'vue';
import store from '@/store/store'
// rem等比适配配置文件
// 基准大小
const baseSize = 16
// 设置 rem 函数
function setRem() {
	// 当前页面屏幕分辨率相对于 1920宽的缩放比例,可根据自己需要修改
	let width = window.screen.width;
	if(width <= 1360) {
		width = 1360;
	} else {
		width = 1920;
	}
	let zoomRatio = 1;
	try {
		zoomRatio = store.getters.getZoomRatio? store.getters.getZoomRatio : 1;
	}catch(e) {
		
	}
	const scale = document.documentElement.clientWidth / width;
	// 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
	let fontSize = baseSize * Math.min(scale, 2) * zoomRatio;
	document.documentElement.style.fontSize = fontSize + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function() {
	setRem()
}

window.addEventListener('resize', function(event) {
    // 在这里执行你的缩放检测逻辑
	setRem()
});


Vue.prototype.$setRem = setRem; // 在 Vue 原型上定义,以便在组件中调用

二、获取用户字体调整比例以及传递给后端

//获取用户字体调整比例以及传递给后端
FontSize(value) {
				使用vuex数据
				this.$store.commit("vuex存用户调整旧数据",Number((value/100).toFixed(2)))
				this.$setRem();
				this.$api.post({
					url: '接口路径',
					data: {
						后端字段:(value/100).toFixed(2)
					}
				}).then((res) => {
					
				})
			},

使用: "postcss-px2rem"、 "px2rem-loader",插件

总结:

  1. 用户界面缩放:假设应用支持用户调整字体大小或页面缩放比例,FontSize就是处理这种调整的核心函数。
  2. 响应式设计:通过调整根元素的字体大小(REM 单位),可以使页面的布局根据用户设置自动调整,达到更好的适配效果。
  3. 服务器端同步设置:该方法将用户的设置(缩放比例)同步到服务器,确保在不同设备或会话中保持一致的用户体验。
### Vue.js 前端自适应布局实现方法 #### 使用 `rem` 单位实现自适应字体大小 为了使网页在不同设备上具有良好的显示效果,可以采用相对单位 `rem` 来定义元素尺寸。根节点 `<html>` 的默认字体大小被设定为 20px,则所有后代元素中的 1 rem 就等于 20 px[^2]。 ```css /* 设置HTML根元素的基础字体大小 */ html { font-size: 20px; } .item2 { width: 10rem; /* 宽度为200px */ } ``` #### 动态调整视窗宽度下的容器比例 对于需要根据屏幕分辨率自动缩放的组件,可以通过监听窗口变化事件来动态修改样式属性。这通常涉及到计算当前可用空间并相应地更新 CSS 变换矩阵或直接改变 DOM 节点的内联样式: ```javascript // app.vue 中的应用逻辑 export default { mounted() { window.addEventListener('resize', this.handleResize); this.handleResize(); }, beforeDestroy() { window.removeEventListener('resize', this.handleResize); }, methods: { handleResize() { const container = document.querySelector('.container'); // 计算新的高度/宽度... container.style.transform = 'scale(0.8)'; } } }; ``` 需要注意的是,在应用此类变换之前应当确保目标元素拥有固定的宽高约束[^3]。 #### 智能处理页面结构的变化 当某些部分(如侧边栏、顶部导航条)可见状态发生切换时,其他区域应能够及时作出反应以保持整体布局的一致性。例如,假设存在一个搜索表单区域能够折叠收起,那么下方的数据列表就需要重新分配剩余的空间: ```scss .page-container { display: flex; flex-direction: column; height: calc( 100vh - ${headerHeight}px - ${footerHeight}px); /* 减去头部和底部占用的高度 */ .search-area.hidden ~ .data-table { flex-grow: 1; /* 当搜索框隐藏时让数据表格占据更多空间 */ } } ``` 上述代码片段展示了如何通过 SCSS 或者类似的预处理器语法简化复杂的表达式运算,并且利用相邻兄弟选择器 `.hidden ~ ...` 实现条件渲染[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熋

携手一起攻克bug

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值