H5手机开发锁定表头和首列(惯性滚动)解决方案

前端时间移动端在做表格的时候需要这个功能,由于还有实现类似原生的惯性滚动功能,于是使用了iscroll插件。

iscroll插件下载地址:iscroll5

该功能demo github地址: https://github.com/lyc152/front-special-effects/tree/master/table-fixed

下面看下代码结构:

HTML:

  1 <div class="data-table">
  2     <div class="t_l">
  3         <table>
  4             <tbody>
  5                 <tr>
  6                     <th>品类</th>
  7                 </tr>
  8             </tbody>
  9         </table>
 10         <div class="t_l_freeze" id="t_l_freeze">
 11             <table>
 12                 <tr>
 13                     <td>品类</td>
 14                 </tr>
 15                 <tr>
 16                     <td>男鞋</td>
 17                 </tr>
 18                 <tr>
 19                     <td>男鞋</td>
 20                 </tr>
 21                 <tr>
 22                     <td>男鞋</td>
 23                 </tr>
 24                 <tr>
 25                     <td>男鞋</td>
 26                 </tr>
 27                 <tr>
 28                     <td>男鞋</td>
 29                 </tr>
 30                 <tr>
 31                     <td>男鞋</td>
 32                 </tr>
 33                 <tr>
 34                     <td>男鞋</td>
 35                 </tr>
 36                 <tr>
 37                     <td>男鞋</td>
 38                 </tr>
 39                 <tr>
 40                     <td>男鞋</td>
 41                 </tr>
 42                 <tr>
 43                     <td>男鞋</td>
 44                 </tr>
 45                 <tr>
 46                     <td>男鞋</td>
 47                 </tr>
 48                 <tr>
 49                     <td>男鞋</td>
 50                 </tr>
 51                 <tr>
 52                     <td>男鞋</td>
 53                 </tr>
 54                 <tr>
 55                     <td>男鞋</td>
 56                 </tr>
 57                 <tr>
 58                     <td>男鞋</td>
 59                 </tr>
 60                 <tr>
 61                     <td>男鞋</td>
 62                 </tr>
 63             </table>
 64         </div>
 65     </div>
 66     <div class="t_r">
 67         <div class="t_r_t" id="t_r_t">
 68             <table>
 69                 <tbody>
 70                 <tr>
 71                     <th>1</th>
 72                     <th>2</th>
 73                     <th>3</th>
 74                     <th>4</th>
 75                     <th>5</th>
 76                     <th>6</th>
 77                     <th>7</th>
 78                     <th>8</th>
 79                     <th>9</th>
 80                 </tr>
 81                 </tbody>
 82             </table>
 83         </div>
 84         <div class="t_r_content" id="t_r_content">
 85             <table>
 86                 <tbody>
 87                     <tr>
 88                         <td>1</td>
 89                         <td>2</td>
 90                         <td>3</td>
 91                         <td>4</td>
 92                         <td>5</td>
 93                         <td>6</td>
 94                         <td>7</td>
 95                         <td>8</td>
 96                         <td>9</td>
 97                     </tr>
 98                     <tr>
 99                         <td>1</td>
100                         <td>2</td>
101                         <td>3</td>
102                         <td>4</td>
103                         <td>5</td>
104                         <td>6</td>
105                         <td>7</td>
106                         <td>8</td>
107                         <td>9</td>
108                     </tr>
109                     <tr>
110                         <td>1</td>
111                         <td>2</td>
112                         <td>3</td>
113                         <td>4</td>
114                         <td>5</td>
115                         <td>6</td>
116                         <td>7</td>
117                         <td>8</td>
118                         <td>9</td>
119                     </tr>
120                     <tr>
121                         <td>1</td>
122                         <td>2</td>
123                         <td>3</td>
124                         <td>4</td>
125                         <td>5</td>
126                         <td>6</td>
127                         <td>7</td>
128                         <td>8</td>
129                         <td>9</td>
130                     </tr>
131                     <tr>
132                         <td>1</td>
133                         <td>2</td>
134                         <td>3</td>
135                         <td>4</td>
136                         <td>5</td>
137                         <td>6</td>
138                         <td>7</td>
139                         <td>8</td>
140                         <td>9</td>
141                     </tr>
142                     <tr>
143                         <td>1</td>
144                         <td>2</td>
145                         <td>3</td>
146                         <td>4</td>
147                         <td>5</td>
148                         <td>6</td>
149                         <td>7</td>
150                         <td>8</td>
151                         <td>9</td>
152                     </tr>
153                     <tr>
154                         <td>1</td>
155                         <td>2</td>
156                         <td>3</td>
157                         <td>4</td>
158                         <td>5</td>
159                         <td>6</td>
160                         <td>7</td>
161                         <td>8</td>
162                         <td>9</td>
163                     </tr>
164                     <tr>
165                         <td>1</td>
166                         <td>2</td>
167                         <td>3</td>
168                         <td>4</td>
169                         <td>5</td>
170                         <td>6</td>
171                         <td>7</td>
172                         <td>8</td>
173                         <td>9</td>
174                     </tr>
175                     <tr>
176                         <td>1</td>
177                         <td>2</td>
178                         <td>3</td>
179                         <td>4</td>
180                         <td>5</td>
181                         <td>6</td>
182                         <td>7</td>
183                         <td>8</td>
184                         <td>9</td>
185                     </tr>
186                     <tr>
187                         <td>1</td>
188                         <td>2</td>
189                         <td>3</td>
190                         <td>4</td>
191                         <td>5</td>
192                         <td>6</td>
193                         <td>7</td>
194                         <td>8</td>
195                         <td>9</td>
196                     </tr>
197                     <tr>
198                         <td>1</td>
199                         <td>2</td>
200                         <td>3</td>
201                         <td>4</td>
202                         <td>5</td>
203                         <td>6</td>
204                         <td>7</td>
205                         <td>8</td>
206                         <td>9</td>
207                     </tr>
208                     <tr>
209                         <td>1</td>
210                         <td>2</td>
211                         <td>3</td>
212                         <td>4</td>
213                         <td>5</td>
214                         <td>6</td>
215                         <td>7</td>
216                         <td>8</td>
217                         <td>9</td>
218                     </tr>
219                     <tr>
220                         <td>1</td>
221                         <td>2</td>
222                         <td>3</td>
223                         <td>4</td>
224                         <td>5</td>
225                         <td>6</td>
226                         <td>7</td>
227                         <td>8</td>
228                         <td>9</td>
229                     </tr>
230                     <tr>
231                         <td>1</td>
232                         <td>2</td>
233                         <td>3</td>
234                         <td>4</td>
235                         <td>5</td>
236                         <td>6</td>
237                         <td>7</td>
238                         <td>8</td>
239                         <td>9</td>
240                     </tr>
241                     <tr>
242                         <td>1</td>
243                         <td>2</td>
244                         <td>3</td>
245                         <td>4</td>
246                         <td>5</td>
247                         <td>6</td>
248                         <td>7</td>
249                         <td>8</td>
250                         <td>9</td>
251                     </tr>
252                     <tr>
253                         <td>1</td>
254                         <td>2</td>
255                         <td>3</td>
256                         <td>4</td>
257                         <td>5</td>
258                         <td>6</td>
259                         <td>7</td>
260                         <td>8</td>
261                         <td>9</td>
262                     </tr>
263                     <tr>
264                         <td>1</td>
265                         <td>2</td>
266                         <td>3</td>
267                         <td>4</td>
268                         <td>5</td>
269                         <td>6</td>
270                         <td>7</td>
271                         <td>8</td>
272                         <td>9</td>
273                     </tr>
274                 </tbody>
275             </table>
276         </div>
277     </div>
278 </div>

table-fixed

实现表头和首列固定比较简单,可以将可以滚动的content容器的scrollTop和scrollLeft值分别赋值给锁定表列容器的scrollTop和锁定表头的scrollLeft。即:

1         function aa() {
2             var a = document.getElementById("t_r_content").scrollTop;
3             var b = document.getElementById("t_r_content").scrollLeft;
4             document.getElementById("cl_freeze").scrollTop = a;
5             document.getElementById("t_r_t").scrollLeft = b;
6         }

但是实现 惯性滚动 中还要 固定表头和表列就要麻烦些:

 1 var win = $(window),
 2     scrollAreaEl = $(‘.t_r_content‘),
 3     leftFreezeEl = $(‘.t_l_freeze‘),
 4     leftTableEl = leftFreezeEl.find(‘table‘),
 5     rightTableEl = $(‘.t_r_t table‘);
 6
 7 //动态计算容器最大高度
 8 function adjustHeight() {
 9     var winHeight = win.height(),
10         tableHeight = winHeight - 90;
11     leftFreezeEl.height(tableHeight);
12     scrollAreaEl.height(tableHeight);
13 }
14
15 adjustHeight();
16 win.on(‘resize‘, adjustHeight);
17
18 //设置iscroll
19 var myScroll = new IScroll(‘.t_r_content‘, {
20     scrollX: true,
21     scrollY: true,
22     probeType: 3
23 });
24
25 //阻止默认滚动
26 scrollAreaEl.on(‘touchmove mousewheel‘, function(e) {
27     e.preventDefault();
28 });
29
30 //固定上左表头的滚动
31 myScroll.on(‘scroll‘, updatePosition);
32 myScroll.on(‘scrollEnd‘, updatePosition);
33
34 function updatePosition() {
35     var a = this.y;
36     var b = this.x;
37     leftTableEl.css(‘transform‘, ‘translate(0px, ‘ + a + ‘px) translateZ(0px)‘);
38     rightTableEl.css(‘transform‘, ‘translate(‘ + b + ‘px, 0px) translateZ(0px)‘);
39 }

main.js

实现步骤

1.引用 iscroll-probe.js 插件

2. 动态计算容器的最大高度,当resize的时候重新计算容器的最大高度;

3. 设置iscroll;

4. 阻止可滚动部分content的默认滚动;

5. 阻止上左表头的滚动,需要引用iscroll 中的 scroll,scrollEnd,要阻止表头和表列的滚动 ,就需要计算滚动的x和y值,更新leftTable和rightTable的transform的值就可以做到了。

当然,可以实现这个功能的方法很多,大家有什么比较好的方法我们都可以一起讨论,欢迎拍砖

时间: 2024-07-31 14:31:09

H5手机开发锁定表头和首列(惯性滚动)解决方案的相关文章

Saiku如何固定查询结果table的表头和首列

在使用saiku查询的时候,当“行”和“列”的维度内容过多时,在查看时只看到数据,不知道是什么数据,维度不清楚,得来回拖动滚动条才行,所以同事提出想要固定“表头”和“首列”. 在网上找了一些现成的插件使用后效果都不理想,所以决定自己动手,丰衣足食. 我的思路来自:http://www.cnblogs.com/sorex/archive/2011/06/30/2093499.html 使用四个table,其中一个为saiku原有的,再增加3个,思路效果图: js代码实现: 1.找到SaikuTab

【转帖】H5 手机 App 开发入门:概念篇

H5 手机 App 开发入门:概念篇 http://www.ruanyifeng.com/blog/2019/12/hybrid-app-concepts.html 作者: 阮一峰 日期: 2019年12月10日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. 手机现在是互联网的最大入口.根据<中国互联网报告>,手机网民已经超过8亿,人均每天上网三个多小时. 毫不奇怪,手机应用软件(mobile application,简称 mobile App)的开发工程师供不应求,一

锁定TABLE的首行和首列

1. 2. 3. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equ

手机开发常见问题大全(40)

1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2.现在android比较乱,有1.5的,有2的也有3的. 想让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍).

常见的移动端H5页面开发遇到的坑和解决办法

转自:https://www.cnblogs.com/LiuJL/p/7744473.html 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2.现在android比较乱,有1.5的,有2的也有3的.

最近这两天看了关于H5游戏开发的一个教程,实践很短暂,看了很多理论的东西,现在呢也只是想回忆回忆关于EUI的部分知识吧

首先我了解了什么是Egret: Egret中文就是白鹭的意思,Egret是一套H5游戏开发的软件.(纯粹属于个人理解) 其次我对以下几款软件的相关知识做了些了解: Egret Engine(引擎),Egret Wing(编辑器),Texture Merger(可将零散纹理拼合为整图,同时也可以解析SWF.GIF动画,导出可供Egret使用的配置文件),Egret Feather(是一款粒子效果编辑器)ResDepot(是针对资源配置文件的创建,编辑和管理工具)等.......ps:现在我只看了这

CSS简单table首列固定

日前公司业务需求,将几个页面Table(也有一个页面几个table的情况)首列固定.网上查找资料最简便的做法是,将固定列(或者行)与滑动数据分别放在两个table里.因为我的需求是在 原有的table上进行编辑修改,不宜大幅度动原有代码所以没有采用. 考虑到时间成本的问题最终解决代码如下.值得注意的地方有几点: 第一,使用 css experssion动态表达式取值 加上eval绑定为较规范写法(也有说可以兼容IE6). 第二,必须使用兼容视图(IE)浏览,否则Freezingcol中left属

h5直播开发之旅总结

前言 关于直播,有很多相关技术文章,这里不多说. 作为前端,我们比较关心我们所需要的. 直播的大致流程: APP端调用摄像头 -> 拍摄视频 -> 实时上传视频 -> 服务器端获取视频并解码 -> 存储成一小段一小段视频 -> 服务器端进行推流 -> H5或者app端通过一个url拉取视频流进行播放 实际的直播和用户播放的直播会有10秒左右或者更高的延迟,这一点对于后面开发比较重要,一定要注意这个点. H5实现直播主要是和video标签打交道,虽然只需要拿到m3u8格式

移动手机开发--图片之适应宽度

移动Web开发图片自适应两种常见情况解决方案 本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集,这种文章只需要左右滑动浏览,最好的体验是让图片缩放显示在屏幕有效范围 内,防止图片太大导致用户需要滑动手指移动图片来查看这种费力气的事情,用户体验大大降低.二是图文混排的文章,图片最大宽度不超过屏幕宽度,高度可以 auto.这两种情况在项目中很常见.另外