首页 > 其他分享 >原生js实现表头拖拽效果

原生js实现表头拖拽效果

时间:2024-05-28 16:26:18浏览次数:9  
标签:scrollContainer endDrag scrollTableBox 表头 js drag table document 拖拽

使用原生js实现表头拖拽效果

方法独立jq,使用面向对象方法,可以改造成ts嵌入vue项目中或者拓展el-table表头固定,不影响el-table排序的拖拽问题

代码如下,有不足之处的请帮忙指出

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>原生实现table拖拽滚动</title>
    <style>
        .scrollTableBox {
            width: 100%;
            max-width: 300px;
            margin: auto;
            overflow-x: scroll;
        }

        .scrollTableBox table {
            width: 100%;
            border-collapse: collapse;
        }
        .scrollTableBox.dragActive table{
            user-select: none;
        }

        .scrollTableBox th,
        .scrollTableBox td {
            padding: 8px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }

        .scrollTableBox thead th {
            background-color: #f2f2f2;
            white-space: nowrap;
        }
    </style>
</head>

<body>
    <div class="scrollTableBox">
        <table class="scrollTable" id="scrollable" border>
            <thead>
                <tr>
                    <th>序号</th>
                    <th>产品</th>
                    <th>标题</th>
                    <th>型号</th>
                    <th>内容</th>
                    <th>备注</th>
                    <th>售前价格</th>
                    <th>活动价格</th>
                    <th>促销抵扣</th>
                    <th>积分</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                    <td>6</td>
                    <td>7</td>
                    <td>8</td>
                    <td>9</td>
                    <td>10</td>
                </tr>
                <tr>
                    <td>21</td>
                    <td>22</td>
                    <td>23</td>
                    <td>24</td>
                    <td>25</td>
                    <td>26</td>
                    <td>27</td>
                    <td>28</td>
                    <td>29</td>
                    <td>210</td>
                </tr>
                <tr>
                    <td>321</td>
                    <td>322</td>
                    <td>323</td>
                    <td>324</td>
                    <td>325</td>
                    <td>326</td>
                    <td>327</td>
                    <td>328</td>
                    <td>329</td>
                    <td>3210</td>
                </tr>
            </tbody>
        </table>
    </div>
    <script>
        class HeaderDraggable {
            constructor(scrollContainer) {
                this.isDragging = false;
                this.startX = 0;
                this.scrollLeft = 0;
                this.scrollContainer = scrollContainer;

                this.startDrag = this.startDrag.bind(this);
                this.drag = this.drag.bind(this);
                this.endDrag = this.endDrag.bind(this);
                if (this.scrollContainer) {
                    let thead = this.scrollContainer.querySelector('thead');
                    thead.addEventListener('mousedown', this.startDrag);
                }
            }
            startDrag(e) {
                this.isDragging = true;
                this.startX = e.pageX;
                this.scrollLeft = this.scrollContainer ? this.scrollContainer.scrollLeft : 0;
                this.scrollContainer.classList.add('dragActive');
                this.scrollContainer.style.cursor = 'grabbing';
                document.addEventListener('mousemove', this.drag);
                document.addEventListener('mouseup', this.endDrag);
            }

            drag(e) {
                if (!this.isDragging) return;
                const scrollX = this.startX - e.pageX;
                if (this.scrollContainer) {
                    this.scrollContainer.scrollLeft = this.scrollLeft + scrollX;
                }
            }
            endDrag() {
                this.isDragging = false;
                this.scrollContainer.classList.remove('dragActive');
                this.scrollContainer.style.cursor = 'auto';
                document.removeEventListener('mousemove', this.drag);
                document.removeEventListener('mouseup', this.endDrag);
            }
            cleanup() {
                if (this.scrollContainer) {
                    this.scrollContainer.removeEventListener('mousedown', this.startDrag);
                }
                document.removeEventListener('mousemove', this.drag);
                document.removeEventListener('mouseup', this.endDrag);
            }
        }
        const initTableScroll = () => {
            const table = document.querySelector('.scrollTableBox');
            if (!table) return;
            const headerDraggable = new HeaderDraggable(table);
        }
        initTableScroll()
    </script>
</body>

</html>

  

标签:scrollContainer,endDrag,scrollTableBox,表头,js,drag,table,document,拖拽
From: https://www.cnblogs.com/chengjunL/p/18218267

相关文章

  • 宏景eHR showmedia.jsp SQL注入漏洞复现
    0x01产品简介宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。0x02漏洞概述宏景eHRshowmedia.jsp接口处存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令,从而窃取数据库敏感信息。0......
  • NodeJs + GraphQl 基于Apollo Server (2)
     基于上一篇的项目继续深入学习和介绍项目中如何使用GraphQl.本篇更侧重于实际项目中使用GraphQL.如果还没有了解基本的GraphQl知识和没用想要新建项目开始演练的可从上一篇开始如何在NodeJs搭建GraphQLserviceApolloServer(1).1.重构app.js和service.mjs 1.1修改s......
  • js复制功能
    <divclass="content"></div><el-button@click="copy">复制</el-button>copy(){ letpList=document.querySelectorAll(".content") letvalueList=[] if(pList.length>0){ pList.forEach(......
  • notepad++ 将JSON压缩成一行与JSON格式化
    参考文档:https://blog.csdn.net/weixin_43684328/article/details/109528085实际只有两部:第一步: 第二步:  ####################下面是转发参考的内容#######################无需插件,正则替换即可如果json中含有空格不想替换时可以分别替换回车和制表符{"DAT......
  • Vue+OpenLayers7入门到实战:OpenLayers实现在地图上拖拽编辑修改绘制图形
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上拖拽编辑修改绘制图形。在前面一章中,我们已经学会了如何绘制基础的三种图形线段、圆形和多边形:《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地......
  • WPF DataGrid使用 自动显示行号、全选、三级联动、拖拽
    1.DataGrid的使用自动显示行号(修复删除行时行号显示不正确)  ViewCodedgTool.LoadingRow+=newEventHandler<DataGridRowEventArgs>(dgTool_LoadingRow);dgTool.UnloadingRow+=newEventHandler<DataGridRowEventArgs>(dgTool_UnloadingRow);voi......
  • json-server 快速搭建接口服务 使用教程
    json-server是一款小巧的接口模拟工具,一分钟内就能搭建一套Restful风格的API,尤其适合前端接口测试使用。只需指定一个json文件作为api的数据源即可,使用起来非常方便,30秒入门。进阶操作还支持分页,排序等操作,非常方便!开源地址主页地址:https://www.npmjs.com/package/js......
  • 基于SSM+JSP的学生公寓管理系统
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • js怎么保存用户登录信息?js cookie操作封装
    在web开发中,用户登录后需要保存登录信息进行身份识别,登录后的操作都需要带上身份信息请求接口。保存登录信息有多种方法,这里使用cookie进行操作。最终成果:封装cookie操作模块//utils/cookie.jsexportdefault{//设置cookiesetCookie:function(name,value,......
  • 【vue】dom元素拖拽指令
    directives.js:/***v-dialogDrag弹窗拖拽*@paramsoperate{String}拖拽项的data-drag-name*@paramsmove*/constdialogDrag={//el,binding,vnode,oldVnodeinserted(el,binding,vnode){const{operate,move}=binding.value;if(t......