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

首先我们需要明确一下需求,我们的目标是实现一个可以调整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日

相关文章

  • JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好…的验证)

    要实现JavaWeb表单的及时验证功能,在输入后立即验证,需要使用JavaScript技术。具体实现步骤如下: 1.编写HTML页面,定义表单元素。表单需要使用form标签包含所有表单元素。 2.在表单元素上添加事件监听器,使用JavaScript监听表单元素的onblur事件。onblur事件会在元素失去焦点时触发。 3.在事件监听器中,编写验证函数。例如…

    css 2023年6月9日
    00
  • CSS3实现伪类hover离开时平滑过渡效果示例

    针对“CSS3实现伪类hover离开时平滑过渡效果示例”的完整攻略,我将详细讲解以下内容: 1. 理解CSS3中的过渡效果(Transition) CSS3中的过渡效果,指的是当某个CSS属性(如width、height、opacity等)的值发生改变时,可以通过添加过渡效果,来实现平滑的过渡效果。具体而言: 首先,需要在CSS样式中通过transition…

    css 2023年6月10日
    00
  • css如何把元素固定在容器底部的四种方式

    在 Web 开发中,有时需要将元素固定在容器底部。这可以通过 CSS 来实现。下面是一个完整攻略,包含了 CSS 如何把元素固定在容器底部的四种方式和两个示例说明。 CSS 如何把元素固定在容器底部的四种方式 方式一:使用 position 和 bottom 属性 可以使用 position 属性将元素定位为绝对位置,并使用 bottom 属性将其固定在容器…

    css 2023年5月18日
    00
  • 详解CSS中postion和opacity及cursor的特性

    详解CSS中position、opacity及cursor的特性 position CSS中的position属性用于指定元素的定位方式。常用的取值有static、relative、absolute和fixed。其中,static是默认值,元素不存在定位(也就是正常流布局),不受top、right、bottom、left等属性的影响。relative与sta…

    css 2023年6月10日
    00
  • HTML外部引用CSS文件不生效原因分析及解决办法

    下面是详细讲解“HTML外部引用CSS文件不生效原因分析及解决办法”的攻略。 问题描述 在开发网站过程中,我们通常会使用CSS样式来美化网站。其中一种方式是在HTML文件中引用外部的CSS文件。但是有时候我们会发现引入的CSS文件并不生效,这就出现了问题。 问题分析 引入CSS文件不生效的原因很多,下面介绍一些常见原因: 1.路径错误 如果引用的CSS文件路…

    css 2023年6月9日
    00
  • CSS背景图拉伸效果兼容FF/Chrome/IE等主流浏览器(亲测)

    首先我们来讲一下如何用CSS实现背景图的拉伸效果,这个效果可以让背景图随着浏览器窗口大小的变化而自动拉伸,从而达到更好地适应不同设备的效果。具体步骤如下: 首先,需要设置html和body元素的高度为100%。这可以通过以下CSS样式实现: html, body { height: 100%; } 这个设置是为了保证后面的背景图能够充满整个窗口。 接下来,需…

    css 2023年6月9日
    00
  • jquery+css3实现的经典弹出层效果示例

    下面是jquery+css3实现的经典弹出层效果示例的完整攻略: 一、什么是弹出层 弹出层是一个浮动在当前页面上方的布局,用于展示额外的信息、表单以及对话框等,常用于用户登录、注册、购物车、提示弹窗等。通常开发者在前端页面中使用div容器实现弹出层的效果,可以通过CSS设置弹出框的大小、位置、背景等等,而jQuery则可以方便地对弹出框进行控制。 二、利用j…

    css 2023年6月9日
    00
  • BAT及各大互联网公司2014前端笔试面试题(Html,Css篇)

    BAT及各大互联网公司2014前端笔试面试题(Html,Css篇)是一份经典的前端笔试面试题目集,包含了许多常见的 HTML 和 CSS 技术问题。本文将提供一份完整攻略,包括题目解析、示例说明和代码实现。 题目解析 1. 如何实现一个三角形? 可以使用 CSS 的 border 属性来实现一个三角形。具体方法是将元素的宽度和高度设为 0,然后设置 bord…

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