Element-UI 调整
1.对话框
当打开的对话框页面元素众多,俨然一个iframe页面时,可以做2个优化:
- 滚动条:对话框去滚动,当对话框内容过多时,把滚动条控制在对话框内部,避免出现页面级的滚动条
- 标题栏:优化对话框标题样式,为其添加一个背景色,使之看上去更像一个iframe页面
实现思路:
- 把滚动条控制在对话框内部,要点在于给内容区域设定一个合适的高度,经测试,这个高度为:
页面高度(100vh) - marign-top(15vh) - marign-bottom(50px) - 对话框标题高度(54px) - 去除内容区默认的默认的padding
- 重置对话框标题背景色
- 如果页面元素不足以撑起整个容器,可以把提交按钮固定的底部,防止页面过于空旷
/* 重置对话框标题背景色 */
.el-dialog__header {
background-color: #2c3e50 !important;
}
/* 重置对话框标题字体颜色 */
.el-dialog__header .el-dialog__title {
color: #fff !important;
}
/* 去除内容区默认padding */
.el-dialog__body{
padding:0 !important;
}
<!-- 弹框区域 开始 -->
<el-dialog title="对话框标题" :visible.sync="dialogVisible" width="80%" :close-on-click-modal="false" :before-close="dialogBeforeClose">
<!-- calc(85vh - 104px) -->
<div style="height:calc(85vh - 50px - 54px);">
<vue-scroll>
<div style="padding:10px;">
</div>
</vue-scroll>
</div>
</el-dialog>
<!-- 弹框区域 结束 -->
2.列宽自适应
无论是Element-UI中的table组件,还是专业vxe-table表格插件,都无法做到完美的列宽自适应,更不用说第三方插件。一切还得自己来,解决思路如下:
- 表格的每一列默认均分宽度,如果某一列设定了具体的宽度,则其他列均分剩下的宽度
- width和min-width都具有响应式特定,值发生变化表格会重新布局
- 列建议禁止换行,因为会造成每行高度不一致,影响观感 ,例如:通过设定列标签的 class-name 属性来设定列样式
- 宽度固定的列,例如时间,姓名等等,建议设定width,但是不能所有的列都是固定宽度
- 宽度不固定的列,例如地址,可以根据表头或者列内容来设定最小宽度
- 列的最大宽度由列标题和列内容决定,可以封装一个过滤器,传入列字段和标题,来输出最大宽度
- 宽度计算涉及字体大小,padding,有时候还需要设定最大值与最小值
//过滤器代码
//闭包 传入当前环境的this
(function (global, factory) {
//1.先判断当前环境是否支持CommonJS规范(node.js)
if (typeof exports == 'object' && typeof module !== 'undefined') {
console.log('CommonJS规范')
module.exports = factory()
} else if (typeof define == 'function' && define.amd) {//2.再判断是否支持AMD规范(require.js)
console.log('AMD规范')
define(factory)
} else {
console.log('script标签引入')
if(this.Vue){
//自动执行安装
Vue.use(factory())
}
}
}(this, function () {
return {
//插件安装方法
install: function (Vue) {
if (!Vue) {
return
}
//过滤器 求出表格列的最大宽度
Vue.filter('maxWidthForColumn', function (tableData = [], prop = '',title='',option = {}) {
//默认值设定
if(!option.font_size){
option.font_size = 12
}
if(!option.padding){
option.padding = 10
}
if(!option.min){
option.min = 80
}
if(!option.max){
option.max = 300
}
//是否根据内容确认列宽,否则使用表头确认列表
if(!option.fit_content){
option.fit_content = false
}
//计算表头占位宽度
var title_width = getTextWidth(title)
//是否根据内容确认列宽
if(option.fit_content){
//获取字符串集合(列内容,不包含列表头)
var text_list = tableData.map(item => {
return item[prop]
})
//计算字符串集合的最大宽度
var content_max_width = getMaxWidthByArray(text_list)
}else{
//忽略内容宽度
var content_max_width = option.min
}
//列表头和列表体 取最大值
//console.log('列表体与表头',content_max_width,title_width)
var target_width = content_max_width > title_width? content_max_width:title_width
//加上左右padding 20px
target_width += (option.padding*2)
//console.log('综合最大值',target_width)
//值范围大小限制
if (target_width > option.max) {
target_width = option.max
} else if(target_width < option.min){
target_width = option.min
}
console.log('列宽最终值',title,target_width)
//返回结果
return target_width
//计算字符串的占位宽度
function getTextWidth(str = '') {
//如果参数是字符串或者数字,则表示占位宽度已经计算
if(typeof str == 'string' || typeof str == 'number' ){
const dom = document.createElement('span')
dom.style.display = 'inline-block'
dom.style['font-size'] = option.font_size + 'px'
dom.textContent = str
document.body.appendChild(dom)
//额外多加5像素,防止误差
const width = dom.clientWidth + 5
document.body.removeChild(dom)
return width;
}else{
//如果不是这两类,无论是布尔类型,对象,数组都是不可测量占位宽度 直接返回最小值
return option.min
}
}
//计算字符串数组中的最大宽度
function getMaxWidthByArray(text_arr = []) {
//计算设备编号占位的最大宽度
var max_width = 0
text_arr.forEach(function (str) {
var now_text_width = getTextWidth(str)
if (now_text_width > max_width) {
max_width = now_text_width
}
})
return max_width
}
})
}
}
}))
<el-table :data="tableData" style="width: 100%" size="small" border>
<el-table-column prop="program_name" label="程序名称" :width="tableData | maxWidthForColumn('program_name','程序名称')">
</el-table-column>
</el-table>
- 过滤器参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| 参数一 | 空字符串 | 列字段名 |
| 参数二 | 空字符串 | 列标题 |
| 参数三 | {} | 配置项,字体大小,padding等 |
- 过滤器配置参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| font_size | 12 | 字体大小 |
| padding | 10 | padding大小 |
| max | 300 | 最大值 |
| min | 80 | 最小值 |
| diy_render | false | 如果此列开启了自定义渲染,请置为true,之后不再计算其字符串占位宽度 |
3.表格样式调整
- 表格有默认的边框颜色,背景色,字体颜色,某些需求下需要进行替换(例如看板)
/* 边框颜色重置 */
.table-box .el-table,
.table-box .el-table__header,
.table-box .el-table__body,
.table-box .el-table th,
.table-box .el-table td{
border-color: #223F96;
}
.table-box .el-table::before,
.table-box .el-table--border::after{
background-color:#223F96;
}
/* 背景色重置 */
.table-box .el-table,
.table-box .el-table th, .table-box .el-table tr{
background-color: transparent;
}
/* 字体颜色重置 */
.table-box .el-table,
.table-box .el-table thead,
.table-box .el-table__empty-text{
color:rgba(255, 255, 255, 0.75);
}
/* 斑马样式重置 */
.table-box .el-table--striped .el-table__body tr.el-table__row--striped td{
background-color: rgba(255, 255, 255, 0.03);
}
/* hover样式重置 */
.table-box .el-table--enable-row-hover .el-table__body tr:hover>td{
background-color: rgba(255, 255, 255, 0.05);
}
/* 表头下边框 */
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #223F96;
}
4.表格布局异常
- 当配合tab切换渲染具有固定高度的表格时,会导致表格布局异常(原因:表格渲染过程中,容器处于隐藏状态,会导致这种情况发生)
- 当进行tab切换时,会刷新所在容器的组件布局,所以默认选中的tab中的表格会高度异常,其他的就不会
- 为了保证默认tab中的表格布局正常,需要对tab进行手动切换,分三步走:
- 1.取消tab默认选中
- 2.监听第一个表格的渲染完成事件
- 3.表格的渲染完成事件后选中tab,触发布局刷新
<el-tabs v-model="active_tab" type="border-card">
<el-tab-pane label="角色平板权限" name="first">
<!-- 角色平板权限组件 -->
<pad-authority @mounted="padTableMounted"></pad-authority>
</el-tab-pane>
<el-tab-pane label="角色工位权限" name="second">
<!-- 角色工位权限组件 -->
<step-authority></step-authority>
</el-tab-pane>
<el-tab-pane label="角色功能权限" name="third">
<opration-authority></opration-authority>
</el-tab-pane>
</el-tabs>
data(){
return {
active_tab: "",//当前激活的tab
},
components:{
"pad-authority": httpVueLoader('/components/pad-authority.vue?time='+new Date().getTime()),//角色平板权限组件
"step-authority": httpVueLoader('/components/step-authority.vue?time='+new Date().getTime()),//角色工位权限组件
"opration-authority": httpVueLoader('/components/opration-authority.vue?time='+new Date().getTime()),//角色功能权限组件
},
methods:{
//角色平板权限组件的表格渲染完成事件
//未激活的tab内容区高度为0 此时渲染有固定高度的表格会导致高度异常
//但是tab切换显示时会自动刷新所在tab内容区的表格布局,利用这一点,等待表格渲染结束后,可以自动切换tab,从而避免表格高度异常
padTableMounted(){
setTimeout(()=>{
this.active_tab = 'first'
},10)
}
}
},
<el-table v-if="initHeight">< el-table>
//高度计算就绪
this.initHeight = true
this.$nextTick(function(){
//pad表格渲染完毕 通知父组件
this.$emit('mounted')
})
Element-UI 调整的更多相关文章
- element UI 调整表格行高
使用element UI的table默认属性,绘制表格如下: 该表格的行高太大了,于是想调小一些. 查看官网的文档,table有几个属性, row-style:行的 style 的回调方法,也可以使用 ...
- element ui step组件在另一侧加时间轴显示
这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...
- 🎉 Element UI for Vue 3.0 来了!
第一个使用 TypeScript + Vue 3.0 Composition API 重构的组件库 Element Plus 发布了 ~ 2016 年 3 月 13 日 Element 悄然诞生,经历 ...
- element UI表格行高、padding等设置报错问题
element UI里面表格的行高需要自己调整高度和设置padding,直接写style是不行的,里面有 : 1.row-style (行的 style) 2.header-row-styl (表 ...
- 使用element ui 日期选择器获取值后的格式问题
一般情况下,我们需要给后台的时间格式是: "yyyy-MM-dd" 但是使用Element ui日期选择器获取的值是这样的: Fri Sep :: GMT+ (中国标准时间) 在官 ...
- element ui 1.4 升级到 2.0.11
公司的框架 选取的是 花裤衩大神开源的 基于 element ui + Vue 的后台管理项目, 项目源码就不公开了,记录 分享下 步骤 1. 卸载 element ui 1.4的依赖包 2. 卸载完 ...
- [坑况]饿了么你是这样的前端——vue+element ui 【this dependency was not found:'element-ui/lib/theme-chalk/index.css'】
element ui 坑况:今日pull代码,潇洒npm run dev ,被告知:this dependency was not found:'element-ui/lib/theme-chalk/ ...
- Vue + Element UI项目初始化
1.安装相关组件 1.1安装Node 检查本地是否安装node node -v 如果没有安装,从Node官网下载 1.2安装npm npm -v 如果没有安装:使用该指令安装: npm install ...
- Element UI——本地引入iconfont不显示
前言 前面因为本地引入Element UI导致了iconfont不显示,所以只好再去Element UI官网去扒下iconfot 步骤 进入官网 组件 | Element UI F12进入控制台,找到 ...
- Html | Vue | Element UI——引入使用
前言 做个项目,需要一个效果刚好Element UI有,就想配合Vue和Element UI,放在tp5.1下使用,但是引入在线的地址各种报错,本地引入就完美的解决了问题! 代码 __STATIC_J ...
随机推荐
- EF Core – 冷知识
Add vs AddAsync 参考: .NET 5 REST API Tutorial AddAsync() vs Add() in EF Core EF Core's AddAsync v. Ad ...
- Figma 学习笔记 – Constraints 约束
用途 Constraints 用于 responsive design, 子元素和父元素建立约束关系后, 当父元素 dimension 变换的时候, 子元素会做出相应的变化 (移动位置或 resize ...
- .NET周刊【10月第1期 2024-10-06】
国内文章 基于DPAPI+RDP技术实现本地打开远程程序,并映射到本地机器桌面上 https://www.cnblogs.com/weskynet/p/18445584 该教程讲述如何使用Remote ...
- threejs 几何体的本质 顶点
几何体的线框模式, 一个正方平面最少可以由4个顶点组成,两个三角形组成(公用了 2个顶点,使用了索引创建顶点属性) . // 导入 threejs import * as THREE from &qu ...
- 3. 王道OS-操作系统的运行机制,中断和异常
1. 高级语言- 编译 - 机器指令 (二进制) 2. 内核态和用户态 :刚开机的时候CPU是内核态,当用户启动某个程序的时候CPU是用户态,如果遇到危险,操作系统会夺回CPU的控制权成为内核态,当危 ...
- ES5 和 ES6 的区别,说几个 ES6 的新增方法
ECMAscript5.,即ES5 ,表示 ECMAscript的第五次修订-2009 : ECMAscript6.,即ES6 ,表示 ECMAscript的第六次修订-2015 : ES6 是对于 ...
- Vue3 的 nextTick 函数
作用: DOM 渲染是异步耗时的, vue2.x 需要等到 DOM 渲染完成之后做某个事情,需要使用 this.$nextTick , vue3.x 则直接提供了 nextTick 这个方法去实现 : ...
- C#查漏补缺----值类型与引用类型,值类型一定分配在栈上吗?
前言 环境:.NET 8.0 系统:Windows11 参考资料:<CLR via C#>, <.Net Core底层入门>,<.NET 内存管理宝典> 栈空间与堆 ...
- 08 ELMo模型(双向LSTM模型解决词向量多义问题)
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- kotlin协程——>通道
通道:延期的值提供了⼀种便捷的⽅法使单个值在多个协程之间进⾏相互传输.通道提供了⼀种在流中传输 值的⽅法. 通道基础: ⼀个 Channel 是⼀个和 BlockingQueue ⾮常相似的概念.其中 ...