根据设计要求,需要在el-table每一行获得焦点与鼠标经过时,显示一个整行的阴影悬浮效果。于是尝试了如下写法:
/*其中,table-row-checkd是我自定义的焦点行添加类名,大家可以自己起名*/
.el-table tbody tr:hover,.el-table tbody tr.table-row-checked{
box-shadow: 0px 3px 10px 1px rgba(0,0,0,0.06)!important;
}
然而并没有什么效果。。。
起初以为是无法定位到元素,通过tr
|td
添加border
|background
测试检查都可以,给td
添加box-shadow
也完全没问题,就是tr
的box-shadow
没效果。。。/(ㄒoㄒ)/~~
通过查找资料,
box-shadow
对display:table-row
元素是不起作用的
尝试:
设计效果还是得实现的,本来想:既然不让我给tr添加阴影,那就给td加阴影实现效果。
结果发现:td的四条边都有阴影,tr整行会出现一块一块的,根本不是理想中的悬浮效果。而且查看了下box-shadow值的设置,在上下都有阴影的情况下,左右两边阴影是无法隐藏的,至少都要漏一条左右边
box-shadow:{内阴影|外阴影,X轴偏移,Y轴偏移,阴影大小,阴影面积,阴影颜色}
①那么如何给el-table行添加阴影呢?既然没有直接的添加方式,那就采用间接的方法。在这里,我通过伪元素来模拟tr阴影效果
②但是,这个方法有好处也有弊端
一、css设置
.el-table tbody tr.table-row-checked,.el-table tbody tr:hover{
position:relative;
background:#fff;
}
.el-table tbody tr.table-row-checked::after,.el-table tbody tr:hover::after{
position:absolute;
content:" ";
width:100%;
height:100%;
left:0;
background:transparent;
box-shadow:0 3px 10px 1px rgba(0,0,0,0.1);
}
附加解释:
①、运用子绝父相,既可以继承tr的宽高,又可以方便定位
②、content:" ";
,必须写(注意" "中间是空格),否则after元素无法渲染
③、left:0;
,因为after
默认渲染在tr末尾之后,left:0;
会将after
覆盖在tr
上
二、弊端
给el-table行加阴影的问题算是解决了,但是却导致表格内容无法操作(如果表格内没有按钮、超长显示之类的需求,以下内容就不需要看了)
1、通常,项目设计中,el-table会带一些按钮,比如删除、编辑某行数据等要求。由于after
将tr覆盖,这些按钮也会被覆盖
2、如果用到show-overflow-tooltip
这个属性,同以上原理也会被遮挡操作
三、弊端解决
1、2解决:
对于需要点击等操作的列,就不能按以下这样的普通方式了:
<el-table-column prop="loginDate" label="登录时间">el-table-column>
需要将内容用template重新包装
html:
<el-table :row-class-name="rowChecked" @row-click="getRow" tooltip-effect="light">
<el-table-column label="登录时间" :show-overflow-tooltip="true">
<template v-slot="scope">
<span class="edit-tr" @click="toUserDetail(scope.row)">{{scope.row.loginDate}}span>
template>
el-table-column>
el-table>
附加解释:
①、:show-overflow-tooltip="true"
,如果el-table内td
的内容超长,则显示英文省略号,并且鼠标移入该单元格弹出气泡,气泡中显示单元格内容;
②、tooltip-effect="light"
,设置弹出气泡的风格,默认dark
(黑色气泡)。这里设置light会将气泡背景变为白色
③、如果el-table-column内用到,并在template中处理数据,那么在
标签内写不写prop都不会有影响
CSS:
.edit-tr{
position:relative;/*重点*/
z-index:2;/*重点*/
width:100%;
overflow:hidden;
text-overflow:ellipsis;
}
四、其他问题
在滑动时固定列如果出现底部内容穿透现象,请检查是否修改了.el-table tr
的默认设置(background-color:#FFFFFF),如果改为transparent
则会出现这样的问题。
五、补充优化
之前的效果有人反映悬浮阴影不明显,和原设计图图对比,每行左右两边的阴影被遮挡,毕竟tr有tbody\table等父元素,被遮挡没有直接的解决办法。
但是,由于新添加的伪元素使用定位,实现左右阴影是可以的。
以下重写对新增after
的样式
.el-table tbody tr.table-row-checked::after,.el-table tbody tr:hover::after{
position:absolute;
content:" ";
width:calc(100% - 6px);/*改动处*/
height:100%;
left:3px;/*改动处*/
background:transparent;
box-shadow:0 3px 10px 1px rgba(0,0,0,0.1);
}
解释:
将after
宽度预留出左+右阴影区域宽度,并向左偏移一点距离,这样就能将原先遮挡的左右阴影显示出来(设计图对el-table行左右两端无border情况下效果更佳)
建议:
我的项目中,对tr上下有border,左右无border,本来想把上下的阴影也放到tr内,但发现上下在border影响下视觉会有一种上下内阴影的效果,所以after的高度还采用和tr高度一致,仅对左右进行处理。
如果你的tr上下左右都有border,这种情况下,四边做内阴影突出焦点行是一种不错的选择