关键词搜索

源码搜索 ×
×

手机浏览器中横向循环滑动效果

发布2013-01-11浏览12928次

详情内容

用智能手机浏览网页,常常发现许多惊艳的滑动效果。垂直方向的滑动是智能手机的固有属性,这其实不算滑动,是滚屏而已。但有些横向滑动的效果,比如打开网易手机版:http://3g.163.com/touch/,还是比较炫的,好像也是一个网站手机版的标准配备。

这种效果怎么弄出来呢?网易这个代码是加了密的,看不懂,注释显示,好像是用了老外的一个什么包,我英文差,没功夫去研究。在网上疯狂搜索,发现有篇大牛的文章,拿来试了一下,可以用,很不错。

不过大牛的效果是比较基本的,事先放置了3个块,每块显示一屏,但不能循环,向两边各滑动一两次就一片空白了,没有实现环形的滑动;另外它进入空白地带后,还是可以继续滑动,相当于将页面可见内容越滑越远。

我们做这个滑动效果,是为了更好地呈现数据,所以我又花了一些工夫进行修改,以期能应用到实际工作中。

1、滑动效果是为了更好地呈现数据,滑动效果一般有3块就行了,每次显示一块,余下两块分别移到当前块的左右两侧;而数据则可能有好多。所以数据和滑动块要分离,需要时才加载到滑动块来显示。如果有多少数据,就设置多少个滑动块,当然最简单,但页面代码也多了不少。

2、滑动块需要循环使用

3、支持触摸,否则在手机浏览器看不到效果

4、只有在滑动块范围内拉动和触摸才有效

没代码我说个J8:

页面

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta content="width=device-width,initial-scale=1.0,user-scalable=no" name="viewport">
  6. <title>循环滑动</title>
  7. <style>
  8. *{margin:0;padding:0}
  9. html,body{overflow:hidden;}
  10. #slideView {
  11. position:absolute;
  12. overflow:hidden;
  13. border:solid 1px black;
  14. }
  15. .slideContainer {
  16. position:absolute;
  17. }
  18. .block{
  19. position:absolute;
  20. }
  21. .block div{
  22. border:solid 2px black;
  23. margin:auto;
  24. font-size:1.5em;
  25. color:black;
  26. width:60px;
  27. height:60px;
  28. text-align:center;
  29. line-height:50px;
  30. background-color:#fff;
  31. }
  32. .debug{
  33. color:Black;
  34. }
  35. #divColor td{border:solid 1px black;}
  36. </style>
  37. <script src="/js/jquery-1.7.1.min.js"></script>
  38. <script src="/js/slide.js"></script>
  39. </head>
  40. <body>
  41. <div class="debug" style="padding-left:30px;">滑呀滑呀</div>
  42. <div id="divPlaceholder">
  43. <div id="slideView">
  44. <div class="slideContainer">
  45. <div class="block">
  46. <div>1</div>
  47. </div>
  48. <div class="block">
  49. <div>2</div>
  50. </div>
  51. <div class="block">
  52. <div>3</div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <div>
  58. <div id="divColor"></div>
  59. <div>赤橙黄绿青蓝腚 谁持厕纸当空舞?</div>
  60. </div>
  61. </body>
  62. </html>

slide.js

  1. //-----------------------------------------------------------------------------------
  2. // “虚”函数,可以由调用方改写
  3. //-----------------------------------------------------------------------------------
  4. //初始化
  5. var slide_func_Init = function(){
  6. //高度自适应..宽度为显示器宽,设置容器的大小和位置
  7. window.winWidth = _slide_width;
  8. var width = _slide_width;
  9. var height = _slide_height - 150;
  10. //占位,由于滑动块父容器是position:absolute,用这个DIV将它包容起来,利于上下的排版
  11. var placeholder = $("#divPlaceholder");
  12. placeholder.css("width", width);
  13. placeholder.css("height", height);
  14. //观看滑动块的视图
  15. var view = $("#slideView");
  16. view.css("width", width);
  17. view.css("height", height);
  18. //滑动块父容器
  19. slide_container = $(".slideContainer");
  20. //滑动块
  21. var slideList = $(".block");//待滑动的块
  22. slideList.css("width", width);
  23. slideList.css("height", height);
  24. var slideLen = slideList.length;
  25. var block = new Array();
  26. for( var i = 0; i < slideLen;i++) {
  27. block[i] = slideList.eq(i);
  28. }
  29. slide_blockShow = block;
  30. //待加载数据
  31. slide_blockData = new Array("#999","#f00","#0f0","#00f","#ff0","#0ff","#000");
  32. var tbcolor ="<table><tr>";
  33. for(var i = 0;i < slide_blockData.length;i++){
  34. tbcolor += "<td style='background-color:" + slide_blockData[i] + "'> </td>";
  35. }
  36. tbcolor += "</tr></table>";
  37. $("#divColor").html(tbcolor);
  38. document.body.parentNode.style.overflow="hidden";
  39. }
  40. //滑动块数据加载
  41. var slide_func_ShowBlock = function(p,ari){
  42. var i = ari[0];
  43. var il = ari[1];
  44. var ir = ari[2];
  45. var arj = _slide_func_GetPointer(p,slide_blockData.length);
  46. var j = arj[0];
  47. var jl = arj[1];
  48. var jr = arj[2];
  49. slide_blockShow[i].css("background-color", slide_blockData[j]);
  50. slide_blockShow[il].css("background-color", slide_blockData[jl]);
  51. slide_blockShow[ir].css("background-color", slide_blockData[jr]);
  52. }
  53. var slide_func_debug = function(text){
  54. $(".debug").text(text);
  55. }
  56. //-----------------------------------------------------------------------------------
  57. // 全局变量
  58. //-----------------------------------------------------------------------------------
  59. var slide_container; //滑动块容器
  60. var slide_blockShow; //滑动块,应该有3个
  61. var slide_blockData; //用于在滑动块上显示的数据,数量不限,但多于3个那是肯定的
  62. var _slide_width = window.screen.width;
  63. var _slide_height = (window.screen.height > 500) ? 500 : window.screen.height;
  64. //-----------------------------------------------------------------------------------
  65. // 私有函数
  66. //-----------------------------------------------------------------------------------
  67. $(document).ready(function(){
  68. _slide_func_disRightMouse();
  69. var startX;
  70. var basePoint = 0;
  71. var stargDis;
  72. var distance;
  73. var maxDistance = 50;
  74. var doc = $(document);
  75. var animateSpeed = 800;
  76. var recoverSpeed = 100;
  77. var width = _slide_width;
  78. var yT,yB;
  79. var p;
  80. slide_func_Init();
  81. var container = slide_container;
  82. if(container == null){
  83. alert("还没有设置滑动块容器!");
  84. }
  85. var blockShow = slide_blockShow;
  86. if(blockShow == null || blockShow.length < 3){
  87. alert("还没有设置滑动块或滑动块数量少于3个!");
  88. }
  89. yT = blockShow[0].offset().top;
  90. yB = yT + blockShow[0].height();
  91. //鼠标大人,乃过气之物?妇人之屁鬼如鼠,壮士之屁猛若牛
  92. doc.mousedown(function(event){
  93. startX = event.clientX;
  94. doc.bind("mousemove", moveHandler);
  95. startX = event.clientX;
  96. });
  97. doc.mouseup(function(){
  98. if(distance < maxDistance){
  99. recoverPosition(distance);
  100. }
  101. doc.unbind("mousemove");
  102. });
  103. function moveHandler(event){
  104. var y = event.clientY;
  105. if( y < yT || y > yB) return;
  106. distance = event.clientX - startX;
  107. movePanel(distance);
  108. if(event.clientX - startX > maxDistance){
  109. doc.unbind("mousemove");
  110. slideRight();
  111. return;
  112. }
  113. if(event.clientX - startX < -maxDistance){
  114. doc.unbind("mousemove");
  115. slideLeft();
  116. return;
  117. }
  118. }
  119. //touch...别摸我
  120. try{
  121. document.addEventListener('touchstart',function(ev){
  122. startX = ev.touches[0].pageX;
  123. touchBind(ev);
  124. },false);
  125. document.addEventListener('touchend',function(ev){
  126. if(distance < maxDistance){
  127. recoverPosition(distance);
  128. }
  129. touchUnBind();
  130. },false);
  131. }catch(ex){}
  132. function touchBind(ev){
  133. document.addEventListener('touchmove',touchHandler,false);
  134. }
  135. function touchUnBind(){
  136. document.removeEventListener('touchmove',touchHandler,false);
  137. }
  138. function touchHandler(ev){
  139. var y = ev.touches[0].pageY;
  140. if( y < yT || y > yB) return;
  141. distance = ev.touches[0].pageX - startX;
  142. movePanel(distance);
  143. if(ev.touches[0].pageX - startX > maxDistance){
  144. slideRight();
  145. touchUnBind();
  146. return;
  147. }
  148. if(ev.touches[0].pageX - startX < -maxDistance){
  149. slideLeft();
  150. touchUnBind();
  151. return;
  152. }
  153. }
  154. function recoverPosition(dis){
  155. container.animate({
  156. left : basePoint
  157. }, recoverSpeed );
  158. dis = 0;
  159. }
  160. function movePanel(distance){
  161. container.css("left", basePoint + distance);
  162. }
  163. function slideRight(){
  164. container.animate({
  165. left : basePoint += width
  166. }, animateSpeed);
  167. p--;
  168. ShowBlock(p);
  169. }
  170. function slideLeft(){
  171. container.animate({
  172. left : basePoint -= width
  173. }, animateSpeed);
  174. p++;
  175. ShowBlock(p);
  176. }
  177. function ShowBlock(p){
  178. var ari = _slide_func_GetPointer(p,blockShow.length);
  179. var i = ari[0];
  180. var il = ari[1];
  181. var ir = ari[2];
  182. var sleft = blockShow[i].css("left");
  183. var left = sleft.substring(0,sleft.indexOf("px")) * 1;
  184. blockShow[il].css("left", (left - width) + "px");
  185. blockShow[ir].css("left", (left + width) + "px");
  186. slide_func_ShowBlock(p,ari);
  187. }
  188. p = 0;
  189. ShowBlock(p);
  190. })
  191. function _slide_func_GetPointer(p,len){
  192. var min = 0;
  193. var max = len - 1;
  194. var i = p;
  195. if(i < 0){
  196. i = len - (i * -1) % len;
  197. }
  198. i = i % len;
  199. var il = (i > min) ? i - 1 : max;
  200. var ir = (i < max) ? i + 1 : min;
  201. return [i,il,ir];
  202. }
  203. function _slide_func_disRightMouse(){
  204. $(document).bind("contextmenu",function(e){
  205. return false;
  206. });
  207. }

代码说明:

1、手机浏览器有touch事件,但PC浏览器没有。所以要用try catch

2、不知道为什么,用手机浏览,页面宽度会比手机屏幕要宽,搞得向左拉动的时候,首先是滚屏效果,然后再到滑动,要拉动好长一段距离。所以要用一个DIV将滑动块及其父容器套住,严格定死宽度与屏幕一致,还要设置overflow属性。

  1. #slideView {
  2. position:absolute;
  3. overflow:hidden;
  4. border:solid 1px black;
  5. }

我将这个DIV称为视窗,透过它我们可以看到滑动块,而页面手机屏幕则再也没有被撑开的问题了。

3、滑动块及其父容器、视窗,都是绝对定位。为了上下文排版,需要用一个没有绝对定位的DIV(<div id="divPlaceholder">)将他们套住,宽高跟他们保持一致。

4、

<meta content="width=device-width,initial-scale=1.0,user-scalable=no" name="viewport">
这一句很重要,规定页面宽度与手机屏幕一致。我查了一下,是HTML5的东西。靠,HTML5,我不懂耶。

参考文章:

http://www.cnblogs.com/xesam/archivehttps://cdn.jxasp.com:9143/image/2012/05/18https://cdn.jxasp.com:9143/image/2484426.html


相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载