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 调整的更多相关文章

  1. element UI 调整表格行高

    使用element UI的table默认属性,绘制表格如下: 该表格的行高太大了,于是想调小一些. 查看官网的文档,table有几个属性, row-style:行的 style 的回调方法,也可以使用 ...

  2. element ui step组件在另一侧加时间轴显示

    这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...

  3. 🎉 Element UI for Vue 3.0 来了!

    第一个使用 TypeScript + Vue 3.0 Composition API 重构的组件库 Element Plus 发布了 ~ 2016 年 3 月 13 日 Element 悄然诞生,经历 ...

  4. element UI表格行高、padding等设置报错问题

    element UI里面表格的行高需要自己调整高度和设置padding,直接写style是不行的,里面有 : 1.row-style (行的 style) 2.header-row-styl   (表 ...

  5. 使用element ui 日期选择器获取值后的格式问题

    一般情况下,我们需要给后台的时间格式是: "yyyy-MM-dd" 但是使用Element ui日期选择器获取的值是这样的: Fri Sep :: GMT+ (中国标准时间) 在官 ...

  6. element ui 1.4 升级到 2.0.11

    公司的框架 选取的是 花裤衩大神开源的 基于 element ui + Vue 的后台管理项目, 项目源码就不公开了,记录 分享下 步骤 1. 卸载 element ui 1.4的依赖包 2. 卸载完 ...

  7. [坑况]饿了么你是这样的前端——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/ ...

  8. Vue + Element UI项目初始化

    1.安装相关组件 1.1安装Node 检查本地是否安装node node -v 如果没有安装,从Node官网下载 1.2安装npm npm -v 如果没有安装:使用该指令安装: npm install ...

  9. Element UI——本地引入iconfont不显示

    前言 前面因为本地引入Element UI导致了iconfont不显示,所以只好再去Element UI官网去扒下iconfot 步骤 进入官网 组件 | Element UI F12进入控制台,找到 ...

  10. Html | Vue | Element UI——引入使用

    前言 做个项目,需要一个效果刚好Element UI有,就想配合Vue和Element UI,放在tp5.1下使用,但是引入在线的地址各种报错,本地引入就完美的解决了问题! 代码 __STATIC_J ...

随机推荐

  1. CSS & JS Effect – Image Overlay

    介绍 一张背景图, 一行写字, 一层黑影 (Image Overlay), 如果没有做黑影, 字的颜色容易和图片撞, contrast 就会很烂. HTML 结构 <div class=&quo ...

  2. Spirng Aop 实现自定义注解及实现

    需求:日志记录 需要记录当前用户访问的每个接口对应的前端页面功能信息 声明一个注解 @Documented @Retention(RetentionPolicy.RUNTIME) @Target({E ...

  3. Blazor 子组件与父组件通过 ChildEvents 传递数据的方法

    想要实现 Blazor 子组件向父组件传递数据, 参考 痴者工良的博文所描述的方式, .Net 5.0 下编译未能通过, 于是先修改一下, 简化为光触发事件通知而不传值 子组件 Child.razor ...

  4. android 代码如何增加atrace跟踪

    在 Android 代码中增加 Atrace 跟踪,可以使用 Android 提供的 android.os.Trace 类.这允许你在应用代码中手动添加自定义的跟踪点,以捕获特定代码段的执行情况.以下 ...

  5. 关于BarchNorm的一些学习

    <Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift> ...

  6. iOS多态使用小结

    多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个tableView,它有多种cell,cell的UI ...

  7. ADO.NET 和 ORM的区别

    ADO: 1 大量的Sql语句-业务不同,Sql语句不同 2 需要根据不同的场景编写不同Sql语句-灵活去编写Sql语句-提前优化Sql 语句-提供高性能的Sql语句 3 不适合快速开发 4 可编程性 ...

  8. 警告:攻击者利用 SnoarQube 漏洞盗取国内多个机构的大量源码!

    2021 年 10 月 22 日,国外知名媒体 cybernews 发文称,有未知攻击者攻击并渗透了博世 iSite 的服务器,并盗取了这家制造业巨头的 5G 物联网连接平台的源代码. 攻击者声称通过 ...

  9. 布局(LinearLayout,RelativeLayout,FrameLayout,TableLayout,GridLayout,ConstraintLayout)

    LinearLayout layout_gravity:组件在父容器里的对齐方式 gravity:组件包含的所有子元素的对齐方式 layout_weight:在原有基础上分配剩余空间,一般把layou ...

  10. 修改Linux服务的文件打开句柄数

    在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 在centos 5/6 等 ...