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.pswp.cn/web/40857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40857.shtml
英文地址,請注明出處:http://en.pswp.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;我們需要安…