当前位置: 首页 > news >正文

el-table高度自适应vue页面指令

应用情况

当页面结构要求铺满整个页面时,table高度要求设置成自适应剩下的高度

项目构造

vue2+elementUI

实现

设置自定义指令,计算其他的高度后,手动设置table的高度

代码

/*** 自定义指令:实现元素高度自适应* 使用方式:v-resize="{ height: number, id?: string, class?: string }"*/export default {// 指令第一次绑定到元素时调用inserted(el, bind) {const _el = el.children[0]; // 获取第一个子元素// 创建resize事件处理函数let func = () => bind.def.runs(bind, _el);bind.def.func = func; // 保存函数引用,用于后续移除事件监听window.addEventListener("resize", func); // 添加窗口大小改变监听bind.def.runs(bind, _el); // 初始化时执行一次},// 组件更新时调用componentUpdated(el, bind) {const _el = el.children[0];bind.def.runs(bind, _el);},// 核心处理函数:计算并设置元素高度runs(fun, el) {// 获取目标元素let query = fun.def.query(el, fun.value);// 获取body高度let body = document.getElementsByTagName("body")[0];let height = body.getBoundingClientRect().height;// 获取预留高度let less = 0;if (fun.value.height) {less = fun.value.height;}setTimeout(() => {// 获取元素距离顶部的距离let top = fun.def.getPoint(query);// 计算元素应该的高度:视口高度 - 顶部距离 - 预留高度let hei = height - top - less;query.style.height = hei + "px";// 处理 element-ui 表格的特殊情况let child = query.querySelector(".el-table__body-wrapper");let fixWrapper = query.querySelector(".el-table__fixed-body-wrapper");if (child) {// 获取表头高度let table_head = query.querySelector(".el-table__header-wrapper");let table_head_height =parseInt(window.getComputedStyle(table_head).height) + 2;// 计算表格体的高度const wrapperHeight = hei - table_head_height + "px";// 设置表格体高度child.style.height = wrapperHeight;// 设置固定列的高度if (fixWrapper) {fixWrapper.style.height = wrapperHeight;}}}, 100);},// 查询目标元素的工具函数query(el, selector) {if (selector.id) {return document.getElementById(selector.id); // 通过ID查找}if (selector.class) {let names = selector.class.replace(/\s+/g, "."); // 处理类名中的空格let name = "." + names;return el.querySelector(name); // 通过类名查找}return el; // 默认返回当前元素},// 计算元素到顶部的距离getPoint(obj) {var t = obj.offsetTop; // 当前元素相对于父元素的偏移var l = obj.offsetLeft;// 循环向上遍历父元素,累加偏移值while ((obj = obj.offsetParent)) {t += obj.offsetTop;l += obj.offsetLeft;}return t;},// 指令解绑时移除事件监听unbind(el, bind) {window.removeEventListener("resize", bind.def.func);},
};
http://www.dtcms.com/a/313859.html

相关文章:

  • 第二十三天(APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围)
  • Jetbrains IDE总是弹出“需要身份验证”窗口
  • 算法11. 盛最多水的容器
  • leetcode-sql-3497分析订阅转化
  • 优选算法 力扣 11. 盛最多水的容器 双指针降低时间复杂度 贪心策略 C++题解 每日一题
  • 验证码等待时间技术在酒店自助入住、美容自助与社区场景中的应用必要性研究—仙盟创梦IDE
  • Flask + HTML 项目开发思路
  • 【BUUCTF系列】[极客大挑战 2019]LoveSQL 1
  • 同质无向加权图:理论基础、算法演进与应用前沿
  • MySQL偏门但基础的面试题集锦
  • 理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
  • IM消息数据库调研
  • Lecture 1 Overview and Tokenization 课程笔记
  • Go语言select
  • Redis真的是单线程的吗?
  • 跟着顶刊学写论文-摘要1
  • codeBuddy IDE 使用教程
  • Web 开发 12
  • ZYNQ-按键消抖
  • labview解析S7协议
  • Neo4j 社区版 Mac 安装教程
  • Django集成图片验证码功能:基于django-simple-captcha实现
  • 数据结构----排序
  • EdgeView for macOS:解决图像管理痛点的利器
  • c# 属性操作(2)
  • PyCharm代码规范与代码格式化插件安装与使用:pylint和autopep8
  • javacc学习笔记 01、JavaCC本地安装与测试
  • C++-异常
  • Go语言实战案例:编写一个简易聊天室服务端
  • 从零开始的云计算生活——项目实战