1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>合并行</title> 6 <link href="layui/css/layui.css" rel="stylesheet" /> 7 </head> 8 <body> 9 <div class="box"> 10 <table class="layui-table" id="test" lay-data="{page:true,limit:50}" lay-filter="test"> 11 <thead> 12 <tr> 13 <th lay-data="{field:'province',200}">省</th> 14 <th lay-data="{field:'city',200}">市</th> 15 <th lay-data="{field:'zone',200}">区</th> 16 <th lay-data="{field:'username',200}">昵称</th> 17 <th lay-data="{field:'joinTime',150}">加入时间</th> 18 <th lay-data="{field:'sign',minWidth: 180}">签名</th> 19 <th lay-data="{field:'8',align:'right'}">基本操作</th> 20 </tr> 21 </thead> 22 <tbody> 23 <tr> 24 <td>浙江</td> 25 <td>杭州</td> 26 <td>西湖区</td> 27 <td>贤心1</td> 28 <td>2016-11-28</td> 29 <td>人生就像是一场修行 A</td> 30 <td> 31 <div class="layui-btn-group" style="overflow:visible;"> 32 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 33 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 34 </div> 35 </td> 36 </tr> 37 <tr> 38 <td>浙江</td> 39 <td>这个</td> 40 <td>西湖区</td> 41 <td>贤心2</td> 42 <td>2016-11-29</td> 43 <td>人生就像是一场修行 B</td> 44 <td> 45 <div class="layui-btn-group" style="overflow:visible;"> 46 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 47 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 48 </div> 49 </td> 50 </tr> 51 <tr> 52 <td>浙江</td> 53 <td>丽水</td> 54 <td>莲都区</td> 55 <td>贤心3</td> 56 <td>2016-11-30</td> 57 <td>人生就像是一场修行 C</td> 58 <td> 59 <div class="layui-btn-group" style="overflow:visible;"> 60 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 61 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 62 </div> 63 </td> 64 </tr> 65 <tr> 66 <td>浙江</td> 67 <td>丽水</td> 68 <td>莲都区</td> 69 <td>贤心3</td> 70 <td>2016-19-30</td> 71 <td>人生就像是一场修行 C</td> 72 <td> 73 <div class="layui-btn-group" style="overflow:visible;"> 74 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 75 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 76 </div> 77 </td> 78 </tr> 79 <tr> 80 <td>浙江</td> 81 <td>位置</td> 82 <td>莲都区</td> 83 <td>贤心3</td> 84 <td>2016-11-30</td> 85 <td>人生就像是一场修行 C</td> 86 <td> 87 <div class="layui-btn-group" style="overflow:visible;"> 88 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 89 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 90 </div> 91 </td> 92 </tr> 93 <tr> 94 <td>湖北</td> 95 <td>位置</td> 96 <td>莲都区</td> 97 <td>贤心3</td> 98 <td>2016-11-30</td> 99 <td>人生就像是一场修行 C</td> 100 <td> 101 <div class="layui-btn-group" style="overflow:visible;"> 102 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 103 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 104 </div> 105 </td> 106 </tr> 107 <tr> 108 <td>湖北</td> 109 <td>这个</td> 110 <td>1区</td> 111 <td>贤心3</td> 112 <td>2016-11-30</td> 113 <td>人生就像是一场修行 C</td> 114 <td> 115 <div class="layui-btn-group" style="overflow:visible;"> 116 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 117 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 118 </div> 119 </td> 120 </tr> 121 <tr> 122 <td>湖北</td> 123 <td>这个</td> 124 <td>1区</td> 125 <td>贤心3</td> 126 <td>2016-11-30</td> 127 <td>人生就像是一场修行 C</td> 128 <td> 129 <div class="layui-btn-group" style="overflow:visible;"> 130 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 131 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 132 </div> 133 </td> 134 </tr> 135 <tr> 136 <td>湖北</td> 137 <td>这个</td> 138 <td>1区</td> 139 <td>贤心3</td> 140 <td>2016-11-30</td> 141 <td>人生就像是一场修行 B</td> 142 <td> 143 <div class="layui-btn-group" style="overflow:visible;"> 144 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 145 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 146 </div> 147 </td> 148 </tr> 149 <tr> 150 <td>湖北</td> 151 <td>这个</td> 152 <td>1区</td> 153 <td>贤心</td> 154 <td>2016-11-30</td> 155 <td>人生就像是一场修行 B</td> 156 <td> 157 <div class="layui-btn-group" style="overflow:visible;"> 158 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 159 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 160 </div> 161 </td> 162 </tr> 163 <tr> 164 <td>湖北</td> 165 <td>这个</td> 166 <td>1区</td> 167 <td>贤心</td> 168 <td>2016-11-30</td> 169 <td>人生就像是一场修行 C</td> 170 <td> 171 <div class="layui-btn-group" style="overflow:visible;"> 172 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 173 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 174 </div> 175 </td> 176 </tr> 177 <tr> 178 <td>湖北</td> 179 <td>这个</td> 180 <td>1区</td> 181 <td>贤心</td> 182 <td>2016-11-30</td> 183 <td>人生就像是一场修行 D</td> 184 <td> 185 <div class="layui-btn-group" style="overflow:visible;"> 186 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a> 187 <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a> 188 </div> 189 </td> 190 </tr> 191 </tbody> 192 </table> 193 </div> 194 195 <script src="layui/layui.js"></script> 196 <script src="Scripts/jquery-3.4.1.min.js"></script> 197 <script> 198 layui.use('table', function () { 199 var table = layui.table; 200 //var $ = layui.jquery;//引入jquery的模块 201 table.init('test', { 202 done: function (res, curr, count) { 203 layuiRowspan('province', 1); 204 layuiRowspan(['city', 'zone', 'username', 'joinTime', 'sign'], 1);//支持数组 205 layuiRowspan("8", 1, true); 206 } 207 }); 208 }) 209 210 var execRowspan = function (fieldName, index, flag) { 211 // 1为不冻结的情况,左侧列为冻结的情况 212 let fixedNode = index == "1" ? $(".layui-table-body")[index - 1] : (index == "3" ? $(".layui-table-fixed-r") : $(".layui-table-fixed-l")); 213 // 左侧导航栏不冻结的情况 214 let child = $(fixedNode).find("td"); 215 let childFilterArr = []; 216 // 获取data-field属性为fieldName的td 217 for (let i = 0; i < child.length; i++) { 218 if (child[i].getAttribute("data-field") == fieldName) { 219 childFilterArr.push(child[i]); 220 } 221 } 222 // 获取td的个数和种类 223 let childFilterTextObj = {}; 224 for (let i = 0; i < childFilterArr.length; i++) { 225 let childText = flag ? childFilterArr[i].innerHTML : childFilterArr[i].textContent; 226 if (childFilterTextObj[childText] == undefined) { 227 childFilterTextObj[childText] = 1; 228 } else { 229 let num = childFilterTextObj[childText]; 230 childFilterTextObj[childText] = num * 1 + 1; 231 } 232 } 233 let canRowspan = true; 234 let maxNum;//以前列单元格为基础获取的最大合并数 235 let finalNextIndex;//获取其下第一个不合并单元格的index 236 let finalNextKey;//获取其下第一个不合并单元格的值 237 for (let i = 0; i < childFilterArr.length; i++) { 238 (maxNum > 9000 || !maxNum) && (maxNum = $(childFilterArr[i]).prev().attr("rowspan") && fieldName != "8" ? $(childFilterArr[i]).prev().attr("rowspan") : 9999); 239 let key = flag ? childFilterArr[i].innerHTML : childFilterArr[i].textContent;//获取下一个单元格的值 240 let nextIndex = i + 1; 241 let tdNum = childFilterTextObj[key]; 242 let curNum = maxNum < tdNum ? maxNum : tdNum; 243 if (canRowspan) { 244 for (let j = 1; j <= curNum && (i + j < childFilterArr.length);) {//循环获取最终合并数及finalNext的index和key 245 finalNextKey = flag ? childFilterArr[i + j].innerHTML : childFilterArr[i + j].textContent; 246 finalNextIndex = i + j; 247 if ((key != finalNextKey && curNum > 1) || maxNum == j) { 248 canRowspan = true; 249 curNum = j; 250 break; 251 } 252 j++; 253 if ((i + j) == childFilterArr.length) { 254 finalNextKey = undefined; 255 finalNextIndex = i + j; 256 break; 257 } 258 } 259 childFilterArr[i].setAttribute("rowspan", curNum); 260 if ($(childFilterArr[i]).find("div.rowspan").length > 0) {//设置td内的div.rowspan高度适应合并后的高度 261 $(childFilterArr[i]).find("div.rowspan").parent("div.layui-table-cell").addClass("rowspanParent"); 262 $(childFilterArr[i]).find("div.layui-table-cell")[0].style.height = curNum * 38 - 10 + "px"; 263 } 264 canRowspan = false; 265 } else { 266 childFilterArr[i].style.display = "none"; 267 } 268 if (--childFilterTextObj[key] == 0 | --maxNum == 0 | --curNum == 0 | (finalNextKey != undefined && nextIndex == finalNextIndex)) {//||(finalNextKey!=undefined&&key!=finalNextKey) 269 canRowspan = true; 270 } 271 } 272 } 273 //合并数据表格行 274 var layuiRowspan = function (fieldNameTmp, index, flag) { 275 let fieldName = []; 276 if (typeof fieldNameTmp == "string") { 277 fieldName.push(fieldNameTmp); 278 } else { 279 fieldName = fieldName.concat(fieldNameTmp); 280 } 281 for (let i = 0; i < fieldName.length; i++) { 282 execRowspan(fieldName[i], index, flag); 283 } 284 } 285 286 </script> 287 </body> 288 </html>