alter table add column多个字段_ElementUI表格el-table表头固定自适应高度解决方案

5e4005668b5806df8cf19cd9335a21d1.png

一、前言

ElementUI、iView都以相同的方式提供了表格组件表头固定的方法,即设置组件的height属性。表头固定很重要,就在于当表格数据项很多时,滚动条出现在表格组件内,而不是出现在表格组件外——这样的优点在于,滚动浏览数据项时,表头不发生滚动而永远在可视区域,数据项的字段名可以一直看到。

el-table的height属性可以方便地实现表格固定,但是这个值该设置为多少以适配屏幕大小呢?设置过小,则可能出现可视区域内有空白位置,但是表格内却出现滚动条;设置过大,则在一些小屏幕设备上浏览时,页面本身和表格内部都可能会出现滚动条。两种情况体验都是极差的,为了解决这个问题,我们需要动态地计算页面空白区域的高度,然后设置到height属性,即根据页面大小,动态计算height属性。

这个问题难以抽象出通用的插件来解决,因为表格适合的高度在不同页面都不尽相同。本文使用的方案是,使用CSS和JS结合的方式,首先使用CSS规划出一个自适应高度的容器container,组件放到container的内部使用absolute绝对定位脱离文档流(如此table的高度不会影响到页面布局),然后使用JS获取container的高度tableHeight,将该值设置为el-table的height属性,从而实现表格自适应高度固定表头。

二、使用CSS规划自适应高度的容器container

这里所谓“自适应”,是指一个元素(往往是内容多少不固定)充分利用页面剩余空间来展示内容。使用CSS来做适应性布局,就是要减少在代码中出现数值类属性,充分地利用CSS各属性的特性让同一份代码在不同尺寸的设备中都能自由兼容呈现。最常用并且也最简单的一种适应性布局技巧是弹性布局,即flex布局。

下面是一个简单的例子,红色框是父容器,蓝色框是自适应高度的内容区域,该元素没有设置height属性,其高度自动适应为父元素高度减去“头部”的高度、padding、头部和“内容”之间的margin等。

<div class="container"><div class="header">不确定高度的头部</div><div class="content">自适应父元素剩余高度的内容</div>
</div>

e1ca39a7611e8d03f972b3e8757baab9.png

用flex实现非常简单:

.container {display: flex;  flex-direction: column;
}
.header { flex-shrink: 0; }
.content { flex: auto; }.container {height: 300px;width: 250px;text-align: center;border: 1px solid red;padding: 10px;
}.header {padding: 20px;border: 1px solid green;margin-bottom: 10px;
}.content {border: 1px solid blue;
}

前三条规则就是本例中的核心,对于container,通过display: flex声明它是一个flex盒子,flex-direction: column则表示flex弹性扩展方向是纵向;对于content,flex: auto表示该元素弹性扩张占满父元素剩余空间。

在使用表格呈现数据时,我们可以使用自适应布局的技巧,使得除去页面中的菜单、导航、各类按钮等占据的空间,表格刚好占满页面剩余空间,然后固定表头。以一个常规管理后台布局为例:

1b86720f555278dac0cd97bc07199e67.png

其中自适应区域我们用来放表格内容,其余各个部分都是固定的,在不同尺寸的设备中,自适应区域宽高自适应。只需要在CSS中重复使用display: flex设置容器为flex弹性容器、flex:auto使得某一部分占满父元素剩余空间即可。HTML和核心CSS代码如下:

1、html代码

<body><div id="app" class="flex-c"><div class="header flex-s">头部导航</div><div class="content flex-a flex"><div class="left flex-s">左部菜单</div><div class="right flex-a flex-c"><div class="menu-list flex-s">表格菜单</div><div class="table-container flex-a" ref="container">自适应区域</div><div class="pagination flex-s">表格分页</div></div></div></div>
</body>

2、CSS代码

html {height: 100%;
}body {height: 100%;margin: 0;
}#app {height: 100%;text-align: center;
}.flex, .flex-c { display: flex }
.flex-c { flex-direction: column; }
.flex-a { flex: auto; }
.flex-s { flex-shrink: 0; }

二、动态计算表格高度

我们把表格插入到自适应区域,并将设置自适应区域为相对定位,表格容器设置为绝对定位:

html代码

<div class="table-container flex-a" ref="container"><div class="table-container-inner"><el-table:data="tableData":height="tableHeight"border></el-table></div>
</div>

css代码

.table-container {position: relative;
}.table-container-inner {position: absolute;left: 0;right: 0;top: 0
}

然后我们使用Element.getBoundingClientRect()这个接口来获取自适应区域的高度,设置为表格高度,这样即可达到自适应高度固定表头的效果

export default {data () {return {tableHeight: 0,tableData: [// xxx 表格数据]}},mounted () {this.calHeight()},methods: {calHeight () {this.$nextTick(() => {const rect = this.$refs.container.getBoundingClientRect()this.tableHeight = rect.height})}}
} 

当然,在用户操作的过程中,免不了会有一些影响页面布局的因素,此时我们需要重新计算一次高度。其中最常见的一种操作是改变浏览器窗口的大小,我们可以通过监听resize事件来重新计算高度:

data () {return {timer: 0}
}
mounted () {// ...window.addEventListener('resize', this.onResize)
},
beforeDestroy () {this.timer && clearTimeout(this.timer)Z      window.removeEventListener('resize', this.onResize)
},
methods: {// ...onResize () {this.timer && clearTimeout(this.timer)this.timer = setTimeout(() => {this.calHeight()}, 500)}
}

为了避免resize高频触发回调,这里使用定时器进行一个简单的控制。完整例子可以查看:http://jsrun.net/v56Kp/edit。

三、影响容器高度的其它因素

以上解决方案考虑了窗口resize对表格容器container高度的影响,这是绝大部分需要重新计算表格高度的情况。然而,其它一些情况也可能导致container高度变化,比如DOM增删或者是样式修改引发页面布局变动。如果想做得更完美,可以在引发这些操作的地方调用calHeight方法,或者使用MutationObserver观察到这些修改。

作者:MuMa

来源:沐码小站

链接:ElementUI表格el-table表头固定自适应高度解决方案 - 沐码小站

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

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

相关文章

oracle ora 12011,执行oracle中的job报错:ORA-12011:无法执行作业1

LZ在做一个job执行每天新增一个表的操作时&#xff0c;存储过程运行没问题&#xff0c;job也创建成功&#xff0c;但运行job时&#xff0c;却报错&#xff1a; &#xff0c;后又用sys用户登陆创建了同样的存储过程和job&#xff0c;结果可以执行成功。当时就猜测是权限问题。后…

e盘是否具有读写权限_轻松搭建MySQL主从复制、读写分离(双机热备)

主从复制&#xff1a; 当mysql数据库的数据量太大的时候&#xff0c;查询数据就很吃力了&#xff0c;无论怎么优化都会产生瓶颈&#xff0c;这时我们需要增加服务器设备来实现分布式数据库&#xff0c;实现多机热备份&#xff0c;要想实现多机的热备&#xff0c;首先要了解主从…

linux运维之道基础命令,Linux运维之道(7)——Linux管理类命令

(Linux)[系统管理]1. 目录管理类命令1.1 cd命令格式&#xff1a;cd [-L|[-P [-e]] [-]] [dir]被你忽略的小知识&#xff1a;在这里科普一个小小的知识点&#xff0c;就是关于cd -为什么可以自由的在当前目录和之前目录相互切换&#xff1f;其实&#xff0c;在我们的 Shell 的环…

html画图代码_python之matplotlib画图教程(2)

各位小表贝&#xff0c;你们的画图小老弟又来咯~上一次我们聊到了如何画离散图&#xff0c;这一次我们来点复杂的&#xff0c;准备好了么&#xff0c;系好安全带&#xff0c;准备发车咯~滴滴~我们先来点比较简单&#xff0c;那种易于上手的。如果现在我知道了两个点的坐标&…

python图像识别代码_用Python进行简单图像识别(验证码)

这是一个最简单的图像识别&#xff0c;将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(ob…

c++ map初始化_Go学习每日一问(18)-map元素查找

每次学习并整理一个Golang的知识点&#xff0c;每天进步一点点。今天学习下go中的一个知识点:map元素查找日省吾身1.下面代码中 A B 两处应该怎么修改才能顺利编译&#xff1f;func main() { var m map[string]int //A m["a"] 1 if v : m["b&q…

-bash: wget: 未找到命令_18个堪称神器的命令行工具,高效运维必备

上期入口&#xff1a;24个 CSS 高级技巧合集提示&#xff1a;因公众号不支持超链接&#xff0c;上图所有项目地址&#xff0c;可在公众号后台回复关键字 “命令行工具” 获取。thefuck命令行打错了以后&#xff0c;打一个fuck就会自动纠正。GitHub&#xff1a;https://github.c…

linux编辑java文本,linux下的文本编辑器VI的使用命令

1、 移动光标H        #移到屏幕的左上角M         #移到屏幕的中间行开头L          #移到屏幕的最后一行[         #移到文件开始位置 (双击)]         #移到文件结束位置(双击):n         #移到文件的第n行Ctrl b     …

python3.8.0安装_Python3.8.0

Python3.8.0是一款广受程序员欢迎的编程语言&#xff0c;也是面向对象的一款设计语言&#xff0c;Python以其语言的灵活和简易性&#xff0c;具有非常简捷而清晰的语法特点&#xff0c;在脚本工具、数据分析、web后端等等领域都有着优良的表现&#xff0c;收到了大家的广泛应用…

cv2.error: opencv(4.4.0)_【从零学习OpenCV 4】轮廓面积与长度

本文首发于“小白学视觉”微信公众号&#xff0c;欢迎关注公众号 本文作者为小白&#xff0c;版权归人民邮电出版社发行所有&#xff0c;禁止转载&#xff0c;侵权必究&#xff01; 经过几个月的努力&#xff0c;小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解…

python自定义安装哪些不需要_【1】python模块:自定义模块的3种导入方式

一、定义 模块就是用一堆的代码实现了一些功能的代码的集合&#xff0c;通常一个或者多个函数写在一个.py文件里&#xff0c;而如果有些功能实现起来很复杂&#xff0c;那么就需要创建n个.py文件&#xff0c;这n个.py文件的集合就是模块。如果不懂可以先看下面这篇博文&#xf…

linux划分root_vg,為Linux添加新硬盤,划分LVM分區

1、為VM添加兩塊SCSI硬盤→→完成后重啟VM→→運行fdisk -l,可以看到系統自動將添加的硬盤識別為/dev/sdb和dev/sdc.2、分區對sdb和sdc進行分區&#xff0c;並調整分區類型為8e(LVM類型)&#xff0c;sdb划分為sdb1,sdb2,sdc划分為sdc1,sdc2,sdc3[rootpromote ~]# fdisk /dev/sd…

python文件输入符_python读入文件时加r的作用?

r’xxx’ 的含义 **加 r 会把字符串转变为非转义的原始字符串。**比较常用。 例如&#xff1a;print(D:\\test\\test.txt)print(rD:\\test\\test.txt)print(rD:\test\test.txt)123 结果是&#xff1a;D:\test\test.txt D:\\test\\test.txt D:\test\test.txt123 从结果看来&…

linux kvm切换器,KVM切换器是什么,看懂这一篇就够

原标题&#xff1a;KVM切换器是什么&#xff0c;看懂这一篇就够在服务器机房的机架不便于存放多个显示器和键盘的空间里&#xff0c;KVM切换器起着重要的作用。KVM切换器能从本地或远程监视与控制多个计算机与服务器&#xff0c;由键盘、鼠标和显示屏组成的KVM控制台是最方便和…

linux 信号_Linux信号量(1)-SYSTEM V

​信号量概念信号量本质上是一个计数器&#xff08;不设置全局变量是因为进程间是相互独立的&#xff0c;而这不一定能看到&#xff0c;看到也不能保证引用计数为原子操作&#xff09;,用于多进程对共享数据对象的读取&#xff0c;它和管道有所不同&#xff0c;它不以传送数据为…

python画图库哪个好_机器学习基础5--python画图库matplotlib(上)

图像是我们最直观的数据表达方式&#xff0c;python的matplotlib库可以用来画图。下面来简单总结下matplotlib的使用方法。上篇讲matplot画图中用到的基础对象&#xff0c;包括图像Figure&#xff0c;平面曲线Line2D&#xff0c;坐标轴Axes&#xff0c;图例Legend, 注解Annotat…

python怎么加图片_python中如何保存图片

一提到数字图像处理&#xff0c;可能大多数人就会想到matlab&#xff0c;但matlab也有自身的缺点&#xff1a; 1、不开源&#xff0c;价格贵 2、软件容量大。一般3G以上&#xff0c;高版本甚至达5G以上。 3、只能做研究&#xff0c;不易转化成软件。python学习网&#xff0c;大…

西门子触摸屏修改ip地址_基于博途V15 西门子S7-1200与触摸屏一个简单的例子

本篇是《基于博途V15 西门子S7-1200 ...》系列的后续篇&#xff0c;看懂本篇文章之前请大家关注我&#xff0c;然后查找相关文章&#xff0c;学习之后再学习此篇。也请专业领域的大神批评指正。感谢大家关注与支持&#xff01;步骤&#xff1a;1. 创建项目创建名称为PLC_HMI2. …

mac os和linux和安卓,在我的安卓手机里,安装Windows和macOS系统

原标题&#xff1a;在我的安卓手机里&#xff0c;安装Windows和macOS系统不知道各位差友还记不记得&#xff0c;世超前阵子分享过一款无需越狱&#xff0c;就能让 iPhone 和 iPad 运行其它系统的虚拟机软件 UTM。当时世超正是靠着这个软件&#xff0c;才得以让 iPad 成功跑上了…

gc java root_C#技术漫谈之垃圾回收机制(GC)

GC的前世与今生虽然本文是以.NET作为目标来讲述GC&#xff0c;但是GC的概念并非才诞生不久。早在1958年&#xff0c;由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能&#xff0c;这是GC的第一次出现。Lisp的程序员认为内存管理太重要了&#xff0c;所…