表格中等宽单元格td之---获取节点下字符串的宽度

当我们给了table一个固定宽度时或者宽度为100%时,如果不给tr和td固定的width、height。table内部的tr和td会根据其自身的内容自动适应宽度和高度,项目中提出了一个需求,想让table中的某些tr(或者td)的宽度根据这些部分的内容,选出最大宽度,在赋值给这几个tr(或者td),从而做到部分tr(或者td)等宽

原图是这样的:产量列下的td长短不一

解决办法:

(一)首先我想到了table的 标签自己的属性:

table-layout:fixed ;

此属性可以让table标签内部的单元格td等宽显示(不设置宽度); 但是并没有达到想要的效果---此时所有的单元格td都是等宽的,如图

显然没有达到想要的效果

(二)自己写了段js。下面是代码,做了一下简单的封装

 1     function getStrWidth(elementClass){//获取传入节点的宽度
 2         /* 参数为要获取内容宽度的节点名字(字符串) */
 3
 4         var elementsArr = [];
 5         var elefontSizeArr = [];
 6         var curElements =
 7      document.getElementsByClassName(elementClass);
 8
 9         for (var i = 0; i < curElements.length; i++) {
10
11           var eleWidth = curElements[i].innerHTML;
12           var eleFontSize = getCssValue(curElements[i],‘fontSize‘).slice(0,-2);
13
14           elefontSizeArr.push(Number(eleFontSize));//每个节点内容的fontSize
15           elementsArr.push(Number(eleWidth));
16         }
17         return getMaxWidth(elementsArr,elefontSizeArr);
18
19       }
20
21        function getMaxWidth(arr,elefontSizeArr){//把得到的字符串数组拆分成 算str的clientWidth 取最大值返回
22
23         var newArr = [];
24         for (var i = 0; i < arr.length; i++) {
25           var transArr = arr[i].toString().split(‘‘);
26           newArr.push(transArr);
27         }
28
29         var subArr = [];
30
31         for (var i = 0; i < newArr.length; i++) {
32           var width = 0;
33           for (var j = 0; j < newArr[i].length; j++) {
34
35             getStrClientWidth(newArr[i][j], elefontSizeArr[i]);
36             width += getStrClientWidth(newArr[i][j], elefontSizeArr[i]);
37           }
38           subArr.push(width);
39         }
40
41         return Math.max(...subArr);
42
43       }
44       function getStrClientWidth(item, fontSize){//一个字符的宽度赋值判断
45         /*.
46           规定:
47           数字、小数点、小写字母为一类 (宽度一致)
48           大写字母为一类 (宽度一致)
49           其他为一类 (宽度一致)
50          */
51
52         var numArr = [‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘.‘];
53
54         var lowerCaseArr = [‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘];
55
56         var upperCaseArr = [‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘];
57
58         if (numArr.includes(item) || lowerCaseArr.includes(item)) {
59           return fontSize / 2;
60
61         } else if (numArr.includes(item)) {
62           return fontSize / 2 + 2 * (fontSize / 12);
63
64         } else {
65           return fontSize;
66
67         }
68
69       }
70       function getCssValue(element, propertyName) {//获取节点属性
71         return element.currentStyle ? element.currentStyle[propertyName] : document.defaultView.getComputedStyle(element, false)[propertyName];
72       }
73
74
75        console.log(getStrWidth(‘equal-width-ele‘)) // 得到了经过对比之后的所有class为‘equal-width-ele‘的节点的最大宽度
可以直接调用getStrWidth()方法得到想要的自字符串的宽度,例:

console.log(getStrWidth(‘equal-width-ele‘))
意思是获取页面中所有calss为wrap的节点内部内容的宽度的最大值

给我们想要的td动态添加这个最大值便可,此时产量列下的单元格自适应等宽,其余列自适应如图

:不同font-family下的字符宽度是不一样的,可以在 getStrClientWidth 方法下面去更改字符宽度的定义规则


原文地址:https://www.cnblogs.com/sunweinan/p/8425413.html

时间: 2024-11-05 22:32:35

表格中等宽单元格td之---获取节点下字符串的宽度的相关文章

VFP,当移动鼠标到表格某一个单元格时如何获取表格当前值

Windows10Mobile%E6%AD%A3%E5%BC%8F%E7%89%88%E6%8E%A8%E9%80%81%EF%BC%81 http://zhangmen.baidu.cn/songlist/502458297 http://index.ttplayer.com/songlist/502526863 http://index.ttplayer.com/songlist/502492471 http://list.mp3.baidu.com/songlist/502175989 h

JS动态生成表格后 合并单元格

JS动态生成表格后 合并单元格 最近做项目碰到表格中的单元格合并的问题,需求是这样的,首先发ajax请求 请求回来后的数据 动态生成表格数据,但是生成后如果编号或者(根据其他的内容)有相同时,要合并单元格操作,在做之前也试着google下,但是网上没有碰到这方面的需求,所以自己写了一个简单的.用文字描述需求太费劲了,如下图所示: 1. 没有合并之前的图如下: 2. 合并之后的图如下: 如上所示:是根据相邻的编号相同 进行单元格合并. 先看看实现后的效果再聊吧! JSfiddle链接地址如下: 点

Javascript横向/纵向合并单元格TD

在报表系统中,涉及“HTML的TD单元格的合并”恐怕为数不少. 比如,从DB查得数据并经过后台的整理后,可能是这样的: Table1     JOB TOTAL SAL INDEX EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 1 ANALYST 6000 1 7788 SCOTT ANALYST 7566 4/19/1987 3000.00   20 1 ANALYST 6000 2 7902 FORD ANALYST 7566 12/3/1981

Swift - 给表格添加移动单元格功能(拖动行)

1,下面的样例是给表格UITableView添加单元格移动功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,可以看到单元格后面出现拖动按钮 (3)鼠标按住拖动按钮,可以拖动单元格到任意位置 (4)拖动完毕后,还会触发TabelView对应的代理事件 2,效果图如下:   3,代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Firefox下table单元格td设计relative定位失效解决方案(转)

问题描述: 默认情况下,table的单元格td的display为table-cell,在IE 给td设置position:relative,然后给它包含的一个容器使用position:absolute进行定位是有效的,但在FF下却不可以. 但是在IE下,position:absolute的容器的z-index总是比td的z-index低,td层总是在 position:absolute的容器的上面 发生条件: 1. IE6.IE7.IE8和FF浏览器 2. 使用td默认样式,设置td的posit

控制extsj4.1 gridpanel表格行或者单元格的编辑

情境描述: 如上图是一个可编辑的gridpanel表格,现在需要做的是让第一行不能编辑,第二行可以编辑,或者这两行中一行的任意一个表格可编辑,另一行的该表格不可编辑. 这个问题其实就是控制单元格的编辑,有两种实现方式. 方式1,在CellEditing插件的beforeedit事件中控制,看一个代码截图 定义一个二维数组,对应表格的单元格,如果想让哪个单元格不可编辑,就在数组中对应的值为false,然后在beforeedit事件中return该数组的值,当然实际开发中可以灵活生成editable

LaTeX 绘制表格时合并单元格

使用 LaTeX 绘制表格时合并单元格,使用: \multicolumn{2} {|c|} { XXX内容 } 如: \begin{center} \begin{tabular}{|c|c|c|c|c|c|c|} \hline 显著性水平 & \multicolumn{2}{|c|}{$\leq0.01$} & \multicolumn{2}{|c|}{$\leq0.05$} & \multicolumn{2}{|c|}{$\leq0.1$}\\\hline 数据集 & $

css对html中表格单元格td文本过长的处理

参考 http://www.cnblogs.com/lekko/archive/2013/04/30/3051638.html http://www.zhangxinxu.com/wordpress/?p=4105 只关注实现其效果的css属性,暂无视浏览器兼容性. table{ table-layout: fixed; } .autocut{ width:200px; overflow: hidden; white-space:nowrap; text-overflow: ellipsis;

使用JS遍历Table表格中所有单元格内容

通过JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现:使用该方法时必须为Table表格设置唯一的id属性. function GetInfoFromTable() { var tableInfo = ""; var tableObj = document.getElementByIdx_x("tableid"); //获取表格对象 for (var i = 0; i < tableObj.rows.length; i++) { //遍历Tabl