分享

使用ionic框架的<ion

 昨夜雾浓 2018-04-25

混合app开发使用ionic框架的<ion-scroll>指令能够方便地实现水平滚动和垂直滑动。比如我们想实现一个能够水平滑动的画廊,可以使用下面这段代码。

  1. <html>  
  2.   <head>  
  3.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
  4.     <script src="jquery-1.11.1.min.js"></script>  
  5.     <script src="./1.1.1-release/js/ionic.bundle.js"></script>  
  6.     <link rel="stylesheet" type="text/css" href="./1.1.1-release/css/ionic.css" />  
  7.     <style>  
  8.     /*nowrap不让img换行*/  
  9.     .picturesholder{  
  10.         background-color:#fff;  
  11.         margin:20px;  
  12.         width:400px;  
  13.         height:80px;  
  14.         overflow: hidden;  
  15.         white-space: nowrap;  
  16.     }  
  17.       
  18.     /**图片占满画廊*/  
  19.     .picturesholder img{  
  20.         width:100px;  
  21.         height:81px;  
  22.     }  
  23.     </style>  
  24.   
  25.     <script>  
  26.     var testModule = angular.module('testApp', ['ionic']);  
  27.     testModule.controller('MyController', function($scope, $ionicScrollDelegate) {  
  28.         $scope.pictures=["imgs/1.png","imgs/2.png","imgs/3.png","imgs/4.png","imgs/5.png","imgs/6.png","imgs/7.png","imgs/8.png"];  
  29.     });  
  30.       
  31.     $(function(){  
  32.         angular.bootstrap($("#body"), ["testApp"]);   
  33.     })  
  34.     </script>  
  35. </head>  
  36.   
  37. <body id="body" ng-controller="MyController">  
  38.     
  39.     <ion-header-bar class="bar-positive">  
  40.         <h1 class="title">bar-positive</h1>  
  41.     </ion-header-bar>  
  42.     
  43.     <ion-content class="has-header" style="background-color: #ebebeb;">  
  44.       
  45.         <div class="picturesholder">  
  46.             <ion-scroll direction="x">  
  47.                 <img ng-src="{{each}}" ng-repeat="each in pictures"></img>  
  48.             </ion-scroll>           
  49.         </div>  
  50.           
  51.     </ion-content>  
  52.       
  53.     <ion-footer-bar class="bar-balanced">  
  54.         <div class="title">Footer</div>  
  55.     </ion-footer-bar>  
  56. </body>  
  57. </html>  
  58.   
  59.       


单看这一个水平画廊是没有什么问题的,功能和操作都很正常。但是我们项目中遇到一个问题:一个页面很大,有多个画廊控件,我们的页面很难上下滑动,滑动非常吃力,这是为什么呢?举个例子:如果你的页面放的全都是input输入控件,那么这个页面一样很难滑动,因为当我们在手机屏幕上滑动的时候,一不小心很容易就会点中这些输入框,当输入框获得焦点,页面就不能滑动了。使用<ion-scroll>一样有这个问题,当页面全是画廊控件的时候,滑动也十分费劲。


从ionic文档中也没有找到好的解决办法,最后解决方法是:不使用<ion-scroll>指令,自己实现左右滑动。利用HTML5中的touchmove和touchstart事件实现滚动:

[javascript] view plain copy
print?
  1. // do for left-right scroll  
  2. var startX = 0;  
  3. var startY = 0;  
  4. var $gallery = $(".picturesholder");  
  5.   
  6. $gallery.on("touchstart", function(e) {  
  7.      startX = e.originalEvent.changedTouches[0].pageX,  
  8.      startY = e.originalEvent.changedTouches[0].pageY;  
  9. });  
  10.   
  11. $gallery.on("touchmove", function(e) {  
  12.     var X = e.originalEvent.changedTouches[0].pageX - startX;  
  13.     var Y = e.originalEvent.changedTouches[0].pageY - startY;  
  14.        
  15.     if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {  
  16.         var cur_scroll = $(this).scrollLeft();  
  17.         $(this).scrollLeft(parseInt(cur_scroll) - X);  
  18.         e.preventDefault();  
  19.         e.stopPropagation();  
  20.     }  
  21.     else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {  
  22.         var cur_scroll = $(this).scrollLeft();  
  23.         $(this).scrollLeft(parseInt(cur_scroll) - X);  
  24.         e.preventDefault();  
  25.         e.stopPropagation();  
  26.     }  
  27.     else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {  
  28.     }  
  29.     else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {  
  30.     }  
  31.     else{  
  32.     }  
  33. });  
  34. // do for left-right scroll  

web浏览器没有上面2个事件,我们可以用mousedown和mousemove模拟,下面代码一样可以左右滑动。
  1. <html>  
  2.   <head>  
  3.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
  4.     <script src="jquery-1.11.1.min.js"></script>  
  5.     <script src="./1.1.1-release/js/ionic.bundle.js"></script>  
  6.     <link rel="stylesheet" type="text/css" href="./1.1.1-release/css/ionic.css" />  
  7.     <style>  
  8.     /*nowrap不让img换行*/  
  9.     .picturesholder{  
  10.         background-color:#fff;  
  11.         margin:20px;  
  12.         width:400px;  
  13.         height:80px;  
  14.         overflow: hidden;  
  15.         white-space: nowrap;  
  16.     }  
  17.       
  18.     /**图片占满画廊*/  
  19.     .picturesholder img{  
  20.         width:100px;  
  21.         height:81px;  
  22.     }  
  23.     </style>  
  24.   
  25.     <script>  
  26.     var testModule = angular.module('testApp', ['ionic']);  
  27.     testModule.controller('MyController', function($scope, $ionicScrollDelegate) {  
  28.         $scope.pictures=["imgs/1.png","imgs/2.png","imgs/3.png","imgs/4.png","imgs/5.png","imgs/6.png","imgs/7.png","imgs/8.png"];  
  29.     });  
  30.       
  31.     $(function(){  
  32.         angular.bootstrap($("#body"), ["testApp"]);   
  33.           
  34.         // do for left-right scroll  
  35.         var startX = 0;  
  36.         var startY = 0;  
  37.         var $pictures = $(".picturesholder");  
  38.           
  39.         $pictures.on("mousedown", function(e) {  
  40.              startX = e.originalEvent.pageX,  
  41.              startY = e.originalEvent.pageY;  
  42.         });  
  43.           
  44.         $pictures.on("mousemove", function(e) {  
  45.             var X = e.originalEvent.pageX - startX;  
  46.             var Y = e.originalEvent.pageY - startY;  
  47.                
  48.             if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {  
  49.                 var cur_scroll = $(this).scrollLeft();  
  50.                 $(this).scrollLeft(parseInt(cur_scroll) - X);  
  51.                 e.preventDefault();  
  52.                 e.stopPropagation();  
  53.             }  
  54.             else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {  
  55.                 var cur_scroll = $(this).scrollLeft();  
  56.                 $(this).scrollLeft(parseInt(cur_scroll) - X);  
  57.                 e.preventDefault();  
  58.                 e.stopPropagation();  
  59.             }  
  60.             else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {  
  61.             }  
  62.             else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {  
  63.             }  
  64.             else{  
  65.             }  
  66.         });  
  67.         // do for left-right scroll  
  68.     })  
  69.     </script>  
  70. </head>  
  71.   
  72. <body id="body" ng-controller="MyController">  
  73.     
  74.     <ion-header-bar class="bar-positive">  
  75.         <h1 class="title">bar-positive</h1>  
  76.     </ion-header-bar>  
  77.     
  78.     <ion-content class="has-header" style="background-color: #ebebeb;">  
  79.       
  80.         <div class="picturesholder">  
  81.             <!--<ion-scroll direction="x">-->  
  82.                 <img ng-src="{{each}}" ng-repeat="each in pictures"></img>  
  83.             <!--</ion-scroll>-->      
  84.         </div>  
  85.           
  86.     </ion-content>  
  87.       
  88.     <ion-footer-bar class="bar-balanced">  
  89.         <div class="title">Footer</div>  
  90.     </ion-footer-bar>  
  91. </body>  
  92. </html>  
  93.   
  94.       


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约