Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中,需要将1920*1080放到更大像素大屏上演示,所以需要使用到transform来对页面进行缩放,但是此时发现弹框定位出错问题,无法准备定位到实际位置。

查看element-ui官方文档无果后,打算更换新的框架进行开发,但更换几个后发现都存在类似问题,由于之前项目都是使用element-ui,对此框架比较熟悉,所以还是决定在此基础上解决问题。

在未解决前,错位效果如下:

如果屏幕像素更大,则偏移位置更远,对此element-ui文档中常规配置已无法解决,只能从底层考虑。

一、思路

首先,我们得在触发日期弹框显示前或当时,动态修改定位相关参数,在官方文档上发现有focus事件,在触发此事件时,弹框开始显示,所以在此修改相应参数即可。

其次,绑定focus事件函数,返回当前日期组件的ref对象数据,可以通过popperJS对象修改弹框的定位属性,并使用update()函数重新更新即可。

然后,在更新完成后,需要添加setTimeout计时器,延迟修改弹框的top属性。由于暂时未从底层了解到从哪修改top值,放在update()之前修改发现无效,由于内部会重新计算覆盖;只能在update()之后修改,出此下策也能得到同样效果。

二、代码

1、组件代码

html 复制代码
<el-date-picker
	  v-model="dateValue"
	  size="small"
	  type="date"
	  :append-to-body="false"
	  :clearable="false"
	  placeholder="选择日期" @focus="focusFixDatePickerPosition">
	</el-date-picker>

2、输出focus事件返回参数

javascript 复制代码
methods: {
  focusFixDatePickerPosition(e){
    console.log(e);
  }
}

输出结果如下:

3、经测试,发现同update()函数一样效果的函数还有很多,如下:

javascript 复制代码
// popperJS.state中updateBound()调用也会重新更新弹框位置
e.popperJS.state.updateBound();

// 直接调用popperJS中的update()
e.popperJS.update();

// 使用showPicker()也有同样效果
e.showPicker();

// 使用updatePopper(),也会更新弹框位置
e.updatePopper();

在实际开发中,根据需要使用其中一个即可。每个函数本人也没作研究,只是测试发现可实现同样效果,喜欢钻牛角尖的同学可以研究下。

4、在methods中定义focusFixDatePickerPosition函数

javascript 复制代码
methods: {
  focusFixDatePickerPosition(e){
	this.$nextTick(() => {
	  // 修改定位属性,将fixed改成absolute
	  e.popperJS.state.position = 'absolute';
	  // 调用update()后,弹框位置重新调休
	  e.popperJS.update();
      // 添加计时器
	  setTimeout(() => {
		// 输入框高度为弹框 顶部偏移量,获取后赋值给top即可
		e.picker.$el.style.top = e.$el.clientHeight + "px";
	  }, 20);
	});
  }
}

此时,则完成了弹框位置的修正,效果如下:

相关推荐
2601_9557600716 分钟前
如何用 Claude Opus 5 API 批量扩展长尾关键词和文章选题
前端·python·搜索引擎
KaMeidebaby20 分钟前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
触底反弹41 分钟前
🚀 删了数据刷新又回来?3 组件 × 4 回调 × 3 坑讲透 React 父子通信
前端·javascript·react.js
耳东小鹿2 小时前
对象常用方法
前端
程序员海军2 小时前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
程序员黑豆2 小时前
鸿蒙应用开发:Stack堆叠组件实战——实现微信消息角标效果
前端·harmonyos
夏幻灵2 小时前
浏览器原理深度解析:从输入 URL 到页面展现的全流程剖析
前端
闲猫3 小时前
Agent工程实践:从WorkFlow到多Agent协作的落地笔记
java·服务器·前端
带娃的IT创业者3 小时前
重新定义前端构建速度:深度解析 SWC 如何用 Rust 颠覆 JavaScript 工具链
前端·javascript·rust·前端构建·swc
happy_0x3f3 小时前
前端应用的离线暂停更新策略
开发语言·前端·php