Element-UI - el-table中自定义图片悬浮弹框 - 位置优化

        该篇为前一篇“Element-UI - 解决el-table中图片悬浮被遮挡问题”的优化升级部分,解决当图片位于页面底部时,显示不全问题优化。

        Vue.directive钩子函数已在上一篇中详细介绍,不清楚的朋友可以翻看上一篇, “Element-UI - 解决el-table中图片悬浮被遮挡问题”的地址:Element-UI - 解决el-table中图片悬浮被遮挡问题_el-badge el-table 被遮挡-CSDN博客

一、浏览器窗口

        浏览器窗口的宽和高分别通过window.innerWidth和window.innerHeight获取,如最底部图片,可以通过获取弹框中图片高度,进行对比是否超出window.innerHeight; 如果超出,则减于图片高度,进行底部对齐显示。

二、弹框中图片高度获取

        在上一篇中,在弹框封装类中定义了imgBox属性,用于记录弹框中图片DOM节点对象,所以可以在执行resetPosition(boundingClientRect)函数时,可以通过this.imgBox.height获取弹框中图片的高度。

        控制台中显示弹框中图片高度,如下图:

三、实现图片上移

        通过上述了解后,知道了如何判断图片是否超出底位置,如果超出了,则需要将位置top减掉弹框实际高度(图片高度 + 弹框内填充),进行上移即可。

        修改后的resetPosition函数代码如下:

 /*** 重新指定弹框位置* @param {Object} boundingClientRect*/resetPosition(boundingClientRect){// 弹框实际高度const height = this.imgBox.height + this.dialogPadding * 2;// 判断图片是否超出底部可见范围if( boundingClientRect.top + height >= window.innerHeight){// top减于弹框实际高度this.sDialog.style.top = (boundingClientRect.top - height) + "px";}// 未超出else{this.sDialog.style.top = (boundingClientRect.top - this.dialogPadding) + "px";}this.sDialog.style.left = (boundingClientRect.width + boundingClientRect.left) + "px";}

        此时底部图片则已被修正,可以底部对齐显示了,如下图:

四、完整代码

1.页面代码

import sDialog from './suspendedDialog.js'
export default {data(){return {tableData: [{name: "Angular", thumb: require("@/assets/angular.jpg"), createtime: "2024/6/15", updatetime: "2024/6/15"},{name: "VueJs", thumb: require("@/assets/logo.png"), createtime: "2024/6/15", updatetime: "2024/6/15"},{name: "NuxtJs", thumb: require("@/assets/nuxtjs.jpg"), createtime: "2024/6/15", updatetime: "2024/6/15"},{name: "React", thumb: require("@/assets/react.jpg"), createtime: "2024/6/15", updatetime: "2024/6/15"},{name: "Dog", thumb: require("@/assets/dog.jpg"), createtime: "2024/6/15", updatetime: "2024/6/15"}]}},directives: {// 自定义悬浮v-suspendedsuspended: {bind: (el) => {// 初始化悬浮框sDialog.initialDom();// 鼠标经过图片并未移出时执行回调函数el.addEventListener('mouseenter', function(e) {// 显示悬浮弹框,显示后获取相应的参数信息sDialog.toggle(true, () => {sDialog.setImgUrl(el.src);                              // 修改新的图片地址sDialog.resetPosition(el.getBoundingClientRect());      // 修正弹框位置});});// 鼠标移出图片区域时,隐藏悬浮弹框el.addEventListener('mouseleave', () => sDialog.toggle(false));}}},// end
}

2.封装类(suspendedDialog.js)

/** 定义弹框类*/
class SuspendedDialog{constructor(){this.idName = "suspended-dialog";       // 定义容器ID选择器名称this.innerClassName = "inner";          // 内容器类选择器名称this.imgClassName = "imgs";             // 图片节点类选择器名称this.dialogWidth = 240;                 // 外容器宽度this.dialogPadding = 12;                // 外容器内填充this.sDialog = document.createElement('div');   // 外层容器this.innerBox = document.createElement('div');  // 内容器对象this.imgBox = document.createElement('img');    // 图片节点对象}/*** 初始化DOM,并添加到body中*/initialDom(){const sDialog = document.getElementById(this.idName);   // 查询节点// 如果节点存在,则结束后续操作if(sDialog) return;// 初始经属性this.sDialog.id = this.idName;this.innerBox.classList.add(this.innerClassName);this.imgBox.classList.add(this.imgClassName);// 将DOM追加到对应容器中this.innerBox.append(this.imgBox);this.sDialog.append(this.innerBox);document.body.append(this.sDialog);// 追加事件this.addEvent();}/*** 修改图片路径* @param {Object} _url*/setImgUrl(_url){this.imgBox.src = _url;}/*** 添加监听事件*/addEvent(){this.sDialog.addEventListener('mouseenter', e => this.toggle(true));    // 鼠标移入悬浮框区域时保持显示this.sDialog.addEventListener('mouseleave', e => this.toggle(false));   // 鼠标移出悬浮框区域时隐藏}/*** 显示与隐藏* @param {Object} flag* @param {Object} callback  回调函数*/toggle(flag, callback = () => {}){if(flag && 'block'!=this.sDialog.style.display){this.sDialog.style.display = 'block';callback();} else if(!flag && 'none'!=this.sDialog.style.display){this.sDialog.style.display = 'none';callback();}}/*** 重新指定弹框位置* @param {Object} boundingClientRect*/resetPosition(boundingClientRect){// 弹框实际高度const height = this.imgBox.height + this.dialogPadding * 2;// 判断图片是否超出底部可见范围if(boundingClientRect.top + height >= window.innerHeight){// top减于弹框实际高度this.sDialog.style.top = (boundingClientRect.top - height) + "px";}// 未超出else{this.sDialog.style.top = (boundingClientRect.top - this.dialogPadding) + "px";}this.sDialog.style.left = (boundingClientRect.width + boundingClientRect.left) + "px";}
}
export default new SuspendedDialog();

        另外,图片除了底部超出可见范围,也会出现左侧或右侧超出可见范围,则可以通过window.innerWidth进行判断处理,计算方式差不多,这里就不再阐述。

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

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

相关文章

深入刨析Redis存储技术设计艺术(二)

三、Redis主存储 3.1、存储相关结构体 redisServer:服务器 server.h struct redisServer { /* General */ pid_t pid; /* Main process pid. */ pthread_t main_thread_id; /* Main thread id */ char *configfile; /* Absolut…

Interpretability 与 Explainability 机器学习

「AI秘籍」系列课程: 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 Interpretability 模型和 Explainability 模型之间的区别以及为什么它可能不那么重要 当你第一次深入可解释机器学习领域时,你会…

Zabbix配置文件中Server和ServerActive参数讲解

目录 参数总结 实例: Zabbix Server 配置 (zabbix_server.conf) Zabbix Agent 配置 (zabbix_agentd.conf) 配置文件解析 实际应用 Zabbix Server 配置文件 (zabbix_server.conf) 对代理端的影响 1. Server 参数 2. ServerActive 参数 Zabbix Agent 配置文…

ubuntu 22 安装 lua 环境 编译lua cjson 模块

在 windows 下使用 cygwin 编译 lua 和 cjson 简直就是灾难,最后还是到 ubuntu 下完成了。 1、下载lua源码(我下载的 5.1 版本,后面还有一个小插曲), 直接解压编译,遇到一个 readline.h not found 的问题,需要安装 re…

python使用langchain整合通义千文

首先pip安装langchain和dashscope pip install langchain pip install langchain_community pip install dashscope --upgrade然后测试一下运行效果 from langchain_community.chat_models.tongyi import ChatTongyi from langchain.schema import HumanMessage #api_key可以…

如何使用C++中的内联函数和编译器优化

在C中,内联函数(inline functions)是一种请求编译器尝试在调用点将函数体展开,而不是按照常规函数调用的方式(即产生调用指令、保存寄存器、栈帧操作等)来执行的特殊函数。内联函数主要用于小的、频繁调用的…

CentOS命令格式及常用命令

在CentOS中,系统目录结构遵循了标准的Linux文件系统层次结构(Filesystem Hierarchy Standard,FHS)。下面是CentOS系统中一些重要的目录及其用途的介绍: 1. /(根目录):整个文件系统的…

207 课程表

题目 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 …

ArcGIS Pro SDK (七)编辑 13 注解

ArcGIS Pro SDK (七)编辑 13 注解 文章目录 ArcGIS Pro SDK (七)编辑 13 注解1 注释构建工具2 以编程方式启动编辑批注3 更新批注文本4 修改批注形状5 修改批注文本图形6 接地到网格 环境:Visual Studio 2022 .NET6 …

在 PostgreSQL 中,如何处理数据的版本控制?

文章目录 一、使用时间戳字段进行版本控制二、使用版本号字段进行版本控制三、使用历史表进行版本控制四、使用 RETURNING 子句获取更新前后的版本五、使用数据库触发器进行版本控制 在 PostgreSQL 中,处理数据的版本控制可以通过多种方式实现,每种方式都…

ensorFlow是由Google开发的

TensorFlow是由Google开发的一个开源的深度学习框架。它提供了一种灵活且高效的方法来构建、训练和部署各种机器学习模型。 TensorFlow的基本概念是计算图(computational graph)。在TensorFlow中,用户通过定义计算图来描述模型的结构和计算流…

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己…

思维导图插件--jsMind的使用

vue引入jsmind(右键菜单)_jsmind.menu.js-CSDN博客 第一版 vue-JsMind思维导图实现(包含鼠标右键自定义菜单)_jsmind 右键菜单-CSDN博客 // 新增节点addNode() {console.log(this.get_selected_nodeid());this.get_selected_…

Vue的学习之数据与方法

前段期间&#xff0c;由于入职原因没有学习&#xff0c;现在已经正式入职啦&#xff0c;接下来继续加油学习。 一、数据与方法 文字备注已经在代码中&#xff0c;方便自己学习和理解 <!DOCTYPE html> <html><head><meta charset"utf-8">&l…

如何使用HippoRAG增强LLM的记忆

大型语言模型&#xff08;LLM&#xff09;已经证明是一种非常宝贵的思考工具。经过大量文本、代码和其他媒体数据集的训练&#xff0c;它们能够创作出接近人类水平的文章、翻译语言、生成图像&#xff0c;还能以信息丰富的方式回答人们提出的问题&#xff0c;甚至可以编写不同类…

SQLite 附加数据库

SQLite 附加数据库 SQLite 是一种轻量级的数据库管理系统,因其小巧、快速和易于使用而广受欢迎。在 SQLite 中,可以将多个数据库文件附加到单个数据库连接中,从而允许用户在不同的数据库之间轻松切换和操作数据。本文将详细介绍如何在 SQLite 中附加数据库,并探讨其使用场…

CANopen协议开发梳理总结笔记教程

0、提醒 CANOpen使用时&#xff0c;需要清楚什么是大端和小端&#xff0c;这对于CANOpen数据发送及解析时&#xff0c;有很大的帮助。且学习开发CANOpen时&#xff0c;需要具备一定的CAN基础。 1、CANOpen协议介绍 ①、什么是CANOpen协议 CANOpen协议是一种架构在控制局域网络…

基于CLIP特征的多模态大模型中的视觉短板问题

【论文极速读】 基于CLIP特征的多模态大模型中的视觉短板问题 FesianXu 20240706 at Tencent WeChat search team 前言 今天读到篇CVPR 24’的论文 [1]&#xff0c;讨论了常见的多模态大模型&#xff08;大多都基于CLIP语义特征&#xff0c;以下简称为MLLM&#xff09;中的视觉…

若依 / ruoyi-ui:执行yarn dev 报错 esnext.set.difference.v2.js in ./src/utils/index.js

一、报错信息 These dependencies were not found: * core-js/modules/esnext.set.difference.v2.js in ./src/utils/index.js * core-js/modules/esnext.set.intersection.v2.js in ./src/utils/index.js * core-js/modules/esnext.set.is-disjoint-from.v2.js in ./src/utils…

Python处理表格数据常用的 N+个操作

Python作为一种强大且易用的编程语言&#xff0c;其在数据处理方面表现尤为出色。特别是当我们面对大量的表格数据时&#xff0c;Python的各类库和工具可以极大地提高我们的工作效率。以下&#xff0c;我将详细介绍Python处理表格数据常用的操作。 首先&#xff0c;我们需要安…