table 列可拖动 前端实现

drag.js

var h = $('#headTable th').height();
$('.arrow-up').css({
  'margin-top': h
});

var flag = false;
$('#headTable th').unbind('mousedown');
$('#headTable th').mousedown(function() {
  let startIndex = $(this).index();
  let endIndex;
  flag = true;
  $('#info').css({
    display: 'block'
  });
  //$('#triangle').css('display', 'block');
  $('body').addClass('no-select-text');
  $('#info').html($(this).html());
  $(document).mousemove(function(e) {
    if (flag) {
      var e = e || window.event;
      var x = e.clientX + 5 + 'px';
      var y = e.clientY + 5 + 'px';
      $('#info').css({
        left: x,
        top: y
      });
      if (e.preventDefault) {
        e.preventDefault();
      }
      return false;
    }
  });

  $('table td,th').mouseenter(function() {
    endIndex = $(this).index();
    if (endIndex == startIndex) {
      $('#triangle').css('display', 'none');
    } else {
      $('#triangle').css('display', 'block');
    }
    var offsetW = 0;
    var preTd = $(this).prevAll();
    $.each(preTd, function(id, item) {
      offsetW += item.offsetWidth;
    });
    if (endIndex > startIndex) {
      offsetW += $(this)['0'].offsetWidth;
    }
    $('#triangle').css({
      top: 0,
      left: offsetW + 4
    });
    if (endIndex !== startIndex) {
      changes();
    }
  });

  function changes() {
    if (endIndex < startIndex) {
      $('#mainTable tr').each(function(i) {
        $('#mainTable tr:eq(' + i + ') td:eq(' + endIndex + ')').before(
          $('#mainTable tr:eq(' + i + ') td:eq(' + startIndex + ')').clone(true)
        );
        $(
          '#mainTable tr:eq(' + i + ') td:eq(' + (startIndex + 1) + ')'
        ).remove();
        $('#headTable tr:eq(' + i + ') th:eq(' + endIndex + ')').before(
          $('#headTable tr:eq(' + i + ') th:eq(' + startIndex + ')').clone(true)
        );
        $(
          '#headTable tr:eq(' + i + ') th:eq(' + (startIndex + 1) + ')'
        ).remove();
      });
    } else if (endIndex > startIndex) {
      $('#mainTable tr').each(function(i) {
        $('#mainTable tr:eq(' + i + ') td:eq(' + endIndex + ')').after(
          $('#mainTable tr:eq(' + i + ') td:eq(' + startIndex + ')').clone(true)
        );
        $('#mainTable tr:eq(' + i + ') td:eq(' + startIndex + ')').remove();
        $('#headTable tr:eq(' + i + ') th:eq(' + endIndex + ')').after(
          $('#headTable tr:eq(' + i + ') th:eq(' + startIndex + ')').clone(true)
        );
        $('#headTable tr:eq(' + i + ') th:eq(' + startIndex + ')').remove();
      });
    }

    startIndex = endIndex;
  }

  $(document).mouseup(function() {
    flag = false;
    $('#triangle').css('display', 'none');
    $('#info').css({
      display: 'none'
    });

    $(document).unbind('mousemove');
    $(document).unbind('mouseup');
    $('table td,th').unbind('mouseenter');
  });
});

index.html

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>可随意拖动table表格列来改变列的位置</title>
    <style type="text/css">
      .no-select-text {
        user-select: none;
        -moz-user-select: none;
        -webkit-user-select: none;
      }

      #headTable td {
        border-bottom: 0px;
        cursor: all-scroll;
      }

      #mainTable td {
        width: 77px;
        border-top: 0px;
      }

      #info {
        background: #eee;
        border: 1px solid #eee;
        width: 100px;
        height: 30px;
        position: absolute;
        top: 0;
        left: 0;
        display: none;
      }

      .arrow {
        width: 10px;
        height: 10px;
        position: relative;
        /*display: inline-block;*/
        /*margin: 10px 10px;*/
      }

      .arrow:before,
      .arrow:after {
        content: '';
        border-color: transparent;
        border-style: solid;
        position: absolute;
      }

      .arrow-up:before {
        border: none;
        background-color: red;
        height: 50%;
        width: 30%;
        top: 50%;
        left: 35%;
      }

      .arrow-up:after {
        left: 0;
        top: -50%;
        border-width: 5px 5px;
        border-bottom-color: red;
      }

      .arrow-down:before {
        border: none;
        background-color: red;
        height: 50%;
        width: 30%;
        top: 0;
        left: 35%;
      }

      .arrow-down:after {
        left: 0;
        top: 50%;
        border-width: 5px 5px;
        border-top-color: red;
      }

      #triangle {
        display: none;
        position: absolute;
        top: 0px;
        left: 4px;
      }
    </style>
  </head>

  <body class="no-select-text" style="">
    <div id="main">
      <!-- <table
        border="1"
        cellpadding="0"
        cellspacing="0"
        style="width:400px;text-align:center;"
      >
        <tbody>
          <tr style="background-color: #E5E5E5">
            <td>5</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
            <td>1</td>
          </tr>
        </tbody>
      </table> -->
      <table
        id="mainTable"
        border="1"
        cellpadding="0"
        cellspacing="0"
        style="width:400px;text-align:center;"
      >
        <thead id="headTable">
          <tr>
            <th>5</th>
            <th>2</th>
            <th>3</th>
            <th>4</th>
            <th>1</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>
              <div style="color:red;">
                ten<span style="display:none">123</span>
              </div>
              10
            </td>
            <td>7</td>
            <td>8</td>
            <td>9</td>
            <td>6</td>
          </tr>
          <tr>
            <td>
              <div style="color:red;">
                ten<span style="display:none">123</span>
              </div>
              10
            </td>
            <td>7</td>
            <td>8</td>
            <td>9</td>
            <td>6</td>
          </tr>
          <tr>
            <td>
              <div style="color:red;">
                ten<span style="display:none">123</span>
              </div>
              101
            </td>
            <td>71</td>
            <td>81</td>
            <td>91</td>
            <td>61</td>
          </tr>
        </tbody>
      </table>
      <div id="info" style="display: none; left: 301px; top: 26px;">4</div>
      <div id="triangle" style="display: none; top: 0px; left: 255px;">
        <div class="arrow arrow-down"></div>
        <div class="arrow arrow-up" style="margin-top: 22px;"></div>
      </div>
    </div>

    <script type="text/javascript" src="./jquery-1.8.3.min.js"></script>
    <script type="text/javascript" src="./drag.js"></script>
  </body>
</html>

原文地址:https://www.cnblogs.com/yzyh/p/11447353.html

时间: 2024-11-05 16:24:57

table 列可拖动 前端实现的相关文章

Bootstrap Table列宽拖动的方法

在之前做过的一个web项目中,前端表格是基于jQuery和Bootstrap Table做的,客户要求能利用拖动改变列宽,为了总结和备忘,现将实现的过程记录如下: 1.Bootstrap Table可拖动,需要用到它的Resizable扩展插件,具体可见bootstrap-table的官方文档链接:http://bootstrap-table.wenzhixin.net.cn/zh-cn/extensions/ 进入之后,找到Resizable插件,点击Home进入github可以找到详细的用法

element-ui 实现table整列的拖动

演示地址 1. 先动态渲染表头,给每一个表头添加一个class=virtual 的画虚线的类名,同时给每个表头加上鼠标点击.拖动.抬起事件:mousedown->mousemove->mouseup. 2. 点击时确定点击的哪个,拖动的时候确定拖动的方向,抬起的时候确定放在的位置. 3. 改变数据实现拖动完成效果. <html lang="en"> <head> <meta charset="UTF-8"> <m

Table列展开与收起Demo

导读: 此文章用于实现列的隐藏或显示 用的jquery,vue 或 react 思路一致,事件改变数据,数据影响视图~ <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0&q

EasyUI datagrid 列宽度拖动问题

问题:拖不动或者偶尔能拖动,拖动不按指定? 原因:列宽度绑定的时候使用的百分比; 方法:获取总宽度,经过百分比计算在绑定

easyUI的汇总列,在前端生成

1.easyUI初始化,启用汇总列,showFooter:true 2.后台json有默认的footer的值 {"total":28,"rows":[ {"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Lar

JS获取table列数据

/** * js 获取按钮所在行每一列的数据,返回包含每一列数据的数组 * @param node * @returns {Array} */ function getTableTdValue(node) { // 按钮在td里面,其父节点的父节点是tr. var tr = node.parentNode.parentNode; var trArray = new Array(); for(var i=0; i<tr.cells.length; i++){ trArray[i] = tr1.ce

layui table 列宽百分比显示

var layer = layui.layer, form = layui.form, table = layui.table; var $ = layui.$; /*select gysmc,zyzw ,xm ,sjhm ,bgshm ,emilyx , zgsrgzwsj ,zggsgl ,cast(gysxxid as int) as gysxxid, pc, gysryxxMdataID as ID,sjbs from gysryxxMdata*/ var tableInit = tab

Oracle字符串转成Table列

目录导航: 1. 使用正则表达式 2. 借助DB Function实现 1.使用正则表达式 WITH tb AS (SELECT '0,1,2,3,4,5,6,7,8' i_name FROM dual) SELECT regexp_substr(i_name, '[^,]+', 1, LEVEL) COLUMN_VALUE FROM tb CONNECT BY PRIOR dbms_random.value IS NOT NULL AND LEVEL <= length(i_name) - l

Web前端笔试面试题汇总(转自github)

前言 本文总结了一些优质的前端面试题(多数源于网络),初学者阅后也要用心钻研其中的原理,重要知识需要系统学习,透彻学习,形成自己的知识链.万不可投机取巧,只求面试过关是错误的! 面试有几点需注意: 1.面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑.深度↑.方     向↑. 2.题目类型: 技术视野.项目细节.理论知识题,算法题,开放性题,案例题. 3.进行追问: 可以确保问到你开始不懂或面试官开始不懂为止,这样可以大大延     展题目的区分度和深度,知道你的实际能力.因为这种关