前一篇隨筆介紹了offset*的知識,今天lizi用angular 指令寫了左右按鈕無間切換的實例,加深offset*知識的應用。
思路如下:
將容器內的內容復制一遍,采用相對父元素絕對定位的方式
紅色為復制的內容
(左箭頭)< 123456
123456 >(右箭頭)
點擊左箭頭:當圖片定位顯示為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()"><</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()">></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 ,width:_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>