用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例

yizhihongxing

首先我们需要明确一下需求,我们的目标是实现一个可以调整table单元格高宽并且兼容合并单元格的功能。接下来,我会按照以下顺序来详细讲解具体的实现过程:

  1. HTML结构
  2. CSS样式
  3. JS实现

1. HTML结构

我们需要在HTML中使用table标签,同时要注意设置table的class属性和id属性,以便于后续进行操作。下面是一个简单的HTML结构示例:

<table class="table-adjust" id="table-demo">
  <thead>
    <tr>
      <th>姓名</th>
      <th>年龄</th>
      <th>城市</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="2">张三</td>
      <td>25</td>
      <td>北京</td>
    </tr>
    <tr>
      <td>180cm</td>
      <td>70kg</td>
    </tr>
    <tr>
      <td>李四</td>
      <td>30</td>
      <td>上海</td>
    </tr>
  </tbody>
</table>

2. CSS样式

接下来我们需要添加一些CSS样式,以便于界面的美化和交互效果的实现。在这里我们只需要添加一些基本的样式即可,例如设置表格宽度、表格单元格边框、表头样式等。下面是一个简单的CSS示例:

.table-adjust {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid #ccc;
}

.table-adjust th,
.table-adjust td {
  border: 1px solid #ccc;
  padding: 10px;
}

.table-adjust th {
  background-color: #f5f5f5;
  font-weight: bold;
  text-align: center;
}

3. JS实现

最后是我们实现目标的核心部分,我们需要使用JS编写具体的代码。在这里我们需要实现两个主要功能,第一个是调整单元格宽度和高度的功能,第二个是兼容合并单元格的功能。

3.1 调整单元格宽度和高度

在这里我们需要用到鼠标拖拽事件来实现单元格的宽度和高度的调整。下面是一个基本的实现方式:

// 获取所有th和td元素
var tds = document.querySelectorAll('#table-demo th, #table-demo td');

// 遍历所有单元格,给每个单元格添加拖拽事件
for (var i = 0; i < tds.length; i++) {
  var td = tds[i];
  // 给单元格添加mousedown事件
  td.addEventListener('mousedown', function (e) {
    // 检查是否在单元格右下角的调整区域内
    var adjustAreaWidth = 5; // 右下角调整区域宽度
    var adjustAreaHeight = 5; // 右下角调整区域高度
    var tdRect = this.getBoundingClientRect(); // 获取单元格的位置和大小
    var x = e.pageX - tdRect.left; // 获取鼠标在单元格中的位置
    var y = e.pageY - tdRect.top;
    if (x > tdRect.width - adjustAreaWidth && y > tdRect.height - adjustAreaHeight) {
      // 如果在调整区域内,给单元格添加mousemove事件
      var initialWidth = tdRect.width;
      var initialHeight = tdRect.height;
      document.addEventListener('mousemove', adjustTdSize);
      document.addEventListener('mouseup', removeEventListener);
      // 定义mousemove事件处理函数
      function adjustTdSize(e) {
        // 计算单元格的新宽度和高度
        var newWidth = e.pageX - tdRect.left;
        var newHeight = e.pageY - tdRect.top;
        td.style.width = newWidth + 'px';
        td.style.height = newHeight + 'px';
      }
      // 定义mouseup事件处理函数
      function removeEventListener() {
        document.removeEventListener('mousemove', adjustTdSize);
      }
    }
  });
}

上面的代码通过给单元格添加mousedown事件来检查鼠标是否在单元格的右下角调整区域内。如果是,就给单元格添加mousemove事件来实现单元格大小的调整。

3.2 兼容合并单元格

兼容合并单元格的实现比较复杂,需要在多个方面进行考虑。以下是一个简单的示例代码:

// 获取所有th和td元素
var tds = document.querySelectorAll('#table-demo th, #table-demo td');

// 定义一个空数组,并以table的colspan和rowspan属性生成数组
var tableArr = [];
for (var i = 0; i < tds.length; i++) {
  var td = tds[i];
  var rowspan = td.getAttribute('rowspan') || 1;
  var colspan = td.getAttribute('colspan') || 1;
  for (var j = 0; j < rowspan; j++) {
    if (!tableArr[j]) {
      tableArr[j] = [];
    }
    for (var k = 0; k < colspan; k++) {
      tableArr[j][k] = td;
      if (!(j === 0 && k === 0)) {
        // 将非左上角的单元格的display属性设置为none,以免重复显示
        td.style.display = 'none';
      }
    }
  }
}

// 给单元格添加鼠标滑过事件
for (var i = 0; i < tds.length; i++) {
  var td = tds[i];
  td.addEventListener('mouseover', function () {
    // 获取当前单元格在数组中的位置
    var tdRect = this.getBoundingClientRect();
    var x = tdRect.left + tdRect.width;
    var y = tdRect.top + tdRect.height;
    var row = -1;
    var col = -1;
    for (var i = 0; i < tableArr.length; i++) {
      if (y >= tableArr[i][0].getBoundingClientRect().top && y <= tableArr[i][0].getBoundingClientRect().bottom) {
        row = i;
        break;
      }
    }
    for (var i = 0; i < tableArr[row].length; i++) {
      if (x >= tableArr[row][i].getBoundingClientRect().left && x <= tableArr[row][i].getBoundingClientRect().right) {
        col = i;
        break;
      }
    }
    // 将左上角的单元格的display属性设置为初始值(即显示)
    tableArr[row][col].style.display = '';
    // 将当前单元格左边和上面的单元格的display属性都设置为none,以免重复显示
    for (var i = 0; i < col; i++) {
      tableArr[row][i].style.display = 'none';
    }
    for (var i = 0; i < row; i++) {
      tableArr[i][col].style.display = 'none';
    }
  });
}

上面的代码通过以table的colspan和rowspan属性生成一个二维数组tableArr来实现合并单元格的功能。同时,我们还需要给每个单元格添加mouseover事件来监控鼠标滑过的位置,并根据位置来判断应该显示哪些单元格。这里需要注意的是,我们应该将单元格的display属性设置为-none,以便于后面重复的单元格不会重复显示。

综上所述,我们可以通过上面的代码来实现一个高度自定义和兼容性较好的table单元格高宽调整和合并单元格的功能。当然,具体的实现方式可能还有很多种,以上只是其中的一种示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • 130个漂亮CSS布局站点参考

    130个漂亮CSS布局站点参考 简介 “130个漂亮CSS布局站点参考”是一个汇集了130个基于CSS的模板和布局的站点库,提供了多种类型的站点布局样式,方便用户对站点布局进行参考和借鉴。该站点库涵盖了多个行业和场景,包括博客、企业、电商和个人展示页等,让用户能够选择适合自己站点的布局样式。 使用方法 打开“130个漂亮CSS布局站点参考”网站 选择所需场景…

    css 2023年6月11日
    00
  • CSS小技巧 导航中鼠标经过变换文字的实现代码

    下面将详细讲解“CSS小技巧 导航中鼠标经过变换文字的实现代码”的完整攻略: 一、实现思路 该效果的实现思路是利用 CSS 选择器选择到鼠标经过时需要修改的文本元素,设置 :hover 伪类,然后修改文本相关的 CSS 属性。 二、代码实现 具体实现代码如下: <nav> <ul> <li><a href=&quot…

    css 2023年6月10日
    00
  • Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)

    下面是Vue CLI3移动端适配的完整攻略。 步骤1:创建Vue CLI3项目 首先,你需要创建一个Vue CLI3项目。可以使用如下命令: vue create my-project 根据提示,选择适合你的选项来搭建基本项目。 步骤2:安装所需插件 安装postcss-px2rem插件: npm install postcss-px2rem -D 安装li…

    css 2023年6月10日
    00
  • IE6下css设置容器高度的BUG不能小于某个值

    IE6下的css设置容器高度的bug是一个非常棘手的问题,它会导致无法通过css设置容器高度小于一定值。下面将详细讲解如何处理这个问题: 1. 问题原因 此问题是由于IE6下的布局模型造成的,IE6会默认采用IE5盒子模型来进行布局。在此模型中,元素的宽度和高度只包括内容(content)和内边距(padding),不包括边框(border)和外边距(mar…

    css 2023年6月10日
    00
  • css sprite原理优缺点及使用示例介绍

    CSS Sprite是一种web设计中比较流行的前端优化技术,它能从技术层面上减少网页的http请求次数,从而有效减轻服务器的负担,提高页面的加载速度和性能。下面来详细讲解CSS Sprite的原理、优缺点以及使用示例。 什么是CSS Sprite CSS Sprite是指将一个页面需要用到的小图标或者其他小图片合并成一张大图,再通过CSS的backgrou…

    css 2023年6月10日
    00
  • bootstrap学习心得总结-css样式设计分享

    Bootstrap学习心得总结-CSS样式设计分享 导语 Bootstrap是一款非常流行的前端开发框架,使用Bootstrap可以大大提升前端页面开发的效率。本文旨在通过分享我的Bootstrap学习心得总结和CSS样式设计经验,帮助初学者更快上手Bootstrap,同时也希望能够为有一定经验的开发者提供一些思路和方法。 Bootstrap基础 Boots…

    css 2023年6月11日
    00
  • jquery属性过滤选择器使用示例

    当我们使用 jQuery 选取元素时,可以使用属性选择器来选择具有指定属性的元素。属性过滤选择器是基于这种思路工作的。 属性过滤选择器 属性过滤选择器使用属性名称和可选匹配规则来匹配一个或多个元素。下面是一些常用的属性过滤选择器: [attribute]:选择具有指定属性的元素。 [attribute=value]:选择具有指定属性且属性值等于指定值的元素。…

    css 2023年6月10日
    00
  • JS+CSS实现精美的二级导航效果代码

    下面就是讲解“JS+CSS实现精美的二级导航效果代码”的完整攻略,希望能对你有所帮助。 简介 在前端开发中,常见的网站二级导航效果是用户先点击顶部的一级导航,在鼠标悬停/点击时,顶部导航会下拉出一个垂直的下拉菜单,展示二级导航的内容,并在用户离开导航时收起下拉菜单。这种效果通常需要通过JS和CSS结合实现。 实现步骤 首先创建一个HTML页面,用ul和li标…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部