浅谈让 layui table 固定列也能监听滚动的方法

目前table能滚动的区域是layMain这个区域,他会联动的去滚动表头和固定列,左右固定列实际他们本身的样式overflow是hidden的,所以本身不会出现滚动条,也就是说你把鼠标移动到左右固定列上去的话,它是无法被滚动的,比如下面这个效果图

1.gif

当然这个不是一两个样式就能搞定的事情,不然也就不需要整个帖子了,受限于layui table的实现方式特别是表头固定和左右列固定的实现方法,基本说只添加一两个css应该是处理不了的。

目前我的处理方式有几步:

第一步就是在特定的时候要让固定列区域下的tbody是可滚动的,这样子才能去监听由用户鼠标操作的滚动

这个一般可以利用一个css的hover来出来

1.png

但是,这个只是开头中的开头,还需要一些辅助处理,不然出来的结果就会是下面这样子的

2.png

辅助处理呢,这个得先了解以下table目前的固定列的一些样式,比如如果有滚动条的话他会计算出来滚动条的宽度,然后有固定列的right就是根据这个值去得出来一个值,具体要看滚动条的宽度了。

如果内容少没有滚动的那么他的right就是-1,所以一般来说就是在hover的时候要给它right:0,让它跟内容的容器的滚动条重叠,看着就像什么也没变化一样但是实际是固定列的tbody也给加了可以滚动的支持了,

3.png

这里不能直接hover的时候就right:0,上面说了,不需要滚动的时候他本来是-1所以如果不管什么时候hover他都是0的话在不需要滚动的时候就会异常的跳一下,那么这个标记怎么来的?这个是通过js事件在鼠标移入的时候就判断是有需要,在需要的情况下就给mark一下大致如下:

4.png

到这里一般就可以滚动了效果如下:

2.gif

第二步,接下来重头的就是要处理跟实际内容的同步滚动了

一般来说就是监听scroll然后让layMain跟着滚动,但是!实际情况定然不会这么简单,因为原始的layMain的滚动事件就已经同步的让固定列去滚动了,这个滚动也会触发你加到固定列的滚动监听。

那么就会出现1212121212121212....这样循环下去,当然滚动的还好一些它不会出现死循环,要是发现没有滚动位置他也就停了,但是会大大的使得很难滚动一样,就是变龟速了,因为滚动一下改变了对方对方反过来也会影响己方这样如是反复。

那么如何处理,还是前面的套路,就是在特殊的情况下给个标志,然后在固定列滚动的监听中根据这个标志去决定是否要同步对方,反过来也是,layMain的滚动也得看情况同步,大致的代码如下

5.png

最后的效果:

3.gif

第三步, 然后是处理左固定的相关样式

因为追求跟鼠标没悬浮上去一样,也就是说左边的要是一个看不到滚动条但是有能够监听到鼠标滚动的,做了一些特殊的处理:

6.png

样式

7.png

效果:

4.gif

最后这个修改就看怎么理解了,如果觉得要显示滚动条出来好的话就把最后的这步处理去掉就好了

测试页面: https://sun_zoro.gitee.io/layuitableplug/testTableCheckboxDisabled

注:以上代码中insObj是table.render内部new出来的表格实例,不是return回来的对象,所以以上代码是在tablePlug内部有效的,如果不想使用这个插件但是要做对应的处理的话,可以参考以上的逻辑,将insObj.layMain之类的换成对应的表格的jquery对象即可。

在tablePlugv0.1.6的版本中对这部分的一些逻辑进行了微调,主要就是将一些可以用事件委托的用事件委托的方式实现,一些能用其他的选择器比如:hover代替的就不用标记mark class的形式了,修改大概如下:

删除之前固定列的body鼠标移入移出的事件处理,

8.png

改用事件委托的方式:

9.png

联合滚动的时候采用是否hover的形式不用之前的mark了省得要加入和删除这个mark,最终效果一样

10.png


推荐文章
vue.js和layui一样么?

vue.jsVue(读音/vjuː/,类似于view)是一套用于构建用户界面的渐进式JavaScript框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,方

详解layui.layer独立组件

layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护、不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力。目前,laye

layui怎么隐藏表格行?

layui数据表格隐藏列在使用layui做数据表格的时候,插入的数据的id是不是一组连续的数字,那么就需要用到layui的cols的type属性。table.render({ elem:'#test'

layui怎么固定表格的表头?

步骤:1、设置两个table,第一个table有thead没有tbody,第二个table有tbody没有table;2、第二个table需要一个div包住,并设置宽高,可用绝对布局3、tr下的th和

详解layui模块化与非模块化的不同引用方式

layui模块化与非模块化的不同引用方式:1、模块化与非模块化的区别layui中有许多不同的内置模块,如弹出层、日期与时间选择器、分页等不同模块。模块化:使用时加载相应的模块。非模块化:一次性加载所有

浅谈layui中iframe跳转链接和页面按钮跳转相关问题

一、导航跳转iframe页面问题:关于layui的iframe嵌套页面的导航跳转页面问题,如下图所示可以看到效果:在模板页的导航代码: 所有商品 商品列表 商品属性 商品分类 添加 解决方案

layui弹窗如何禁止拉伸?

弹层组件文档-layui.layerayer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这数年来的坚持、不弃的执念,将那些不屑的眼光转化为应得的尊重,不断完善和维护、不断建设和提升社区服务

layui是基于vue的吗?

layui是一款采用自身模块规范编写的前端UI框架,遵循原生HTML/CSS/JS的书写与组织形式,门槛极低,拿来即用。其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到API的每一处细

layui怎么监听多个radio事件?

需求如下图:想要选中单选框3,是单选框3下的复选框全选如果面板信息不多的话,可以给每个单选框3添加一个固定的监听事件但是实际项目中,不仅仅只有两个,会有几十个,这时总不能绑定一个lay-filter,

layui表格中怎么显示图片?

layui的表格使用还是非常简单的,layui文档中已经非常详细,下面直接上代码了1、jsp代码 发布Banner 2、然后是js代码layui.use('table',function()

layui数据表格删除当前行的方法

数据表格如下:t2={ elem:'#test2', data:tableData2, page:false, width:$(parent.window).width()-50, cols:[[ {

前端layui框架快速上手

一、介绍在使用layui之前,我们先要了解一下layui是什么?我觉得用作者贤心的一句话来概括就好了:为后端程序员设计的前端框架。更加详细的描述是:这是一个封装了各种css和js、Ajax等等的前端框

layui开源么?

layui是免费开源的,layui是开源的模块化前端UI框架,而layAdmin和layIm是付费授权的。layui是一款采用自身模块规范编写的前端UI框架,遵循原生HTML/CSS/JS的书写与组织

layui open怎么更改按钮的颜色?

layuiopen中可以使用skin来设置按钮颜色。skin不仅允许你传入layer内置的样式class名,还可以传入您自定义的class名。这是一个很好的切入点,意味着你可以借助skin轻松完成不同

浅谈layui文件上传、预览及修改

单文件上传1、HTML 上传客服二维码 * 开始上传 温馨提示:每次最多上传一张图片,单张图片的大小不超过2MB 2、js部分varform=layui.for

浅谈layui数据表格的基础使用

表格展示神器之一:layui表格前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstraptable、layuitable、ea

浅谈layui标签输入框inputTags

layui标签输入框inputTags样式:目录结构:页面代码: inputTags layui.config({ base:'js/

layui算是前端框架吗?

layui首个版本发布于2016年秋,她区别于那些基于MVVM底层的UI框架,却并非逆道而行,而是信奉返璞归真之道。准确地说,她更多是为服务端程序员量身定做,你无需涉足各种前端工具的复杂配置,只需面对

浅谈layui中table.render的使用(附代码)

layui框架提供了丰富的内置模块,他们皆可通过模块化的方式按需加载,其中包括:layer、layDate、layPage、laytpl、table等。本篇文章给大家浅谈一下layui中table.r

浅谈Layui的时间选择框

Layui中时间格式的输入框:html代码: 选择日期: -- - js代码:layui.use(['layer','form','table','laydate'],function()