利用AngularJs實(shí)現(xiàn)京東首頁輪播圖效果
先來看看效果圖

其實(shí)寫一個(gè)輪播圖還是蠻簡(jiǎn)單的,我想了兩種種方法,來實(shí)現(xiàn)輪播圖(實(shí)際上細(xì)分是5種,但是其中兩種是操作dom原生,三種是利用AngularJs的動(dòng)畫,所有歸為兩大類),等我寫出來,大家好好理解一下就好。
那我先寫一種,第一種是不使用angularjs的動(dòng)畫模塊,只使用指令來完成動(dòng)畫的切換。在這里面就是在指令里操作dom元素,超級(jí)easy。
示例代碼
<!DOCTYPE html>
<html lang="en" ng-app="lunbo">
<head>
<meta charset="UTF-8">
<script src="lib/angular.min.js" type="text/javascript"></script>
<script src="lib/angular-animate.js" type="text/javascript"></script>
<title></title>
<style>
.hidden{
display: none;
}
.active{
display: block;
}
</style>
</head>
<body ng-controller="lunboController">
<div lunbo ></div>
<script type="text/ng-template" id="lunbo.html">
<ul>
<li ng-repeat="img in images"
class="fade-in style hidden" >
<a href="{{img.href}}"><img src="{{img.src}}" alt=""/></a></li>
</ul>
</script>
</body>
<script>
var app=angular.module('lunbo',['ngAnimate']);
app.controller('lunboController',['$scope','readJSON', function ($scope,readJSON) {
}]);
app.factory('readJSON',['$http','$q', function ($http,$q) {
return {
query: function () {
var deferred=$q.defer();
$http({
method:'GET',
url:'img.json'
}).success(function (data, status, header, config) {
deferred.resolve(data);
}).error(function (data, status, header, config) {
deferred.reject(data);
});
return deferred.promise;
}
}
}]);
app.directive('lunbo',['readJSON', function (readJSON) {
return{
restrict:'EA',
templateUrl:'lunbo.html',
scope:{},
link: function (scope, element, attr) {
var promise=readJSON.query();
var step=0;
scope.flag=false;
promise.then(function (data) {
console.log(data);
scope.images=data;
});
setInterval(function () {
element.find("li").css({"display":"none","opacity":0});
step++;
step=step%5;
element.find("li").eq(step).css({"display":"block","opacity":1});
},1000)
}
}
}]);
/*app.animation('.fade-in', function () {
return{
enter: function (element, done) {
}
}
})*/
</script>
</html>
[
{
"href":"http://www.google.com",
"src":"img/5.jpg",
"alt":"5"
},
{
"href":"http://www.google.com",
"src":"img/6.jpg",
"alt":"6"
},
{
"href":"http://www.google.com",
"src":"img/7.jpg",
"alt":"7"
},
{
"href":"http://www.google.com",
"src":"img/8.jpg",
"alt":"8"
},
{
"href":"http://www.google.com",
"src":"img/9.jpg",
"alt":"9"
}
]
看指令的最后是不是很簡(jiǎn)單啊,就是通過指令的link函數(shù)中的element對(duì)象調(diào)用angularjs自身封裝的jquery函數(shù)來完成的。
另外一種是
link: function (scope, element, attr) {
var promise=readJSON.query();
var step=0;
scope.flag=false;
promise.then(function (data) {
console.log(data);
scope.images=data;
});
setInterval(function () {
element.find("li").removeclass("acitve");
step++;
step=step%5;
element.find("li").eq(step).addclass("active");
},1000)
}
}
如果要過渡效果,可以在acive類中加入css3的過渡動(dòng)畫。
這里面是用$http和$q來實(shí)現(xiàn)了一個(gè)延遲異步拉取數(shù)據(jù),通過這樣組合函數(shù)可以使函數(shù)功能更加健壯,也更方便監(jiān)控函數(shù)。我以后會(huì)花時(shí)間專門來解釋angularjs的$q和jquery的$Deferred的內(nèi)容,其實(shí)原理差不多,都實(shí)現(xiàn)了promise操作。
用JavaScript的實(shí)現(xiàn)方法的難點(diǎn),在于如何實(shí)現(xiàn)元素的增加和減少,這樣才能觸發(fā)AngularJs的動(dòng)畫效果。這次寫了一個(gè),但是在開始運(yùn)行的時(shí)候有個(gè)小瑕疵,就是小按鈕的步長一定要加上1,才和照片同步。不知道怎么造成的,以后再來填坑,如有不妥的地方,歡迎指出。
還有一種寫法,我不太推薦,雖然很好寫,我把思路大概說一下,就是建立一個(gè)數(shù)組,用來存放圖片的src等信息,每次從里面取出一個(gè),用雙向綁定到img的src上,當(dāng)下現(xiàn)讀取img,當(dāng)?shù)较乱粋€(gè)的時(shí)候,把img的src清空,并且賦值下一個(gè)。以此循環(huán),這樣雖然也可以做到輪播,但是這樣極大的增加了http請(qǐng)求數(shù)量,在網(wǎng)速低的情況下,體驗(yàn)很不好,我不推薦。
所有我很推薦我這種寫法,雖然啰嗦點(diǎn),但是體驗(yàn)好啊。
<!DOCTYPE html>
<html lang="en" ng-app="lunbo">
<head>
<meta charset="UTF-8">
<script src="lib/angular.min.js" type="text/javascript"></script>
<script src="lib/angular-animate.js" type="text/javascript"></script>
<title></title>
<style>
*{
padding: 0px;
margin: 0px;
}
div {
position: relative;
}
div ul {
position: absolute;
}
div ul li {
list-style-type: none;
position: absolute;
}
div ul li a img {
display: block;
width: 730px;
height: 454px;
}
div ul.listContent{
position: absolute;
left: 500px;
top: 410px;
width: 200px;
height: 25px;
}
div ul.listContent li.list{
position: relative;
display: block;
width: 25px;
height: 25px;
float: left;
margin: 0 5px;
border: 1px solid blue;
text-align: center;
line-height: 25px;
cursor: pointer;
}
.active{
background: #161616;
color: #ffffff;
}
</style>
</head>
<body ng-controller="lunboController">
<div lunbo ></div>
<script type="text/ng-template" id="lunbo.html">
<div ng-mouseleave="start()">
<ul ng-switch="pic">
<li ng-switch-when="0" class="fade-in "><a href="{{img1.href}}"><img src="{{img1.src}}" alt=""/></a></li>
<li ng-switch-when="1" class="fade-in "><a href="{{img2.href}}"><img src="{{img2.src}}" alt=""/></a></li>
<li ng-switch-when="2" class="fade-in "><a href="{{img3.href}}"><img src="{{img3.src}}" alt=""/></a></li>
<li ng-switch-when="3" class="fade-in "><a href="{{img4.href}}"><img src="{{img4.src}}" alt=""/></a></li>
<li ng-switch-when="4" class="fade-in "><a href="{{img5.href}}"><img src="{{img5.src}}" alt=""/></a></li>
</ul>
<ul class="listContent" >
<li class="list" ng-click="clickEvent(0)" >1</li>
<li class="list" ng-click="clickEvent(1)" >2</li>
<li class="list" ng-click="clickEvent(2)" >3</li>
<li class="list" ng-click="clickEvent(3)" >4</li>
<li class="list" ng-click="clickEvent(4)" >5</li>
</ul>
</div>
</script>
</body>
<script>
var app=angular.module('lunbo',['ngAnimate']);
app.controller('lunboController',['$scope','readJSON','mouseEvent' ,function ($scope,readJSON,mouseEvent) {
}]);
app.factory('readJSON',['$http','$q', function ($http,$q) {
return {
query: function (){
var deferred=$q.defer();
$http({
method:'GET',
url:'img.json'
}).success(function (data, status, header, config) {
deferred.resolve(data);
}).error(function (data, status, header, config) {
deferred.reject(data);
});
return deferred.promise;
}
}
}]);
/*這個(gè)服務(wù)有問題,需改進(jìn),暫時(shí)沒想到解決辦法*/
app.factory('mouseEvent', function () {
return{
mouseevent: function (ele1,ele2 ,event, done) {
}
}
});
app.directive('lunbo',['readJSON','$timeout','mouseEvent' ,function (readJSON,$timeout,mouseEvent) {
return{
restrict:'EA',
templateUrl:'lunbo.html',
scope:{},
link: function (scope, element, attr) {
var promise=readJSON.query();
var step=0;
var time=null;
promise.then(function (data) {
scope.img1=data[0];
scope.img2=data[1];
scope.img3=data[2];
scope.img4=data[3];
scope.img5=data[4];
});
var stepFun= function () {
element.find("li").removeClass("active");
element.find("li").eq(step+1).addClass("active");
scope.pic=step;
step++;
step=step%5;
time=$timeout(function () {
stepFun();
},5000);
};
stepFun();
/*點(diǎn)擊事件*/
scope.clickEvent= function (number) {
scope.pic=number;
element.find("li").removeClass("active");
element.find("li").eq(number+1).addClass("active");
$timeout.cancel(time);
step=number;
};
/*鼠標(biāo)移除動(dòng)畫重新開始*/
scope.start= function () {
$timeout.cancel(time);
stepFun();
}
}
}
}]);
app.animation('.fade-in', function () {
return{
enter: function (element, done) {
var step=0;
var time=null;//計(jì)時(shí)器
var animationFunc= function () {
step+=20;
if(step>100){
done();
clearInterval(time);
}else{
element.css("opacity",step/100);
}
};
element.css("opacity",0);
time=setInterval(animationFunc,50);
},
leave: function (element,done) {
var step=100;
var time=null;
var animationFun= function () {
step-=20;
if(step<0){
done();
clearInterval(time);
}else{
element.css("opacity",step/100)
}
};
element.css("opacity",1);
time=setInterval(animationFun,40);
}
}
})
</script>
</html>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)和工作能有一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
詳解如何在Angular優(yōu)雅編寫HTTP請(qǐng)求
這篇文章主要介紹了詳解如何在Angular優(yōu)雅編寫HTTP請(qǐng)求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
快速解決angularJS中用post方法時(shí)后臺(tái)拿不到值的問題
今天小編就為大家分享一篇快速解決angularJS中用post方法時(shí)后臺(tái)拿不到值的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
AngularJS解決ng界面長表達(dá)式(ui-set)的方法分析
Angular2使用Angular CLI快速搭建工程(一)
Angular中ng-options下拉數(shù)據(jù)默認(rèn)值的設(shè)定方法
詳解Angular4中路由Router類的跳轉(zhuǎn)navigate
AngularJS教程之MVC體系結(jié)構(gòu)詳解

