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 ...
随机推荐
- CSS – 单侧环境 (stylelint, prettier, tailwind)
前言 真实项目中, 通常搭配 Webpack 之类的工具使用: Webpack 学习笔记 这篇记入的是单元测试的环境 参考: Get started with Tailwind CSS Automat ...
- MyBatis——案例——环境准备
配置文件完成增删改查 准备环境 数据库表 tb_brand -- 创建tb_brand表 create table tb_brand( id int primary k ...
- Java Pom两个模块需要互相引用怎么办
1. Java POM模块化是什么 在Java项目中,特别是在使用Maven作为构建工具时,"POM模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小.更易于管理的模块(或 ...
- 字节跳动的多平台绽放秘诀 | Flutter 开发者故事
字节跳动旗下运营着一系列成功的用户产品.企业应用以及服务,覆盖信息.教育.娱乐等不同领域.随着产品阵容的不断发展,传统的原生双平台开发已经难以满足团队更高效.更灵活.更精美,以及更多样的产品研发需求. ...
- redisson内存泄漏问题排查
问题描述 最近生产有个服务突然出现频繁告警,接口P99响应时间变长,运维同学观察到相应的pod cpu飙升,内存占用很高. cpu升高问题排查是老生常谈的话题了,一般可以使用top -p pid -H ...
- .NEET跨平台绘图基础库--SkiaSharp
SkiaSharp 是一个跨平台的 2D 图形 API,用于 .NET 平台,基于 Google 的 Skia 图形库.它提供了全面的 2D API,可以在移动.服务器和桌面模型上渲染图像.SkiaS ...
- Spring技术书的代码资源下载
我是清华社编辑,这些资源获得作者授权,免费提供给读者个人学习使用.禁止任何形式的商用. 二维码用微信扫,按提示填写你的邮箱,转到电脑上打开邮箱下载.清华国企网盘,比较快速.安全.放心下载. 百度网盘链 ...
- 在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题
之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题.这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过 ...
- excel江湖异闻录--修迪斯.嗦狸
因为技术出类拔萃,同学都尊称他为"修神",修神的python.vba.Javascript.java.数据库.批处理等众多编程语言都是极强的,以笔者的见识来判断,大佬的vba已经是 ...
- 七张图看懂 Linux profiling 机制
1 图 1 Linux profiling 手段一览 软件埋点: 手动埋点:主动调用 trace 函数来实现埋点. Android systrace 即是这样一个例子,如图 2 和 图 3 所示 自动 ...