在普通 JavaScript 中调整表格大小而不影响定位

2024-04-05

我试图调整第一个元素的大小,而不影响行中下一个元素的位置,例如,我希望第一个元素的宽度会影响下一个元素的宽度,从而不会将其推到左侧。

这是我已经有了的代码。

    (function () {
    var thElm;
    var startOffset;

    Array.prototype.forEach.call(
      document.querySelectorAll("table th"),
      function (th) {
        th.style.position = 'relative';

        var grip = document.createElement('div');
        grip.innerHTML = " ";
        grip.style.top = 0;
        grip.style.right = 0;
        grip.style.bottom = 0;
        grip.style.width = '5px';
        grip.style.position = 'absolute';
        grip.style.cursor = 'col-resize';
        grip.addEventListener('mousedown', function (e) {
            thElm = th;
            startOffset = th.offsetWidth - e.pageX;
        });

        th.appendChild(grip);
      });

    document.addEventListener('mousemove', function (e) {
      if (thElm) {
        thElm.style.width = startOffset + e.pageX + 'px';
      }
    });

    document.addEventListener('mouseup', function () {
        thElm = undefined;
    });
})();

我的代码的工作示例。

(function () {
    var thElm;
    var startOffset;

    Array.prototype.forEach.call(
      document.querySelectorAll("table th"),
      function (th) {
        th.style.position = 'relative';
    
        var grip = document.createElement('div');
        grip.innerHTML = " ";
        grip.style.top = 0;
        grip.style.right = 0;
        grip.style.bottom = 0;
        grip.style.width = '5px';
        grip.style.position = 'absolute';
        grip.style.cursor = 'col-resize';
        grip.addEventListener('mousedown', function (e) {
            thElm = th;
            startOffset = th.offsetWidth - e.pageX;
        });
    
        th.appendChild(grip);
      });

    document.addEventListener('mousemove', function (e) {
      if (thElm) {
        thElm.style.width = startOffset + e.pageX + 'px';
      }
    });

    document.addEventListener('mouseup', function () {
        thElm = undefined;
    });
})();
table {
    table-layout: fixed;
    width: 100px;
    border-width: 1px;
    border-style: solid;
    border-color: black;
    border-collapse: collapse;
    overflow-x: auto;
}

table tr {
  box-sizing: content-box;
}

table th {
    height: 50px;
    width: 20px;
    border-width: 1px;
    border-style: solid;
    border-color: black;
    box-sizing: border-box;
    user-select: none;
}
  <table>
      <thead>
          <tr style="width: 100%;">
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 3</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
              <th style="width: 300px">th 1</th>
              <th style="width: 150px">th 2</th>
          </tr>
      </thead>
  </table>

codepen https://codepen.io/yehudz/pen/KyqzKm

Thanks!


嘿伙计们我明白了。这是代码。

resizeable() {
let startOffset;

let thElements = this.container.querySelectorAll("th");

for(let i = 0; i < thElements.length; i++) {
  let currentElement = thElements[i];
  currentElement.style.position = 'relative';

  let grip = document.createElement('div');
  grip.innerHTML = "&nbsp;";
  grip.style.top = 0;
  grip.style.right = 0;
  grip.style.bottom = 0;
  grip.style.width = '5px';
  grip.style.position = 'absolute';
  grip.style.cursor = 'col-resize';

  currentElement.appendChild(grip);

  EventManager.on(grip, 'mousedown', (e)=> {
    let nextItem = thElements[i + 1];
    let currentElement = thElements[i];
    let originalNextItemWidth = nextItem.getBoundingClientRect().width;
    let originalCurrentItemWidth = currentElement.getBoundingClientRect().width;

    startOffset = currentElement.offsetWidth - e.pageX;


    EventManager.on(document.body, 'mousemove', (e)=> {

      // Subtract that difference from the next items width
      if (currentElement) {
        currentElement.style.width = startOffset + e.pageX + 'px';

        let offset = originalCurrentItemWidth - currentElement.getBoundingClientRect().width;
        nextItem.style.width = (originalNextItemWidth + offset) + 'px';

      }
    });
  });

  EventManager.on(document.body, 'mouseup', (e)=> {
    EventManager.off(document.body, 'mousemove');
    currentElement = null;
  });
}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在普通 JavaScript 中调整表格大小而不影响定位 的相关文章

  • 打开图层地图,经纬度获取地址

    我正在尝试获取带有经度和纬度的地址 城市 邮政编码 街道地址 但我不知道如何获取 我正在使用开放图层 当我单击地图的一部分时 会获取该位置的经度和纬度 有人有解决方案吗 div class map div
  • 封装的闭包与类?

    我是 JS 来自 C etc 的新手 我突然想到闭包似乎是比类更简单 更方便的处理封装的方法 这段代码似乎给出了一种处理封装的简单方法 function addProperty o var value o get function retu
  • 如何在D3中导入json数据?

    如何在D3中导入json文件 I did d3 json temp json 但是我如何在进一步的代码中访问这个数据集呢 到目前为止我已经尝试过 var data d3 json temp json 但使用 data data 在其余代码中
  • TypeScript 中类似字典的对象应使用什么类型?

    在 TypeScript 中 我有时会使用期望 或返回 对象的函数 其中这些对象被视为字典 基本上我的问题是 这里使用的正确类型是什么 我可以用 Record
  • Chrome DevTools 脚本黑盒不起作用

    我正在尝试使用 chrome devtools 的新功能 黑盒脚本 这篇 Chrome Devtools 文章列出了脚本黑盒功能 https developer chrome com devtools docs blackboxing wh
  • Postman如何发送请求? ajax,同源策略

    我发现了这个非常有用的 Chrome 扩展程序 名为 Postman 这是一个非常有用的扩展 特别是当您正在编写 RESTful 应用程序时 我感到困惑的一件事是这个插件 扩展如何能够在不同的域上成功发送 POST 请求 我尝试像这样使用
  • 如何在alert()之后给予focus()?

    我有类似的东西
  • RxJS 将三元组中的属性组合到表中

    我有一项服务生成类似于三元组的对象 它们将采用以下格式 country attribute value Example country usa attribute population value 100 country mexico at
  • JavaScript 中 == 和 === 的区别[重复]

    这个问题在这里已经有答案了 有什么区别 and 在 JavaScript 中 我也见过 and 运营商 还有更多这样的运营商吗 看看这里 http longgoldenears blogspot com 2007 09 triple equ
  • HTML5:从存储的二进制字符串播放视频

    我正在尝试使用 FileReader readAsBinaryString Blob File 将视频文件的内容作为二进制字符串读取 如示例中所示http www html5rocks com en tutorials file dndfi
  • JavaScript 排序列表

    Javascript 或 jQuery 中有排序列表吗 我有一个巨大的列表 随着时间的推移 插入操作很少 每次添加单个项目时 我无法为整个列表调用 object sort 我需要插入 o log n 不 没有 你拥有的只是Array sor
  • Bootstrap 中的垂直菜单

    有没有办法使用任何引导类来创建垂直菜单 不是下拉菜单 侧边栏上完全独立的垂直菜单 我可以使用我的 css 创建一个 但只是想知道引导程序中是否有任何内置类 或者可以使用顶部栏通过任何 hack 来完成吗 这个问题现在已经很老了 但如果有人看
  • 如何从对象 URL 获取文件或 blob?

    我允许用户通过拖放和其他方法将图像加载到页面中 当图像被删除时 我正在使用URL createObjectURL转换为对象 URL 以显示图像 我不会撤销该网址 因为我会重复使用它 所以 当需要创建一个FormData对象 以便我可以允许他
  • 脚本和链接标签的简写 http:// 为 // ?有人以前看过/用过这个吗?

    问题如下 如果您使用 addthis 共享按钮 查看任何网站 一旦您浮动在 addthis 按钮上 并且加载了所有必需的资源 请使用 firebug 或 chrome 检查器查看文档的正文 不是源代码 而是屏幕上的实际文档 对象检查器 你会
  • 监听鼠标事件……除了 div 的溢出:滚动滚动条?

    关于如何监听 mousedown 的任何建议 document exceptdiv 的溢出 滚动滚动条 我不确定滚动条是什么元素is为了参考它 您可以使用以下命令自行检查目标 document on mousedown function e
  • Dojo 是否可以与其他 JS 框架结合?

    我们使用 Dojo 1 9 3 作为构建单页面应用程序的 JS 框架 然而 我们在 Dojo 的怪癖上花费了太多时间 因此即使是简单的任务也需要很长时间才能实现 由于缺乏适当的文档 我们经常不得不求助于阅读源代码 然后实施解决方法 我觉得如
  • 推荐的增长缓冲区的方法?

    假设我正在 Node js 中构造一个可变长度的字符串或一系列字节 buf write 的文档说 https nodejs org api buffer html buffer buf write string offset length
  • JavaScript 有内置的 stringbuilder 类吗?

    I see a few 代码项目解决方案 http www codeproject com KB scripting stringbuilder aspx 但是JavaScript中有常规的实现吗 如果您必须为 Internet Explo
  • Material-UI 中 IconButton 的悬停效果

    图标按钮悬停 https i stack imgur com lsYHX png 这是我正在使用的 Material UI 中的 iconButton 正如您所看到的 当您将鼠标悬停在图标上时 图标周围有一个轻微的灰色边框 禁用此功能的属性
  • @media查询和图像交换[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望在调整浏览器大小时网站中的图像完全改变 我一直在使用媒体查询 但我似乎无法正确使用它 有什么想法 建议吗 将来请添加您尝试过的代

随机推荐