实现一个类似百度图片切换播放的例子
- 示例
- javascript dom操作
- javascropt事件
- javascript作用域闭包
功能:
- 有大图和缩略图
- 有上一张图和下一张图切换
- 可以键盘控制显示上一张图和下一张图
- 有显示上一组和下一组的功能
效果预览:
可以类似目前的百度图片中的效果
基本HTML结构和CSS代码:
html:
<body>
<h1>图片展示</h1>
<div id="pics">
<div id="bigpic">
<span id="big-prev"></span>
<img src="image/000.jpg" width="650" height="400">
<span id="big-next"></span>
</div>
<div id="smallPics">
<span id="li-prev"></span>
<ul id="smallPicsList"></ul>
<span id="li-next"></span>
</div>
</div>
<script type="text/javascript" src="demo2.js"></script>
</body>
主要css代码:
#big-prev {
background: url("big-prev.png");
display: inline-block;
width: 60px;
height: 120px;
cursor: pointer;
float: left;
margin-top: 120px;
}
#li-prev {
background: url("icon_prve.jpg");
display: inline-block;
height:40px;
width:20px;
display: inline-block;
float: left;
cursor:pointer;
}
效果:
下面是主要的js代码:
首先要将图片按照分组显示在下边的列表里。
var eg = new Object();
//定义图片数据
eg.$ = function(id){
return document.getElementById(id);
};
eg.data = ["000.jpg","001.jpg","002.jpg","003.jpg","004.jpg",
"005.jpg","006.jpg","007.jpg"];
eg.showNum = 0; //默认显示
eg.groupNum = 1; //当前组数
eg.groupSize = 5; //每组图片数
eg.showSmall = function(group){
var ul = eg.$("smallPicsList");
//每次显示前清空旧的数据
ul.innerHTML = '';
var start = (group-1)*eg.groupSize;
var end = group*eg.groupSize;
for (var i = start;(i<end&&i<eg.data.length); i++) {
var li = document.createElement("li");
li.innerHTML = '<img src="image/'+eg.data[i]+'" id="small'+i+'"width="135" height="100"/>';
ul.appendChild(li);
};
};
eg.init = function(){
eg.showSmall(1);
};
eg.init();
效果:
接下来要实现点击图片的响应。
要在每次生成缩略图片的时候就添加监听器,来监听点击的动作。
for (var i = start;(i<end&&i<eg.data.length); i++) {
var li = document.createElement("li");
li.innerHTML = '<img src="image/'+eg.data[i]+'" id="small'+i+'"width="135" height="100"/>';
(function(i){
eg.addListener(li,"click", function(){
eg.showNum = i;
eg.showBig();
//console.log(i);
});
})(i);
ul.appendChild(li);}
这里用到了IIFE(立即执行函数表达式),创建了闭包。关于更多javascript作用域闭包的内容,会在后面的文章中介绍点我。
然后实现点击上(下)一张(组)图按钮,要注意边界图片时缩略图和大图的变化。
eg.prevBig = function(){
//console.log(eg.showNum);
if (eg.showNum-1>=0) {
if ((eg.showNum)%eg.groupSize ==0) {
eg.showSmall(eg.groupNum-1);
eg.groupNum--;
};
eg.showNum--;
eg.showBig();
}else{
alert("已经是第一张了!");
}
};
eg.prevsmall = function(){
console.log(eg.groupNum);
if(eg.groupNum -1 >=1){
eg.showSmall(eg.groupNum-1);
eg.groupNum--;
eg.showNum = eg.groupNum*eg.groupSize-eg.groupSize;
eg.showBig();
}
};
eg.addListener(eg.$("big-prev"),"click",function(){
eg.prevBig();
});
eg.addListener(eg.$("li-prev"),"click",function(){
eg.prevsmall();
});
至此,基本功能已经实现,还有键盘动作。
eg.addListener(document,"keyup",function(e){
e = e||event;
if (e.keyCode == 37) {eg.prevBig();};
if (e.keyCode == 39) {eg.nextBig();};
});