js表格冻结列滚动条同步滚动

谁践踏了优雅 2023-06-20 06:09 86阅读 0赞

用div css写的table表格怎么实现冻结某列,同时实现数据滚动条滚动的时候,表头也跟着滚动呢?

效果图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg4MzMzOA_size_16_color_FFFFFF_t_70

代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style>
  6. .fixed-table-box {
  7. display: flex;
  8. margin-top: 20px;
  9. margin-left: 200px;
  10. width: 800px;
  11. flex-direction: column;
  12. flex-shrink: 0;
  13. flex-grow: 7;
  14. flex-direction: column;
  15. position: relative;
  16. }
  17. .fixed-table_fixed-left {
  18. display: flex;
  19. flex-shrink: 0;
  20. flex-direction: column;
  21. flex-grow: 1;
  22. width: 120px;
  23. position: absolute;
  24. top: 0;
  25. left: 0;
  26. z-index: 5;
  27. overflow: hidden;
  28. background: white;
  29. box-shadow: 4px 0px 8px -1px #d3d4d6;
  30. }
  31. .fixed-table_fixed-right {
  32. display: flex;
  33. flex-shrink: 0;
  34. flex-grow: 1;
  35. flex-direction: column;
  36. width: 132px;
  37. overflow: hidden;
  38. position: absolute;
  39. top: 0;
  40. right: 15px;
  41. z-index: 5;
  42. background: white;
  43. box-shadow: -4px 0px 8px -1px #d3d4d6;
  44. }
  45. .fixed-table-box_fixed-right-patch {
  46. width: 15px;
  47. height: 28px;
  48. border-top: 1px solid #4078b7;
  49. border-bottom: 1px solid #4078b7;
  50. background-color: #eef1f6;
  51. position: absolute;
  52. top: 0;
  53. right: 0;
  54. }
  55. .fixed-table_header {
  56. display: flex;
  57. height: 30px;
  58. line-height: 30px;
  59. width: 800px;
  60. flex-shrink: 0;
  61. overflow: hidden;
  62. }
  63. .fixed-table_header_th {
  64. display: flex;
  65. flex-grow: 1;
  66. border-top: 1px solid #4078b7;
  67. border-bottom: 1px solid #4078b7;
  68. background-color: #eef1f6;
  69. width: 120px;
  70. padding-left: 10px;
  71. flex-shrink: 0;
  72. }
  73. .column-scrollbar {
  74. width: 10px !important;
  75. }
  76. .fixed-table_body {
  77. display: flex;
  78. flex-direction: column;
  79. max-height: 197px;
  80. width: 800px;
  81. overflow: auto;
  82. }
  83. .fixed-table-left_body,.fixed-table-right_body {
  84. max-height: 180px;
  85. }
  86. .fixed-table_body_tr {
  87. display: flex;
  88. height: 30px;
  89. line-height: 30px;
  90. flex-shrink: 0;
  91. }
  92. .fixed-table_body_td {
  93. display: flex;
  94. flex-grow: 0;
  95. height: 30px;
  96. line-height: 30px;
  97. border-bottom: 1px solid #4078b7;
  98. width: 120px;
  99. flex-shrink: 0;
  100. padding-left: 10px;
  101. }
  102. .column-address {
  103. width: 240px;
  104. }
  105. </style>
  106. </head>
  107. <body>
  108. <div class="fixed-table-box">
  109. <div id="fixed-table-main_header" class="fixed-table_header">
  110. <div class="fixed-table_header_th">日期</div>
  111. <div class="fixed-table_header_th">姓名</div>
  112. <div class="fixed-table_header_th">省份</div>
  113. <div class="fixed-table_header_th">市区</div>
  114. <div class="fixed-table_header_th column-address">地址</div>
  115. <div class="fixed-table_header_th">邮编</div>
  116. <div class="fixed-table_header_th">操作</div>
  117. <div class="fixed-table_header_th column-scrollbar"></div>
  118. </div>
  119. <div onscroll="scroll(event)" class="fixed-table_body">
  120. <div class="fixed-table_body_tr">
  121. <div class="fixed-table_body_td">2016-05-03</div>
  122. <div class="fixed-table_body_td">王小虎</div>
  123. <div class="fixed-table_body_td">上海</div>
  124. <div class="fixed-table_body_td">普陀区</div>
  125. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  126. <div class="fixed-table_body_td">200333</div>
  127. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  128. </div>
  129. <div class="fixed-table_body_tr">
  130. <div class="fixed-table_body_td">2016-05-03</div>
  131. <div class="fixed-table_body_td">王小虎</div>
  132. <div class="fixed-table_body_td">上海</div>
  133. <div class="fixed-table_body_td">普陀区</div>
  134. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  135. <div class="fixed-table_body_td">200333</div>
  136. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  137. </div>
  138. <div class="fixed-table_body_tr">
  139. <div class="fixed-table_body_td">2016-05-03</div>
  140. <div class="fixed-table_body_td">王小虎</div>
  141. <div class="fixed-table_body_td">上海</div>
  142. <div class="fixed-table_body_td">普陀区</div>
  143. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  144. <div class="fixed-table_body_td">200333</div>
  145. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  146. </div>
  147. <div class="fixed-table_body_tr">
  148. <div class="fixed-table_body_td">2016-05-03</div>
  149. <div class="fixed-table_body_td">王小虎</div>
  150. <div class="fixed-table_body_td">上海</div>
  151. <div class="fixed-table_body_td">普陀区</div>
  152. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  153. <div class="fixed-table_body_td">200333</div>
  154. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  155. </div>
  156. <div class="fixed-table_body_tr">
  157. <div class="fixed-table_body_td">2016-05-03</div>
  158. <div class="fixed-table_body_td">王小虎</div>
  159. <div class="fixed-table_body_td">上海</div>
  160. <div class="fixed-table_body_td">普陀区</div>
  161. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  162. <div class="fixed-table_body_td">200333</div>
  163. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  164. </div>
  165. <div class="fixed-table_body_tr">
  166. <div class="fixed-table_body_td">2016-05-03</div>
  167. <div class="fixed-table_body_td">王小虎</div>
  168. <div class="fixed-table_body_td">上海</div>
  169. <div class="fixed-table_body_td">普陀区</div>
  170. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  171. <div class="fixed-table_body_td">200333</div>
  172. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  173. </div>
  174. <div class="fixed-table_body_tr">
  175. <div class="fixed-table_body_td">2016-05-03</div>
  176. <div class="fixed-table_body_td">王小虎</div>
  177. <div class="fixed-table_body_td">上海</div>
  178. <div class="fixed-table_body_td">普陀区</div>
  179. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  180. <div class="fixed-table_body_td">200333</div>
  181. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  182. </div>
  183. <div class="fixed-table_body_tr">
  184. <div class="fixed-table_body_td">2016-05-03</div>
  185. <div class="fixed-table_body_td">王小虎</div>
  186. <div class="fixed-table_body_td">上海</div>
  187. <div class="fixed-table_body_td">普陀区</div>
  188. <div class="fixed-table_body_td column-address">上海市普陀区金沙江路 1518 路</div>
  189. <div class="fixed-table_body_td">200333</div>
  190. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  191. </div>
  192. </div>
  193. <div class="fixed-table_fixed-left">
  194. <div class="fixed-table_header">
  195. <div class="fixed-table_header_th">日期</div>
  196. </div>
  197. <div class="fixed-table_body fixed-table-left_body">
  198. <div class="fixed-table_body_tr">
  199. <div class="fixed-table_body_td">2016-05-03</div>
  200. </div>
  201. <div class="fixed-table_body_tr">
  202. <div class="fixed-table_body_td">2016-05-04</div>
  203. </div>
  204. <div class="fixed-table_body_tr">
  205. <div class="fixed-table_body_td">2016-05-05</div>
  206. </div>
  207. <div class="fixed-table_body_tr">
  208. <div class="fixed-table_body_td">2016-05-06</div>
  209. </div>
  210. <div class="fixed-table_body_tr">
  211. <div class="fixed-table_body_td">2016-05-07</div>
  212. </div>
  213. <div class="fixed-table_body_tr">
  214. <div class="fixed-table_body_td">2016-05-08</div>
  215. </div>
  216. <div class="fixed-table_body_tr">
  217. <div class="fixed-table_body_td">2016-05-09</div>
  218. </div>
  219. <div class="fixed-table_body_tr">
  220. <div class="fixed-table_body_td">2016-05-10</div>
  221. </div>
  222. </div>
  223. </div>
  224. <div class="fixed-table_fixed-right">
  225. <div class="fixed-table_header">
  226. <div class="fixed-table_header_th">操作</div>
  227. </div>
  228. <div class="fixed-table_body fixed-table-right_body">
  229. <div class="fixed-table_body_tr">
  230. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  231. </div>
  232. <div class="fixed-table_body_tr">
  233. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  234. </div>
  235. <div class="fixed-table_body_tr">
  236. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  237. </div>
  238. <div class="fixed-table_body_tr">
  239. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  240. </div>
  241. <div class="fixed-table_body_tr">
  242. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  243. </div>
  244. <div class="fixed-table_body_tr">
  245. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  246. </div>
  247. <div class="fixed-table_body_tr">
  248. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  249. </div>
  250. <div class="fixed-table_body_tr">
  251. <div class="fixed-table_body_td"><a href="###">编辑</a> <a href="###">删除</a></div>
  252. </div>
  253. </div>
  254. </div>
  255. <div class="fixed-table-box_fixed-right-patch"></div>
  256. </div>
  257. <script type="text/javascript">
  258. //固定和滚动
  259. function scroll(event) {
  260. var mainHeader = document.querySelector("#fixed-table-main_header");
  261. var fixedLeft = document.querySelector(".fixed-table-left_body");
  262. var fixedRight = document.querySelector(".fixed-table-right_body");
  263. var mainTop = event.target.scrollTop;
  264. var mainLeft = event.target.scrollLeft;
  265. mainHeader.scrollLeft = mainLeft;
  266. fixedLeft.scrollTop = mainTop;
  267. console.log(mainTop);
  268. fixedRight.scrollTop = mainTop;
  269. }
  270. </script>
  271. </body>
  272. </html>

原理:

首先,冻结列是将要冻结的列单独做成一个table然后覆盖在原来的table上。

然后,同步滚动则就是通过οnscrοll=”scroll(event)”方法,读取横向和纵向滚动距离,然后赋给表头和冻结列即可。

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读