zoukankan      html  css  js  c++  java
  • 左右无间切换走马灯angularJS指令

    前一篇随笔介绍了offset*的知识,今天lizi用angular 指令写了左右按钮无间切换的实例,加深offset*知识的应用。
    思路如下
    将容器内的内容复制一遍,采用相对父元素绝对定位的方式
    红色为复制的内容
     
    (左箭头)<         123456123456           >(右箭头)
     
      点击左箭头:当图片定位显示为1时,让她定位到6
      点击右箭头:当图片定位显示为6时,就让它回到1
    用angularJS写指令的时候,有很多坑是想象不到了,例如一些jqlite方法是用不了的,还有指令的格式,下一篇小编为大家详细讲解(其实自己也是小白,吊儿郎当地学习中。。)
    效果如下:
    css代码如下:
    <style>
            *{margin: 0px;padding: 0px}
           .roll-wrap{ width: 1000px;height: 300px;margin: 0px auto;background: pink }
           .roll-arrow-left,.roll-arrow-right{display: inline-block;float: left;width: 50px;margin-top: 100px;font-size: 20px;color: white;font-weight: 500;line-height: 100px;text-align: center;cursor: pointer;
               height: 100px;background: rgba(0,0,0,0.4);} 
               .roll-arrow-left{margin-right: 10px;vertical-align: middle;}
               .roll-arrow-right{margin-left: 10px;}
           .roll-center{float: left;width: 830px;height: 300px;overflow: hidden;position: relative;transition:scrollLeft 0.5s;}
           .roll-center-u{width: 100%;height: 300px;list-style: none;margin: 0px;padding: 0px;margin-top: 50px;position: absolute;}
           .roll-center-u li{display: inline-block;width: 200px;height: 200px;float: left;margin-right: 10px}
           .roll-center ul li img{width:200px;height: 200px;}
           .roll-center ul li img:hover{cursor: pointer;}
        </style>

    html代码:

    给html便签上加上ng-app指令: ng-app="myApp"

    给body标签上加ng-controller指令:ng-controller="rollController"

       <!--这里是调用该指令-->

       <my-roller img-data="imgList" ></my-roller>

    js代码如下

    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
        <script >
            (function(angular) {
                var app = angular.module('myApp',[]);
                 app.controller("rollController",["$scope",function($scope){
           //    数据复制了1份,
                      $scope.imgList=[
                          {url:"images/1.jpg"},
                          {url:"images/2.jpg"},
                          {url:"images/3.jpg"},
                          {url:"images/4.jpg"},
                          {url:"images/5.jpg"},
                          {url:"images/6.jpg"},
                          {url:"images/7.jpg"},
                          {url:"images/8.jpg"},
                          {url:"images/9.jpg"},
                          {url:"images/10.jpg"},
                          {url:"images/1.jpg"},
                          {url:"images/2.jpg"},
                          {url:"images/3.jpg"},
                          {url:"images/4.jpg"},
                          {url:"images/5.jpg"},
                          {url:"images/6.jpg"},
                          {url:"images/7.jpg"},
                          {url:"images/8.jpg"},
                          {url:"images/9.jpg"},
                          {url:"images/10.jpg"}
                      ]
                 }]
    
                 );
                app.directive("myRoller",function(){
                    return{
                        restrict:"AE",
                        scope:{
                            imgData:'=' //=数据 &函数 @字符
    
                        },
                        template:
                        '<div class="roll-wrap">' +
                            '<span class="roll-arrow-left" id="roll-arrow-left" ng-click="arrLeftClick()">&lt;</span>' +
                            '<div class="roll-center" id="roll-center"> ' +
                             '<ul class="roll-center-u"  > ' +
                                '<li ng-repeat="cell in imgData "><img ng-src="{{cell.url}}" alt=""/></li>'+
    
                              '</ul>' +
                             '</div> ' +
                             '<span class="roll-arrow-right" id="roll-arrow-right" ng-click="arrRightClick()">&gt;</span> ' +
                        '</div>',
    
                        replace:true,
                        link:function(scope,elem,attrs){
    
                            //这里面有很多坑,有一些jqLite方法用不了
                            console.log(elem.find('ul').eq(0));
                            var rollUl = elem.find('ul').eq(0);
                            //210这个数字是  每张图片的宽度(200)+margin-right(10)的值
                            rollUl.css("width",scope.imgData.length * 210 +"px");
                            //每次切换,只切换2张图片的宽度,可以自己定义iSpeed的值
                            scope.iSpeed = -420;
    
                            function offset(elm) {
                                var rawDom = elm[0];
                                var _x = 0;
                                var _y = 0;
                                var _w = 0;
                                // var body = document.documentElement || document.body;
                                // var scrollX = window.pageXOffset || body.scrollLeft;
                                // var scrollY = window.pageYOffset || body.scrollTop;
                                _x = rawDom.offsetLeft ;
                                _y = rawDom.offsetTop ;
                                _w = rawDom.offsetWidth;
                                return { left: _x, top: _y ,_w};
                            }
                            //当点击左箭头
                            scope.arrLeftClick =function(){
                                scope.iSpeed =420;
                                //console.log(offset(rollUl).left);
                                rollUl.css("left",offset(rollUl).left+scope.iSpeed+"px");
                                //当在第一张是,让它回到最后一张
                                if(offset(rollUl).left >=0){
                                    rollUl.css("left",-offset(rollUl).width/2+'px');
                                }
                             };
                            //点击右箭头
                            scope.arrRightClick = function(){
                                scope.iSpeed = -420;
                                rollUl.css("left",offset(rollUl).left+scope.iSpeed+'px');
                                //当走到最后一张时,让它回到头部
                                if(offset(rollUl).left<-offset(rollUl).width/2) {
                                     rollUl.css("left","0px");
                                    //由于点击一下按钮,仅切换2张图片,可以自定义iSpeed的值,决定切换几张图片,iSpeed的值在
                                    rollUl.css("left",offset(rollUl).left+scope.iSpeed+'px');
    
                                    //当到达第一张时,我让它回到最后一张
                                } else if(offset(rollUl).left>=0) {
    
                                    rollUl.css("left",-offset(rollUl).width/2+'px');
    
                                }
                            }
    
                        }
    
                    }
    
                })
    
            })(window.angular)
    
        </script>

      * 在指令中的link中我想要获取 rollUl的offsetLeft,无论取都是undefined,后来参考了网上一位网友的方法,在他的基础上小修改了一下,他是这样写的:

         http://siongui.github.io/2013/05/12/angularjs-get-element-offset-position/

    function offset(elm) {
      try {return elm.offset();} catch(e) {}
      var rawDom = elm[0];
      var _x = 0;
      var _y = 0;
      var body = document.documentElement || document.body;
      var scrollX = window.pageXOffset || body.scrollLeft;
      var scrollY = window.pageYOffset || body.scrollTop;
      _x = rawDom.getBoundingClientRect().left + scrollX;
      _y = rawDom.getBoundingClientRect().top + scrollY;
      return { left: _x, top: _y };}

      今天先把无间滚动的示例写到这里,但是并没有结束,lizi还会继续往下写的!

      如果你不想用指令写,要原生的无间切换,lizi把它po下面了

    
    	<div class="roll-wrap">
    	 	 <span class="roll-arrow-left" id="roll-arrow-left"><</span>
    	 	 <div class="roll-center" id="roll-center">
    		 	 <ul class="roll-center-u">
    		 	 	<li><img src="images/1.jpg" alt=""></li>
    		 	 	<li><img src="images/2.jpg" alt=""></li>
    		 	 	<li><img src="images/3.jpg" alt=""></li>
    		 	 	<li><img src="images/4.jpg" alt=""></li>
    		 	 	<li><img src="images/5.jpg" alt=""></li>
    		 	 	<li><img src="images/6.jpg" alt=""></li>
    		 	 	<li><img src="images/7.jpg" alt=""></li>
    		 	 	<li><img src="images/8.jpg" alt=""></li>
    		 	 	<li><img src="images/9.jpg" alt=""></li>
    		 	 	<li><img src="images/10.jpg" alt=""></li>
    		 	 </ul>
    	 	 </div>
    	 	 <span class="roll-arrow-right" id='roll-arrow-right'>></span>
    	 </div>
    
    	 <script>
             window.onload = function(){
    
    				var oCon = document.getElementById('roll-center');
    
    				var oUl = oCon.getElementsByTagName('ul')[0];
    
    				var aLi = oUl.getElementsByTagName('li');
    
    				var arrLeft =document.getElementById('roll-arrow-left');
    				var arrRight =document.getElementById('roll-arrow-right');
    
    				var iSpeed = -420;
    
    			  oUl.innerHTML += oUl.innerHTML;
    
    	           oUl.style.width = aLi.length* 210 +'px'; 
    
    	          arrRight.onclick= function() {
                       iSpeed = -420;
                       oUl.style.left = oUl.offsetLeft+iSpeed+'px';
    	               if(oUl.offsetLeft<-oUl.offsetWidth/2) {
    
    					oUl.style.left = '0px';
    					oUl.style.left = oUl.offsetLeft+iSpeed+'px';
    	             
    
    					} else if(oUl.offsetLeft>=0) {
    		                 
    						oUl.style.left = -oUl.offsetWidth/2+'px';
                            
    					}    
    	          }; 
    	          arrLeft.onclick = function(){
    	          	   iSpeed =420;
    	          	   oUl.style.left = oUl.offsetLeft+iSpeed+'px';
                           if(oUl.offsetLeft >=0){
    		  			 oUl.style.left = -oUl.offsetWidth/2+'px';
    				 }
    
    
    	          }  
             }
    
    
    	 </script>
    
    

      

    Live and learn ;)
  • 相关阅读:
    查询表中字段相同的记录的sql
    c++ builder调用htmlencode
    win7 64位下使用regsvr32注册activex dll
    在sql 2005里创建一个和sa一样权限的账号
    c++ builder 使用indy http调用webservice方法
    sql 2005创建只读帐号的另一种方法
    C#如何用Graphics画出一幅图表
    C#中字符串的处理
    SQL语句快速介绍
    C#如何开发扫雷游戏
  • 原文地址:https://www.cnblogs.com/lizimeme/p/6506079.html
Copyright © 2011-2022 走看看